知识储备
BLE基础通信协议:
BLE介绍:http://doc.iotxx.com/BLE技术揭秘
GAT和GATT: https://www.jianshu.com/p/d99b121cf873
HRS心率协议:https://www.bluetooth.com/specifications/specs/heart-rate-service-1-0/
蓝牙抓包
Windows
这个是window上抓包的,但是华为的BLE心率需要先建立连接,所以只能抓到GAP包,没有具体含有参数的GATT包
https://www.bilibili.com/read/cv27172342
wireshark抓包数据:只能看到有这个服务也就是说这是GAP包
题外话,这里开发对比b站专栏,可以看到小米那边把心率当成个广告数据(advertising data)就直接开始广播了,并没有使用BLE的HRS数据包。从协议遵守上华为是明显比小米严格的(泛用性自然也就更高),也许小米这样做也有它的道理(
总不可能是程序员敷衍了事吧)
Android
安卓端抓包用的是BLE调试助手,简单好用
https://wwue.lanzouo.com/iOvnH1kklvod
密码:afc6
数据格式分析
对于service都有一个UUID编号,每个服务和特征值都有自己的唯一标识 UUID,标准UUID为128位,蓝牙协议栈中一般采用16位,也就是两个字节的UUID格式。(这里可以查到所有UUID的对应服务 https://www.bluetooth.com/specifications/assigned-numbers/ )
BLE调试助手抓到的各类包如下,这里看到心率的Heart Rate Service的UUID是180d,和官方给出的一致(废话
重点我们需要拿到Characteristics(特征值)数据,也就是Heart Rate Measurement的数据,根具UID获取这个值。
可以看到一直是06-xx,后面两位是十六进制
python开发:
python主要使用bleak库,这是一些示例:
https://www.cnblogs.com/wstong2052/p/17767538.html
一开始本来打算用python写的,但是后面想到要做界面,从没用python写过UI就放弃了。
Unity开发
框架使用
蓝牙部分框架找到了GitHub上一个开源的BLE框架:https://github.com/adabru/BleWinrtDll
UI用了一个免费素材:
https://assetstore.unity.com/packages/tools/gui/3d-modern-menu-ui-116144
Q.E.D.