关于小米手环2历史数据获取协议的技术咨询
Hey there! 很高兴看到你已经在小米手环2的BLE协议研究上迈出了这么大的一步——搞定认证和基础数据提取已经是个不小的成就了。关于历史分钟级步数的获取,我可以结合对Gadgetbridge、miband2-python-test这类开源项目的了解,给你梳理核心的协议逻辑和关键操作步骤:
小米手环2 历史分钟级步数获取核心逻辑拆解
1. 定位目标BLE特征UUID
首先得找到存储历史运动数据的BLE特征,小米手环2的这个特征通常是 0000ff08-0000-1000-8000-00805f9b34fb(不同固件版本可能略有差异,建议用BLE调试工具扫描手环服务确认)。这个特征是读取历史数据的唯一入口,所有请求和响应都通过它完成。
2. 构造并发送历史数据请求指令
在完成双向认证后,你需要向上述特征写入特定格式的请求指令,指定要获取的时间范围和数据类型:
- 指令固定以
0x03开头,代表“请求历史数据” - 第二个字节是数据类型标识:分钟级步数对应的是
0x02(心率是0x03、睡眠是0x04,以此类推) - 接下来8字节是时间范围:拆分为起始时间和结束时间的秒级Unix时间戳,每个时间戳转成4字节小端序(little-endian)
举个实际的指令示例(假设起始时间戳是1690000000,结束时间戳是1690172800):
[0x03, 0x02, 0x00, 0x9C, 0x7E, 0x64, 0x00, 0x80, 0x82, 0x64]
这里0x00,0x9C,0x7E,0x64是1690000000的小端4字节,0x00,0x80,0x82,0x64是1690172800的小端4字节。
3. 处理分片响应数据
手环收到请求后,会通过同一个特征值返回分片数据(因为BLE单包长度有限,每次返回约20字节):
- 每片数据的第一个字节是分片序号:比如
0x01是第一片,0x02是第二片;最后一片的序号会带结束标记,比如0x83表示第三片是最后一片 - 分片的剩余字节是实际的步数数据:每2字节对应一个分钟的记录,格式为
[步数(1字节), 时间偏移(1字节)]
4. 拼接数据并映射时间
把所有分片按序号拼接完成后,就可以解析每一条分钟级数据:
- 时间偏移是相对于你请求的起始时间的分钟数,比如偏移值
0x05代表起始时间往后第5分钟 - 对应的具体时间 = 起始时间戳 + 时间偏移 * 60(转成秒级)
- 步数就是该单元的第一个字节值(小米手环2的分钟级步数单字节足够覆盖,因为每分钟步数不会超过255)
几个关键注意事项
- 固件版本适配:部分旧版本固件可能在指令格式或数据返回上有细微调整,建议先确认手环固件版本再调整请求
- 完整性校验:有些固件会在分片末尾附带校验位,需要确保拼接后的数据校验正确,避免解析出错
- 参考开源代码:Gadgetbridge里的
MiBand2Support类的requestHistoryData方法,有完整的请求、分片拼接和解析逻辑,是最直接的参考
内容的提问来源于stack exchange,提问作者Florian Hantke




