Reactive_flutter_BLE — приложение находит устройство, но не может подключиться (и прочитать данные BLE)

Первый код, который компилируется, но не работает должным образом:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:location_permissions/location_permissions.dart';


class BluetoothConnectionScreen extends StatefulWidget {
  const BluetoothConnectionScreen({super.key});

  @override
  State<BluetoothConnectionScreen> createState() => _BluetoothConnectionScreenState();
}

class _BluetoothConnectionScreenState extends State<BluetoothConnectionScreen> {

  final flutterReactiveBle = FlutterReactiveBle();

  late DiscoveredDevice _myDevice;

  late StreamSubscription<DiscoveredDevice> _scanStream;
  late QualifiedCharacteristic _rxCharacteristic;

  final Uuid serviceUuid = Uuid.parse("4fafc201-1fb5-459e-8fcc-c5c9c331914b");
  final Uuid characteristicUuid = Uuid.parse("beb5483e-36e1-4688-b7f5-ea07361b26a8");

  late List<int> _infoCharacteristics;

  bool _foundDeviceWaitingToConnect = false;
  bool _scanStarted = false;
  bool _connected = false;

  void _startScan() async {
    bool permGranted = false;
    setState(() {
      _scanStarted = true;
    });

    PermissionStatus permission;
    permission = await LocationPermissions().requestPermissions();
    if (permission == PermissionStatus.granted) permGranted = true;

    if (permGranted) {
      _scanStream = flutterReactiveBle
          .scanForDevices(withServices: [serviceUuid]).listen((device) {
        if (device.name.startsWith("L")) {
          setState(() {
            _myDevice = device;
            _foundDeviceWaitingToConnect = true;
          });
        }
      });
    }
  }

  void _connectToDevice() {

    _scanStream.cancel();

    Stream<ConnectionStateUpdate> _currentConnectionStream = flutterReactiveBle
        .connectToAdvertisingDevice(
        id: _myDevice.id,
        prescanDuration: const Duration(seconds: 5),
        withServices: [serviceUuid, characteristicUuid]);
    _currentConnectionStream.listen((event) {
      switch (event.connectionState) {
        case DeviceConnectionState.connected:
          {
            _rxCharacteristic = QualifiedCharacteristic(
                serviceId: serviceUuid,
                characteristicId: characteristicUuid,
                deviceId: event.deviceId);
            setState(() {
              _foundDeviceWaitingToConnect = false;
              _connected = true;
            });
            break;
          }

        case DeviceConnectionState.disconnected:
          {
            setState(() {
              _foundDeviceWaitingToConnect = true;
              _connected = false;
            });
            break;
          }
        default:
      }
    });
  }

  void _readFromDevice() async
  {
    if (_connected) {
    setState(() async {
      _infoCharacteristics.addAll(await flutterReactiveBle.readCharacteristic(_rxCharacteristic));
    });
    }
  }

  @override
  Widget build(BuildContext context) {

    _infoCharacteristics.addAll([1,2,3]);

    return Scaffold(
        appBar: AppBar(
        title: const Text("BLE"),
    ),
    body: SafeArea(child:
    Center(child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Text("Started scan: $_scanStarted"),
      ElevatedButton.icon(
        icon: const Icon(
          Icons.bluetooth,
          color: Colors.yellow,
          size: 24.0,
        ),
        onPressed: () => _startScan(),
        label: const Text("Find and pair BLE device"),
        style: ElevatedButton.styleFrom(
          alignment: Alignment.centerLeft,
          fixedSize: const Size(
            290,
            32,
          ),
        ),
      ),
      Text("Device found? $_foundDeviceWaitingToConnect"),
      Text("Scan started? $_scanStarted"),
      Text("Connected? $_connected"),
      _connected ? Text("OK! Device name: ${_myDevice.id.toString()}") : Text("Device not connected!"),
      ElevatedButton.icon(
        icon: const Icon(
          Icons.bluetooth,
          color: Colors.yellow,
          size: 24.0,
        ),
        onPressed: () => _connectToDevice,
        label: const Text("Connect to BLE device"),
        style: ElevatedButton.styleFrom(
          alignment: Alignment.centerLeft,
          fixedSize: const Size(
            290,
            32,
          ),
        ),
      ),
        ElevatedButton.icon(
          icon: const Icon(
            Icons.bluetooth,
            color: Colors.yellow,
            size: 24.0,
          ),
          onPressed: () => _readFromDevice,
          label: const Text("Read information"),
          style: ElevatedButton.styleFrom(
            alignment: Alignment.centerLeft,
            fixedSize: const Size(
              290,
              32,
            ),
          ),
        ),
        _connected ? Text("OK ! $_infoCharacteristics") : Text("Device not connected!"),
    ],

    ))));
  }
}


Мое приложение Flutter компилируется, но не работает должным образом. Устройство находит по UUID, но подключиться к нему не может. Не знаю почему. Наконец, я хочу прочитать характеристики с моего устройства (текст, представленный строками). Любые советы приветствуются!. Спасибо.

Я добавил все необходимые разрешения приложения (в файл манифеста Android), и это приложение предоставило все необходимые разрешения в ОС Android 11. Конечно, я протестировал его на реальном устройстве, мобильном телефоне.

Что я должен делать?


Журналы LOGCAT:

