BLE Monitor项目中的MiBeacon协议逆向工程解析

BLE Monitor项目中的MiBeacon协议逆向工程解析

ble_monitor BLE monitor for passive BLE sensors ble_monitor 项目地址: 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 |

数据转换方法

十六进制转十进制

关键数据需要从十六进制转换为十进制:

  1. 温度转换

    • 原始数据:b2 00 → 反转字节序为00 b2
    • 十六进制:0x00B2 → 十进制178
    • 实际值:178/10 = 17.8°C
  2. 湿度转换

    • 原始数据:75 02 → 反转字节序为02 75
    • 十六进制:0x0275 → 十进制629
    • 实际值:629/10 = 62.9%
  3. 电量转换

    • 原始数据:48 → 十进制72
    • 实际值:72%
  4. RSSI转换

    • 原始数据:CB → 有符号十进制-53
    • 实际值:-53dBm

加密数据解密

部分小米设备使用AES-CCM加密广播数据。解密流程如下:

  1. 提取关键字段

    • 从原始数据中找到小米标识\x16\x95\xFE
    • 获取逆向MAC地址
    • 提取设备类型标识
  2. 构造nonce

    nonce = b"".join([xiaomi_mac_reversed, device_type, data[xiaomi_index + 7:xiaomi_index + 8]])
    
  3. 解密流程

    cipher = AES.new(key, AES.MODE_CCM, nonce=nonce, mac_len=4)
    cipher.update(aad)
    decrypted_payload = cipher.decrypt_and_verify(cipherpayload, token)
    

实际应用建议

  1. 设备识别:通过产品ID(aa 01等)可以识别具体设备类型
  2. 数据验证:帧计数器可用于检测数据包丢失
  3. 信号优化:RSSI值可用于评估设备位置优化
  4. 加密处理:对于加密设备需要正确的AES密钥才能解析

结语

通过深入解析MiBeacon协议,开发者可以更好地理解BLE Monitor项目如何解析小米蓝牙设备数据。掌握这些协议细节有助于扩展对新设备的支持,并优化现有设备的监控能力。对于加密设备,确保使用正确的密钥是成功解密的关键。

ble_monitor BLE monitor for passive BLE sensors ble_monitor 项目地址: https://gitcode.com/gh_mirrors/bl/ble_monitor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶婉珊Vivian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值