flutter 藍牙ble(blue tooth),同時連接多臺/多個設(shè)備

寫這篇文章的初衷

上一篇文章介紹了如何開發(fā)一個藍牙app,(http://www.itdecent.cn/p/969871112806),
但局限于只能連接一臺藍牙設(shè)備,想同時連接著多臺藍牙設(shè)備,就沒法實現(xiàn)

于是就有了寫作本文的動力,-------->解決同時連接多臺藍牙設(shè)備!!!

選擇第三方庫

flutter_blue 適合于單臺的藍牙設(shè)備,使用起來簡單
flutter_reactive_ble 適合于單臺的藍牙設(shè)備,多臺藍牙設(shè)備也可以用
flutter_ble_lib 適合于單臺的藍牙設(shè)備,多臺藍牙設(shè)備也可以用,可以在模擬器上進行調(diào)試藍牙

感覺后2個第三方庫都可以使用,本人先入為主使用了flutter_reactive_ble,所以本文以flutter_reactive_ble為基礎(chǔ)進行介紹

先聲明4個全局變量,后面會用到

  StreamSubscription<DiscoveredDevice>? _streamSubscription;
  StreamSubscription<ConnectionStateUpdate>? _connectionStreamSubscription;
  final flutterReactiveBle = FlutterReactiveBle();
  List<DiscoveredDevice> deviceList = [];

開始掃描

 _streamSubscription = flutterReactiveBle.scanForDevices(
        withServices: [Uuid.parse("0000fff0-0000-1000-XXXX-XXXXXXXXXXX")],
        scanMode: ScanMode.lowLatency).listen((device) {
      //code for handling results,返回的是可以掃描到的設(shè)備
      deviceList.add(device);
    }, onError: (e) {
      print("onError = $e");
    });

如果掃描過程,不使用過濾條件,withServices這個參數(shù)可以給個空數(shù)組

 _streamSubscription = flutterReactiveBle.scanForDevices(
        withServices: [],
        scanMode: ScanMode.lowLatency).listen((device) {
      //code for handling results,返回的是可以掃描到的設(shè)備
    deviceList.add(device);
    }, onError: (e) {
      print("onError = $e");
    });

停止掃描如下

_streamSubscription?.cancel();

連接設(shè)備

    for (int i = 0; i < deviceList.length; i++) {
      DiscoveredDevice device = deviceList[i];
      _connectionStreamSubscription = flutterReactiveBle
          .connectToDevice(
        id: device.id,
        servicesWithCharacteristicsToDiscover: {
          // Uuid.parse("fff0"): [
          //   Uuid.parse("fff1"),
          //   Uuid.parse("fff2"),
          //   Uuid.parse("fff3"),
          //   Uuid.parse("fff4"),
          //   Uuid.parse("fff5")
          // ]
        },
        connectionTimeout: const Duration(seconds: 3),
      )
          .listen((connectionState) {
        if (connectionState.connectionState ==
            DeviceConnectionState.connected) {
          print(" connectionState=${connectionState.deviceId}");

           _discoverServices(deviceId);
        }
        // Handle connection state updates
      }, onError: (Object error) {
        print("error1 =$error");
        // Handle a possible error
      });
    }

斷開設(shè)備,
每連接成功一個設(shè)備后,就會產(chǎn)生一個_connectionStreamSubscription,對應(yīng)設(shè)備的斷開,就用對應(yīng)的StreamSubscription去斷開, 可以用一個HashMap,去記錄連接成功的設(shè)備StreamSubscription的對應(yīng)關(guān)系

_connectionStreamSubscription.cancel();

去掃描服務(wù),并過濾服務(wù),掃描結(jié)果服務(wù)里面是包含有特征的數(shù)組,如: serviceId:[fff0,fff1,fff2,fff3,...]

_discoverServices(String deivceId) {
List<DiscoveredService> serviceList =
          await flutterReactiveBle.discoverServices(deviceId);
      print("services=$serviceList");
      for (int i = 0; i < serviceList.length; i++) {
        DiscoveredService discoveredService = serviceList[i];
        if (discoveredService.serviceId == Uuid.parse("fff0")) {
          if (discoveredService.characteristicIds.length < 4) {
            print("長度不夠用");
          }

    }
  }
}

去監(jiān)聽上報來的數(shù)據(jù),參數(shù)來自前面掃描到的結(jié)果serviceId--服務(wù)ID, characteristicId--特征ID,deviceId--設(shè)備ID

 final characteristic = QualifiedCharacteristic(
        serviceId: serviceId,
        characteristicId: characteristicId,
        deviceId: deviceId);
    print("characteristic = $characteristic");

    flutterReactiveBle.subscribeToCharacteristic(characteristic).listen((data) {
      // code to handle incoming data
      print("deviceId =${discoveredDevice.id}---上報來的數(shù)據(jù)data = $data");

}, onError: (dynamic error) {
      // code to handle errors
    });

監(jiān)聽這個地方,就知道當前是哪個設(shè)備上報的數(shù)據(jù)!

后面就是各位看官根據(jù)自己的需求去做邏輯處理啦。

print("deviceId =${discoveredDevice.id}---上報來的數(shù)據(jù)data = $data");

對設(shè)備設(shè)置命令,發(fā)送請求(寫操作),list為整形數(shù)據(jù),要寫的數(shù)據(jù)

// write
        final writeCharacteristic = QualifiedCharacteristic(
            serviceId: discoveredService.serviceId,
            characteristicId: discoveredService.characteristicIds[2],
            deviceId: widget.device.id);
        await flutterReactiveBle
            .writeCharacteristicWithResponse(writeCharacteristic, value: list);

讀取設(shè)備的信息(讀操作)

// read
        final characteristic = QualifiedCharacteristic(
            serviceId: discoveredService.serviceId,
            characteristicId: discoveredService.characteristicIds[1],
            deviceId: widget.device.id);
        final response =
            await flutterReactiveBle.readCharacteristic(characteristic);
        print("response=$response");
最終的成果
22.gif

結(jié)尾

flutter 多臺藍牙設(shè)備同時連接的分享就到這里嘍,小伴們,覺得有點用的話,或者已經(jīng)看到這里面來的請點個贊吧~~ 后續(xù)分享更多有關(guān)flutter的文章。如果有疑問的話,請在下方留言~

補充

過一段時間后,我在項目把這個藍牙庫用起來了,基本能滿足日常需求.效果如下:

666.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容