Невозможно использовать плагин flutter_reactive_ble внутри Workmanager

Недавно я пытаюсь подключить свое приложение Flutter к устройству Arduino через BLE. Я использую плагин flutter_reactive_ble для обработки BLE-соединения и использую плагин workmanager для обработки периодической задачи в фоновом режиме. Ставлю BLE сканирование и соединение в диспетчере обратного вызова. После инициализации FlutterReactiveBle в диспетчере обратного вызова я могу получить обновленный статус BLE. Статус неизвестен.

Однако остальная часть кода BLE, похоже, не работает, потому что ни один из операторов печати не выполняется в блоке. Кажется, что workmanager прогоняет коды, не дожидаясь, пока функции просканируют и подключатся. Как я могу исправить эту проблему? Я застрял на несколько дней.

      void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) async {
    switch (task) {
      case simplePeriodicTask:

        Uuid serviceID = Uuid.parse('1101');
        Uuid characteristicsID = Uuid.parse('2101');

        final FlutterReactiveBle _ble = FlutterReactiveBle();
        StreamSubscription? _subscription;
        StreamSubscription<ConnectionStateUpdate>? _connection;

        void _disconnect() async {
          if (_subscription != null) {
            _subscription!.cancel();
          }
        }

        Future<void> _connectBLE() async {
          print(_ble.status);
          _subscription = _ble.scanForDevices(
              withServices: [serviceID],
              scanMode: ScanMode.lowLatency,
              requireLocationServicesEnabled: false).listen((device) {
            print(device.name);
            if (device.name == 'PersonDetection') {
              print('PersonDetection found!');
              _connection = _ble
                  .connectToDevice(
                id: device.id,
                connectionTimeout: const Duration(seconds: 5),
              )
                  .listen((connectionState) async {
                // Handle connection state updates
                print(device.name);
                print(device.id);
                print('connection state:');
                print(connectionState.connectionState);
                if (connectionState.connectionState ==
                    DeviceConnectionState.connected) {
                  final characteristic = QualifiedCharacteristic(
                      serviceId: serviceID,
                      characteristicId: characteristicsID,
                      deviceId: device.id);
                  final response = await _ble.readCharacteristic(characteristic);
                  print(response);
                  _disconnect();
                  print('disconnected');
                }
              }, onError: (dynamic error) {
                // Handle a possible error
                print(error.toString());
              });
            }
          }, onError: (error) {
            print('error!');
            print(error.toString());
          });
        }
        _connectBLE();
        break;
    }
    return Future.value(true);
  });
}

0 ответов

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