如何用Python解码Govee温湿度计BLE广播数据?
Govee BLE温湿度计广播数据解码指南
1. Raw Data与Mfg Data的区别
- Raw Data(原始广播数据):是BLE设备广播包的完整字节集合,包含所有广播相关字段——比如设备名称、服务UUID、广播类型标识、厂商数据等全部内容,是未经过任何筛选的原始payload。
- Mfg Data(厂商自定义数据):是Raw Data中专门用于厂商自定义内容的字段,开头固定为蓝牙SIG分配的厂商ID(Govee的厂商ID是
0x0038),只包含厂商自己定义格式的业务数据,温湿度信息就藏在这里,无关的广播内容会被排除。
2. 字节串转温湿度数据的通用解码方法
核心思路是定位有效数据段→确定字节顺序→转换数值→缩放校准,以下是分步操作:
- 筛选有效厂商数据
先从Mfg Data中剔除开头的2字节厂商ID(注意端序:比如Govee的厂商ID在字节串里可能是b'\x38\x00',对应小端序的0x0038),剩下的部分就是厂商自定义的业务payload。 - 确认字节端序
BLE设备大多使用**小端序(Little Endian)**存储多字节数值,你可以用已知的环境温湿度值反推验证:比如当前环境是25.5℃,如果解析出的原始整数是255,那大概率是小端序,且缩放系数是10。 - 拆分温湿度对应的字节段
厂商会把温湿度用固定长度的字节存储(通常是2字节/16位整数),你需要:- 对比不同环境下的Mfg Data变化,找到数值变化对应的字节位置(比如温度变化时,哪2个字节跟着变)
- 用
int.from_bytes()把目标字节串转换成整数,指定端序
- 缩放得到实际值
厂商会把浮点值转换成整数存储(避免浮点精度问题),比如温度×10、湿度×1,你需要用解析出的整数除以对应系数,得到实际的温湿度数值。
示例代码(需自行调整字节位置)
# 替换成你实际获取到的Govee厂商数据 mfg_data = b'\x38\x00\x01\x02\x90\x03\x10\x00' # 移除开头2字节厂商ID payload = mfg_data[2:] # 示例:假设温度在第2-3字节,湿度在第4-5字节(需自行验证调整) temp_bytes = payload[1:3] hum_bytes = payload[3:5] # 小端序转换为整数 temp_raw = int.from_bytes(temp_bytes, byteorder='little') hum_raw = int.from_bytes(hum_bytes, byteorder='little') # 缩放校准(示例系数,需根据实际数据调整) temperature = temp_raw / 10 humidity = hum_raw # 若湿度是百分比整数则直接用,若为小数则除以对应系数 print(f"温度: {temperature}℃, 湿度: {humidity}%")
内容的提问来源于stack exchange,提问作者Z.Mack
相关产品推荐
相关产品推荐

