flutter 蓝牙ble(blue tooth),同时连接多台/多个设备

写这篇文章的初衷

上一篇文章介绍了如何开发一个蓝牙app,(https://www.jianshu.com/p/969871112806),
但局限于只能连接一台蓝牙设备,想同时连接着多台蓝牙设备,就没法实现

于是就有了写作本文的动力,-------->解决同时连接多台蓝牙设备!!!

选择第三方库

flutter_blue 适合于单台的蓝牙设备,使用起来简单
flutter_reactive_ble 适合于单台的蓝牙设备,多台蓝牙设备也可以用
flutter_ble_lib 适合于单台的蓝牙设备,多台蓝牙设备也可以用,可以在模拟器上进行调试蓝牙

感觉后2个第三方库都可以使用,本人先入为主使用了flutter_reactive_ble,所以本文以flutter_reactive_ble为基础进行介绍

先声明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,返回的是可以扫描到的设备
      deviceList.add(device);
    }, onError: (e) {
      print("onError = $e");
    });

如果扫描过程,不使用过滤条件,withServices这个参数可以给个空数组

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

停止扫描如下

_streamSubscription?.cancel();

连接设备

    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
      });
    }

断开设备,
每连接成功一个设备后,就会产生一个_connectionStreamSubscription,对应设备的断开,就用对应的StreamSubscription去断开, 可以用一个HashMap,去记录连接成功的设备StreamSubscription的对应关系

_connectionStreamSubscription.cancel();

去扫描服务,并过滤服务,扫描结果服务里面是包含有特征的数组,如: 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("长度不够用");
          }

    }
  }
}

去监听上报来的数据,参数来自前面扫描到的结果serviceId--服务ID, characteristicId--特征ID,deviceId--设备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}---上报来的数据data = $data");

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

监听这个地方,就知道当前是哪个设备上报的数据!

后面就是各位看官根据自己的需求去做逻辑处理啦。

print("deviceId =${discoveredDevice.id}---上报来的数据data = $data");

对设备设置命令,发送请求(写操作),list为整形数据,要写的数据

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

读取设备的信息(读操作)

// 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

结尾

flutter 多台蓝牙设备同时连接的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点个赞吧~~ 后续分享更多有关flutter的文章。如果有疑问的话,请在下方留言~

补充

过一段时间后,我在项目把这个蓝牙库用起来了,基本能满足日常需求.效果如下:

666.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容