◆ [2025-7-24 星期四 5:33] ◆ | ◆ 收藏本站 ◆ | ◆ 设为首页 ◆ |
![]() |
|
---|
首 页 | 论坛交流 | 游戏频道 | 无忧脚本 | 旧版论坛 | 云服务器 | 聊 天 室 | 自助链接 | 来访记录 | 访客留言 | 搜索提供 |
位置:風雲工作室 - 论坛交流 - 技术专栏 - 脚本中心 - 【原创】小程序读取蓝牙手环数据 | 返回 |
主题:【原创】小程序读取蓝牙手环数据 | |||||||
|
(1楼)【原创】小程序读取蓝牙手环数据
在拼多多买了个11块钱的手环(M4),测试用小程序读取手环步数
// 执行完后回调 func(步数, 提示信息); |
||||||
|
|||||||
|
(2楼)
注意:上面的例子仅限于 M4 手环 (对应APP 为乐动健康)
小程序读取蓝牙手环原理: deviceId,即蓝牙设备的硬件地址,类似网卡的 MAC 地址,一个地址对应一个设备。 serviceId,即蓝牙设备提供的服务编号,特定Id对应特定服务,但是很多厂商并不规矩,自己定义了一些服务Id,上面例子的 000018D0-0000-1000-8000-00805F9B34FB 是 M4 手环的服务Id。一般一个设备会提供多个服务,例如运动功能,拍照功能等。 characteristicId,特征值,每个服务都可能有多个特征值,上例中的 00002D00-0000-1000-8000-00805F9B34FB 是用来查询步数的。 读取流程为: 打开蓝牙(openBluetoothAdapter) 连接蓝牙设备(createBLEConnection) 监听特征值(onBLECharacteristicValueChange) 发送读取命令(readBLECharacteristicValue) 断开设备(closeBLEConnection) 关闭蓝牙(closeBluetoothAdapter) |
||||||
|
|||||||
|
(3楼)
M4 的 serviceId 和 characteristicId,是我通过枚举所有可 read 的 特征值,然后比对手环上的步数数据得出来的,例如手环显示步数为 179,对应的16进制值为 b3,则可以将特征值 buf2hex 后 看是否存在 00b3 ,就很容易能找出对应的 服务id和 特征id。
不过不是所有手环都能查出来,例如 20来元的 M6,它的步数貌似不能通过 read 方法读出来。😂 |
||||||
|
|||||||
|
(4楼)附带一个枚举特征值的代码
var deviceId = "C2:FC:01:D9:67:75";
// 打开蓝牙 wx.openBluetoothAdapter({ success: () => { wx.createBLEConnection({ complete: res => { var closeBlue = () => wx.closeBLEConnection({ complete(){ wx.closeBluetoothAdapter(); console.log("蓝牙已关闭"); }, deviceId }); listService(deviceId, closeBlue); }, deviceId }); } }); function listService(deviceId, closeBlue) { var forEach = (arr, id) => { var item = arr[id]; if(!item) return closeBlue(); listCharact(deviceId, item.uuid, () => forEach(arr, ++id)); }; var buf2hex = buffer => [].map.call(new Uint8Array(buffer), x => ("0" + x.toString(16)).slice(-2)).join(""); wx.onBLECharacteristicValueChange(charact => { var val = buf2hex(charact.value); // if(!/133/.test(val)) return; console.log(val, charact); }); wx.getBLEDeviceServices({ complete: res => forEach(res.services, 0), deviceId }); } function listCharact(deviceId, serviceId, nextService) { var forEach = (arr, id) => { var item = arr[id]; if(!item) return nextService(); if(!item.properties.read) return forEach(arr, ++id); wx.readBLECharacteristicValue({ complete() { forEach(arr, ++id); }, characteristicId: item.uuid, deviceId, serviceId }); }; wx.getBLEDeviceCharacteristics({ complete: res => { forEach(res.characteristics, 0); }, deviceId, serviceId }); } |
||||||
|