本文是对以下两篇文章的补充扩展


1. 配合脚本获取心率数据
当运行 miband-heart-rate.exe 时,程序会在 3030 端口监听 HTTP 请求,此时如果打开 http://127.0.0.1:3030/ 程序就会返回一个 html 页面,用来显示心率。
而如果请求的是 http://127.0.0.1:3030/heartrate 这个端点,则程序会以 application/json 格式返回心率数据。例如:
复习一下JSON的定义(RFC 4627):一个 JSON 值必须是一个 object / array / number / string,或者 false null true 这三个字面量之一。
因此60本身是一个合法的 JSON 值,类型为number。
所以我们可以通过脚本去获取心率数据,而不通过网页,例如:
2. 自定义显示效果
方法1:直接在OBS里配置自定义CSS
例如我想替换字体,先在Google Fonts上找到喜欢的字体,然后在自定义CSS里用导入,并设置 #heart-rate-number 元素的 font-family 即可,例如:
再比如我想把整体调大一点,但是用OBS放大的时候会比较模糊,也可以通过CSS实现缩放整个<body>元素:
方法2:可以从Github上下载网页的源代码并修改
在for-obs分支的web/index.html中可以修改各种样式,包括字体、心跳动画等等。如果不想重新编译的话,也可以参考我在<script>最后写的逻辑自己开发一个网页,能访问http://127.0.0.1:3030/heartrate获取到心率就行。
3. 蓝牙协议简介
在小米手环4、5、6、7中提供的运动心率广播,正如其名称所说,心率是通过蓝牙广播(Advertising)发出去的。
但是小米手环10的心率广播,并不是真的在广播时发送的。广播数据中只包含了HRS服务的声明,以及设备的简写名称而已。客户端扫描广播时识别到这个心率设备,还需要建立连接等一系列交互之后,才能接收到心率数据,所以并不是单纯的接收广播。
可以用 WebBluetooth 简单模拟一下这个过程,在Chrome或者Edge浏览器的控制台中输入以下代码:
获得的Heart Rate Measurement 数据也并不直接是心率数据,还需要解析:
第一个字节是 Flags Field,其中bit0代表心率数据格式,0代表心率数据是u8,1代表心率数据是u16;bit1代表传感器接触检测,0代表传感器与皮肤接触不良,1代表传感器与皮肤接触良好;bit2代表传感器是否支持接触检测,0代表不支持,1代表支持;余下的bit这里不作介绍
第二到三个字节代表心率数据,具体长度取决于Flags Field的bit0。小端序。