红包
◆ [2022-5-28 星期六 9:34] ◆ 您来自:3.238.72.122,欢迎您访问風雲工作室。 收藏本站 ◆ | ◆ 设为首页
联系站长(腾讯QQ)
5029111 [風雲]
站长当前离线
首  页 论坛交流 游戏频道 无忧脚本 旧版论坛 云服务器 聊 天 室 自助链接 来访记录 访客留言 搜索提供
位置:風雲工作室 - 论坛交流 - 技术专栏 - 脚本中心 - 【原创】小程序读取蓝牙手环数据 返回
主题:【原创】小程序读取蓝牙手环数据
風雲
★☆☆☆☆☆☆☆☆☆
积分:58
发帖:62
登录:2022/3/22
注册:2006/9/17
(1楼)【原创】小程序读取蓝牙手环数据
在拼多多买了个11块钱的手环(M4),测试用小程序读取手环步数
// 执行完后回调 func(步数, 提示信息);
function getBlueStep(func) {
        // 从本地缓存获取绑定的手环参数
        var bangle = wx.getStorageSync("bangle") || 0;
        if(!bangle) return func(0, "");
        // 获取蓝牙手环步数
        var deviceId = bangle.deviceId;
        var serviceId = bangle.serviceId || "000018D0-0000-1000-8000-00805F9B34FB";
        var characteristicId = bangle.characteristicId || "00002D00-0000-1000-8000-00805F9B34FB";
        var buf2hex = buffer => [].map.call(new Uint8Array(buffer), x => ("0" + x.toString(16)).slice(-2)).join("");
        // 读取到值后
        wx.onBLECharacteristicValueChange(charact => {
                var val = buf2hex(charact.value);
                func(parseInt(val.substr(14, 8), 16), "OK");
        });
        wx.openBluetoothAdapter({
                fail: err => func(0, err.errMsg),
                success: () => {
                        wx.createBLEConnection({
                                complete: res => {
                                        if(res.errCode) {
                                                wx.closeBluetoothAdapter();
                                                return func(0, res.errMsg);
                                        }
                                        wx.readBLECharacteristicValue({
                                                complete: res => {
                                                        // 完成后关闭连接
                                                        wx.closeBLEConnection({
                                                                complete: () => {
                                                                        wx.closeBluetoothAdapter();
                                                                }, deviceId
                                                        });
                                                        // 读取没成功
                                                        if(res.errCode) func(0, res.errMsg);
                                                }, characteristicId, deviceId, serviceId
                                        });
                                }, deviceId
                        });
                }
        });
}
时间:2021年10月21日 23:16:55 IP:已记录 引用 回复
風雲
★☆☆☆☆☆☆☆☆☆
积分:58
发帖:62
登录:2022/3/22
注册:2006/9/17
(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)
时间:2021年10月21日 23:29:50 IP:已记录 引用 回复
風雲
★☆☆☆☆☆☆☆☆☆
积分:58
发帖:62
登录:2022/3/22
注册:2006/9/17
(3楼)
M4 的 serviceId 和 characteristicId,是我通过枚举所有可 read 的 特征值,然后比对手环上的步数数据得出来的,例如手环显示步数为 179,对应的16进制值为 b3,则可以将特征值 buf2hex 后 看是否存在 00b3 ,就很容易能找出对应的 服务id和 特征id。
不过不是所有手环都能查出来,例如 20来元的 M6,它的步数貌似不能通过 read 方法读出来。😂
时间:2021年10月21日 23:35:41 IP:已记录 引用 回复
風雲
★☆☆☆☆☆☆☆☆☆
积分:58
发帖:62
登录:2022/3/22
注册:2006/9/17
(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
        });
}
时间:2021年10月21日 23:56:44 IP:已记录 引用 回复

© Copyright 2006-2022,風雲工作室 All rights reserved.
湘ICP备05009306号QQ登录
操作 1 个库,连接 5 次,执行 10 次,耗时 188 毫秒。