2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:38:12)[ 0м

2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 _BluetoothConnectionScreenState.build. (пакет: my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:128:26)[0m

2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м

2023-04-28 22:15:17.785 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Начато сканирование устройства[0m

2023-04-28 22:15:17.785 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:49:14)[ 0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 [0m

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Разрешение предоставлено[0m 2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:61:12)[ 0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 [0m

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Устройство найдено: false[0m

2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м

2023-04-28 22:15:17.799 10350-16177 BluetoothAdapter com.example.my_app D isLeEnabled(): ON

2023-04-28 22:15:17.810 10350-16177 BluetoothAdapter com.example.my_app D isLeEnabled(): ON

2023-04-28 22:15:17.812 10350-16191 BluetoothLeScanner com.example.my_app D onScannerRegistered() — статус = 0 ScannerId = 10 mScannerId = 0

2023-04-28 22:15:17.815 2029-7327 AppOps pid-2029 E Неверный вызов, сделанный uid 1002. Пакет «com.example.my_app» не принадлежит uid 1002.

Используя код @rrttrr (метод ниже), я получил журналы:

W/FinalizerDaemon (15204): тип = 1400 аудит (0.0: 2118): avc: запрещено { getopt } для пути = "/dev/socket/usap_pool_primary" scontext = u: r: untrusted_app: s0: c223, c256, c512, c768 tcontext=u:r:zygote:s0 tclass=unix_stream_socket permissive=0 app=com.example.my_app

D/BluetoothGatt(15204): connect() – устройство: 54:43:B2:46:84:F6, авто: ложь, eattSupport: ложь

D/BluetoothGatt(15204): registerApp()

D/BluetoothGatt(15204): registerApp() – UUID=0243bb19-1462-46bb-a2ab-e636e81b812f

I/flutter (15204): состояние подключения BLE: DeviceConnectionState.connecting

I/flutter (15204): состояние подключения BLE: DeviceConnectionState.connecting

I/flutter (15204): состояние подключения BLE: DeviceConnectionState.disconnected

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать это:

  1. Подтвердите это вы можете подключиться к своему BLE-устройству с помощью стороннего приложения как nRF Connect. Убедитесь, что используемые вами UUID для подключения являются правильными и что устройство является рекламным и обнаруживаемый.

  2. Если у вас возникли проблемы с connectToAdvertisingDevice, попробуйте использовать connectToDevice вместо этого. connectToAdvertisingDevice работает только тогда, когда устройство BLE является рекламным. connectToDevice постараюсь подключаться к устройству независимо от того, рекламное оно или нет.

  3. Следите за журналами, пока тестируете свое приложение. Иногда, устройство BLE может отключиться вскоре после подключения. Если вы заметили, что устройство отключилось, попробуйте повторное подключение. Возможно, вам потребуется реализовать некоторую логику в вашем приложении. для автоматического повторного подключения в случае отключения.

Вы можете попробовать подключиться напрямую, используя приведенный ниже метод, чтобы проверить, работает ли он. Он напечатает состояние соединения и ошибку, если таковая имеется.

  final flutterReactiveBle = FlutterReactiveBle();
  StreamSubscription<ConnectionStateUpdate>? deviceConnection;

  void connectToBleDevice() async {
    await deviceConnection?.cancel();
    await Future.delayed(const Duration(milliseconds: 500));
    deviceConnection = flutterReactiveBle
        .connectToDevice(
      id: DEVICE_MAC_ID,
      servicesWithCharacteristicsToDiscover: {
        Uuid.parse(SERVICE_UUID): [
          Uuid.parse(CHAR_UUID_1),
          Uuid.parse(CHAR_UUID_2),
        ]
      },
      connectionTimeout: const Duration(seconds: 5),
    )
        .listen((connectionState) async {
      debugPrint("BLE connection state: " +
          connectionState.connectionState.toString());
    }, onError: (dynamic error) async {
      debugPrint("BLE connection error: ${error.toString()}");
    });
  }

Я попробую все Ваши советы и вернусь сюда как можно скорее. Спасибо.

PrertoQuebas 28.04.2023 19:45

1) Уже проверил, с nRF устройство работает нормально. Я умею читать характеристики. 2) Пробовал - не помогло. 3) Надо попробовать, но если честно не умею читать логи на реальном устройстве. Должен ли я подключать его к Android Studio через кабель??

PrertoQuebas 28.04.2023 19:56

Вы также можете попробовать подключиться напрямую, используя UUID устройства, полученный от nRF Connect, чтобы проверить, можете ли вы подключиться таким образом. 3) Да, подключитесь к физическому устройству и установите приложение через IDE.

rrttrr 28.04.2023 20:10

Я знаю точный UUID устройства и службы. Мне удалось использовать телефон через кабель. Я обновляю свой пост с помощью журналов logcat...

PrertoQuebas 28.04.2023 20:37

Я разместил метод, вы можете попробовать подключиться с его помощью и проверить журналы.

rrttrr 28.04.2023 22:26

Кроме того, посмотрите на вкладку «Выполнить» для журналов.

rrttrr 28.04.2023 22:34

Я использовал предоставленный код. Спасибо за время и усилия! Я отредактировал сообщение и поместил логи, которые я получил.

PrertoQuebas 28.04.2023 23:03

Давайте продолжим обсуждение в чате.

rrttrr 28.04.2023 23:06

Другие вопросы по теме