小程序蓝牙设备通信逻辑及接口

更新日期: 2021-06-09 阅读次数: 2668 字数: 733 分类: 微信小程序

主要分三大块功能:

  • 开始扫描附近的蓝牙设备列表
  • 建立连接
  • 断开连接

开始扫描:1. 初始化蓝牙模块

接口:wx.openBluetoothAdapter

开始扫描:2. 开始搜寻附近的蓝牙外围设备

接口:wx.startBluetoothDevicesDiscovery

注意事项:

  • 此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery 方法停止搜索
  • 参数 services:如果设置此参数,则只搜索广播包有对应 uuid 的主服务的蓝牙设备。建议主要通过该参数过滤掉周边不需要处理的其他蓝牙设备。主服务 uuid 都是四位的。
  • 在调用此接口之前,先调用 wx.getConnectedBluetoothDevices 查看已连接的设备。因为搜索接口不会返回已连接的设备; 调用顺序,先查已连接设备,后查新设备。目的,既展示已连接的设备,也展示未连接的设备。

服务 UUID 的格式:

参考:https://zhuanlan.zhihu.com/p/133981948

蓝牙技术联盟SIG定义UUID共用了一个基本的UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB。总共128位,为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分

开始扫描:3. 监听寻找到新设备的事件

接口:wx.onBluetoothDeviceFound

由其他设备的广播数据中获取。

能获取到:

  • deviceId
  • Service UUIDs
  • 设备名称
  • ServiceData

体验优化:缓存最后一次连接成功的 deviceId, 下次发现新设备的 deviceId 与此相同时,自动建立连接。

建立连接:1. 连接低功耗蓝牙设备

接口:wx.createBLEConnection

注意:此时为了节省资源,需主动调用停止搜寻附近的蓝牙外围设备。wx.stopBluetoothDevicesDiscovery

建立连接:2. 获取蓝牙设备所有服务(service)

接口:wx.getBLEDeviceServices

建立连接:3. 判断是否是主服务?

如果是主服务,获取蓝牙设备某个服务中所有特征值(characteristic)。接口:wx.getBLEDeviceCharacteristics。

遍历特征值:

  • 如果可读:读取低功耗蓝牙设备的特征值的二进制数据值。wx.readBLECharacteristicValue
  • 如果可写:向低功耗蓝牙设备特征值中写入二进制数据。wx.writeBLECharacteristicValue
  • 如果可订阅:启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
    • wx.notifyBLECharacteristicValueChange
    • wx.onBLECharacteristicValueChange
    • 操作之前先监听,保证第一时间获取数据

断开连接

何时断开:

  • 切换蓝牙设备时
  • 关闭系统蓝牙时

不断开连接,是否会影响其他人接入?

被动断开连接的情况

  • kill 小程序后,连接即断开?实际测试结果,确实是。但是断开有大概 2~3 秒的延迟。在手机上杀掉小程序,可以看到 2~3 后,蓝牙设备的蓝灯即熄灭,说明连接断开。
  • 离开座位,去上厕所回来,也会断开连接。应该是超出了蓝牙通信的距离。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式