【蓝牙小程序】蓝牙微信小程序定制化的关键函数:设备名/服务/特征 & 注意事项
1. 获取发现的设备列表
通过 wx.getBluetoothDevices
方法获取搜索到的设备列表,并选择目标设备。
wx.getBluetoothDevices({
success(res) {
const devices = res.devices;
console.log('发现的设备列表', devices);
// 选择目标设备
const targetDevice = devices.find(device => device.name === 'YourDeviceName');
if (targetDevice) {
console.log('找到目标设备', targetDevice);
// 连接设备
connectToDevice(targetDevice.deviceId);
}
}
});
2. 获取设备的服务列表
通过 wx.getBLEDeviceServices
方法获取设备的服务列表。
function getBLEDeviceServices(deviceId) {
wx.getBLEDeviceServices({
deviceId,
success(res) {
console.log('获取服务列表成功', res.services);
// 选择目标服务
const targetService = res.services.find(service => service.uuid === 'YourServiceUUID');
if (targetService) {
console.log('找到目标服务', targetService);
// 获取服务特征值
getBLEDeviceCharacteristics(deviceId, targetService.uuid);
}
}
});
}
3. 获取服务的特征值
通过 wx.getBLEDeviceCharacteristics
方法获取服务的特征值。
function getBLEDeviceCharacteristics(deviceId, serviceId) {
wx.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success(res) {
console.log('获取特征值成功', res.characteristics);
// 选择目标特征值
const targetCharacteristic = res.characteristics.find(char => char.uuid === 'YourCharacteristicUUID');
if (targetCharacteristic) {
console.log('找到目标特征值', targetCharacteristic);
// 启用特征值通知
enableBLECharacteristicNotification(deviceId, serviceId, targetCharacteristic.uuid);
}
}
});
}
扩展:蓝牙小程序编程注意点
1. BLE基础知识——UUID (Universally Unique Identifier)
根据蓝牙 4.2 协议规范(Vol 3, Part B, section 2.5.1 UUID),UUID 是一个 128 位的唯一标识符,用来标识 Service 和 Characteristic 等。
为了减少存储和传输 128 位 UUID 值的负担,蓝牙技术联盟预分配了一批 UUID,这一批 UUID 拥有一个共同部分,被称为 Bluetooth Base UUID,即 00000000-0000-1000-8000-00805F9B34FB
。因此,预分配的 UUID 也可以使用 16 位或 32 位表示,其中 16 位 UUID 最为常用。使用 16/32 位的 UUID 可以降低存储和传输的负载。开发者自定义的 UUID 应注意不能与预分配的 UUID 冲突。
在小程序中,wx.startBluetoothDevicesDiscovery 和 wx.getConnectedBluetoothDevices 的参数支持 16/32/128 位 UUID。在其他接口的参数中,
- iOS 支持直接使用 16 位 和 128 位的 UUID;
- Android 8.0.9 版本开始,支持直接使用 16/32/128 位 UUID;
Android 8.0.9 以下版本,只支持 128 位的 UUID,需要开发者手动补位到 128 位。补位方式如下
128位UUID = 16位UUID * 2^96 + Bluetooth Base UUID
128位UUID = 32位UUID * 2^96 + Bluetooth Base UUID
- 例如
0x180F -> 0000180F-0000-1000-8000-00805F9B34FB
所有接口的返回值统一为 128 位 UUID。
2. API使用注意事项:
- iOS 上,对特征值的
read
、write
、notify
操作,由于系统需要获取特征值实例,传入的serviceId
与characteristicId
必须由 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 中获取到后才能使用。建议统一在建立连接后先执行 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 后再进行与蓝牙设备的数据交互。 - 考虑到蓝牙功能可以间接进行定位,安卓 6.0 及以上版本,无定位权限或定位开关未打开时,无法进行设备搜索。
- 安卓上,部分机型获取设备服务时会多出
00001800
和00001801
UUID 的服务,这是系统行为,注意不要使用这两个服务。 - 建立连接和关闭连接必须要成对调用。如果未能及时关闭连接释放资源,安卓上容易导致 state 133 GATT ERROR 的异常。
- 在与蓝牙设备传输数据时,需要注意 MTU(最大传输单元)。如果数据量超过 MTU 会导致错误,建议根据蓝牙设备协议进行分片传输。安卓设备可以调用 wx.setBLEMTU 进行 MTU 协商。在 MTU 未知的情况下,建议使用 20 字节为单位传输。
-
设备 ID (deviceId)
每个蓝牙外围设备都有唯一的
deviceId
来标识。由于部分系统实现的限制,对于同一台蓝牙外围设备,在不同中心设备上扫描获取到的deviceId
可能是变化的。因此deviceId
不能硬编码到代码中。- Android 设备上扫描获取到的
deviceId
为外围设备的 MAC 地址,相对固定; - iOS 设备上扫描获取到的
deviceId
是系统根据外围设备 MAC 地址及发现设备的时间生成的 UUID。对于已连接过的设备,UUID 会在一段时间内保持不变。此外,UUID 也会在某些条件下可能会发生变化(如系统蓝牙模块重启、配对设备被忽略等),在不同的设备上获取到的 UUID 也是不同的。
- Android 设备上扫描获取到的
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库