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

文章目录

    主要分三大块功能:

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

    开始扫描: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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式