BLE Monitor项目中的MiBeacon协议逆向工程解析
ble_monitor BLE monitor for passive BLE sensors 项目地址: https://gitcode.com/gh_mirrors/bl/ble_monitor
前言
在物联网设备监控领域,BLE(蓝牙低功耗)设备因其低功耗特性被广泛使用。本文将深入解析BLE Monitor项目中涉及的MiBeacon协议逆向工程过程,帮助开发者理解如何解析小米蓝牙设备的广播数据。
数据收集方法
方法一:使用report_unknown选项
在BLE Monitor配置中启用report_unknown
选项后,系统会记录所有未识别设备的广播数据。例如LYWSDCGQ温湿度传感器的输出示例:
2020-12-23 17:42:12 INFO (Thread-3) [custom_components.ble_monitor] BLE ADV from UNKNOWN: RSSI: -53, MAC: 4C65A8DDB89B, ADV: 043e25020100009bb8dda8654c19020106151695fe5020aa01fe9bb8dda8654c0d1004b2007502cb
方法二:使用btmon工具
通过Linux系统的btmon工具可以捕获所有蓝牙消息:
btmon --write hcitrace.snoop | tee hcitrace.txt
在输出中搜索包含UUID 0xfe95
的消息,这是小米设备的标识。
原始数据分析
捕获的原始数据通常呈现以下结构模式:
HCI Event: LE Meta Event (0x3e) plen 37
LE Advertising Report (0x02)
Num reports: 1
Event type: Connectable undirected - ADV_IND (0x00)
Address type: Public (0x00)
Address: 4C:65:A8:DD:B8:9B (OUI 4C-65-A8)
Data length: 25
Flags: 0x06
LE General Discoverable Mode
BR/EDR Not Supported
Service Data (UUID 0xfe95): 5020aa010c9bb8dda8654c0d1004b2004302
RSSI: -68 dBm (0xbc)
数据结构解析
通过分析多个数据样本,我们可以整理出以下数据结构表:
| 字段 | 描述 | 示例值 | |------|------|--------| | HCI类型 | 蓝牙事件类型 | 0x04 | | 事件代码 | LE数据事件 | 0x3e | | 总长度 | 广告数据总长度 | 37 | | 子事件 | LE广告报告 | 0x02 | | 报告数 | 广告报告数量 | 1 | | 事件类型 | 连接类型 | 0x00 | | 地址类型 | 设备地址类型 | 0x00 | | MAC地址 | 设备MAC(逆序) | 9b b8 dd a8 65 4c | | 数据长度 | 广告数据长度 | 25 | | 标志位 | 设备能力标志 | 0x06 | | UUID | 小米服务标识 | 95 fe | | 帧控制 | 控制位 | 50 20 | | 产品ID | 设备类型标识 | aa 01 | | 帧计数 | 消息序号 | fe | | 测量类型 | 数据类型标识 | 0d 10 | | 温度值 | 温度数据 | b2 00 | | 湿度值 | 湿度数据 | 75 02 | | 电量值 | 电池百分比 | 48 | | RSSI | 信号强度 | cb |
数据转换方法
十六进制转十进制
关键数据需要从十六进制转换为十进制:
-
温度转换:
- 原始数据:
b2 00
→ 反转字节序为00 b2
- 十六进制:0x00B2 → 十进制178
- 实际值:178/10 = 17.8°C
- 原始数据:
-
湿度转换:
- 原始数据:
75 02
→ 反转字节序为02 75
- 十六进制:0x0275 → 十进制629
- 实际值:629/10 = 62.9%
- 原始数据:
-
电量转换:
- 原始数据:
48
→ 十进制72 - 实际值:72%
- 原始数据:
-
RSSI转换:
- 原始数据:
CB
→ 有符号十进制-53 - 实际值:-53dBm
- 原始数据:
加密数据解密
部分小米设备使用AES-CCM加密广播数据。解密流程如下:
-
提取关键字段:
- 从原始数据中找到小米标识
\x16\x95\xFE
- 获取逆向MAC地址
- 提取设备类型标识
- 从原始数据中找到小米标识
-
构造nonce:
nonce = b"".join([xiaomi_mac_reversed, device_type, data[xiaomi_index + 7:xiaomi_index + 8]])
-
解密流程:
cipher = AES.new(key, AES.MODE_CCM, nonce=nonce, mac_len=4) cipher.update(aad) decrypted_payload = cipher.decrypt_and_verify(cipherpayload, token)
实际应用建议
- 设备识别:通过产品ID(
aa 01
等)可以识别具体设备类型 - 数据验证:帧计数器可用于检测数据包丢失
- 信号优化:RSSI值可用于评估设备位置优化
- 加密处理:对于加密设备需要正确的AES密钥才能解析
结语
通过深入解析MiBeacon协议,开发者可以更好地理解BLE Monitor项目如何解析小米蓝牙设备数据。掌握这些协议细节有助于扩展对新设备的支持,并优化现有设备的监控能力。对于加密设备,确保使用正确的密钥是成功解密的关键。
ble_monitor BLE monitor for passive BLE sensors 项目地址: https://gitcode.com/gh_mirrors/bl/ble_monitor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考