FlutterBleLib icon indicating copy to clipboard operation
FlutterBleLib copied to clipboard

Scanning for devices

Open ahoelzemann opened this issue 4 years ago • 1 comments

Hello everyone,

I wrote the following method to scan for nearby bluetooth devices and connect to an earlier saved device.

  Future<dynamic> start_ble_scan() async {
    Completer completer = new Completer();

    if (_mydevice != null) {
      bool connected = await _mydevice.isConnected();
      print("DeviceState: " + connected.toString());
      if (connected) {
        try {
          await _responseSubscription?.cancel();
          await _characSubscription?.cancel();
          await _condeviceStateSubscription?.cancel();
          await _mydevice.disconnectOrCancelConnection();
          _mydevice = null;
          _currentDeviceConnected = false;
        } catch (e) {
          print("Disconnecting device before new scan process");
        }
      }
    }

    SharedPreferences prefs = await SharedPreferences.getInstance();
    String savedDevice = prefs.getString("Devicename");
    String savedIdentifier = prefs.getString("macnum");
    bool alreadyStoppedScanning = false;

    _bleonSubscription = _activateBleManager
        .startPeripheralScan()
        .timeout(Duration(seconds: 30), onTimeout: (timeout) async {
      if (!alreadyStoppedScanning) {
        await _activateBleManager.stopPeripheralScan();
      }
    }).listen(
      (data) async {
        if ((data.peripheral.name == savedDevice) ||
            (data.peripheral.identifier == savedIdentifier)) {
          if (!alreadyStoppedScanning) {
            alreadyStoppedScanning = true;
            _mydevice = data.peripheral;
            print("Device found: " + _mydevice.toString());
            await _activateBleManager.stopPeripheralScan();
            _bleonSubscription?.cancel();
          } 

        }
      },
      onError: (err) {
        print('Error!: $err');
      },
      cancelOnError: true,
      onDone: () async {
        print("Device found: " + _mydevice.toString());
        completer.complete(true);
      },
    );
    return completer.future;
  }

however, this method doesn't always returns the desired result. Sometimes I jump directly into the timeout which stops the scan immediately and does not connect my device.

Someone has an idea what I'm doing wrong?

thanks and best regards!

ahoelzemann avatar May 06 '21 23:05 ahoelzemann

Please create a test project and implement the breaking code. I would try to only show an example of this with FlutterBleLib and no other packages / noisy code.

You have two places where you stop the scan and one place where you disconnect/cancel connections.

bretmh avatar May 08 '21 00:05 bretmh