知识储备

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包
image

题外话,这里开发对比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,和官方给出的一致(废话
EF70757188014790A31944B4A0EDC781

重点我们需要拿到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.


寄蜉蝣于天地,渺沧海之一粟