# BM2 Battery Monitor：重建加密的 BLE 电压协议

> 重新实现 BM2（Battery Monitor 2）汽车电池监测器的低功耗蓝牙协议，使其读数无需厂商的 Android 应用即可使用。基于 Bleak 的 Python 客户端会解密监测器以 AES 加密的通知，读取当前电压并请求设备存储的电压历史；ESPHome 模板可在 ESP32 上提供电压读数，示例应用则用于查看、导出读数或通过 MQTT 转发。作者的说明称密钥和数据包格式是从厂商应用中恢复的；结果均为作者及贡献者报告。

- 类型：案例
- 目标：协议
- 类别：独立重建案例
- 关联：独立重建项目
- 来源复核于：2026-10-20
- 收录于：2026-11-09
- 原始资源：<https://github.com/KrystianD/bm2-battery-monitor>
- 一手来源：<https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/README.md>
- 目录页面：<https://awesomerea.org/zh/resources/bm2-battery-monitor-ble-case/>
- 记录 JSON：<https://awesomerea.org/resources/bm2-battery-monitor-ble-case/record.json>
- 英文版：[English](https://awesomerea.org/resources/bm2-battery-monitor-ble-case/index.md)

## 使用条件与局限

- bm2 0.1.0 包要求 Python 3.8+。客户端读取当前电压和历史记录；历史时间戳按两分钟间隔推算，ESPHome 模板只读取当前电压。
- 需自备 BM2 监测器及其蓝牙地址。客户端和 ESPHome 模板包含从厂商应用恢复的 AES-128-CBC 密钥。
- Python 客户端使用 Bleak ~0.14.2 和 PyCryptodome；重连路径调用 Linux bluetoothctl。MQTT 示例另需 paho-mqtt ~1.6.1。ESPHome 模板面向采用 Arduino、mbedtls 的 nodemcu-32s ESP32，并需填写 Wi-Fi、MQTT 和 MAC 密钥配置。
- 仓库有 mypy 检查，但没有测试或 CI。历史数据修复报告在 Linux Mint 22.3 和 PowerHouse BM2 N2099A 上测试；其他 BM2 型号的覆盖情况未说明。
- 代码按 LICENSE.txt 采用 MIT；设备和厂商应用保留各自权利。

## 一手来源

1. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/README.md>
2. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/.docs/reverse_engineering.md>
3. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/bm2_python/src/bm2/client.py>
4. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/bm2_python/src/bm2/encryption.py>
5. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/bm2_esphome/bm2.yaml>
6. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/bm2_esphome/main.yaml>
7. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/bm2_python/requirements.txt>
8. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/pyproject.toml>
9. <https://github.com/KrystianD/bm2-battery-monitor/blob/494a39c5edfbf5c76906469f0da545e42882b28c/LICENSE.txt>
10. <https://github.com/KrystianD/bm2-battery-monitor/pull/28>

## 同分区更多条目：协议

- [Smart ring protocol：记录 Oura Ring 蓝牙协议与事件格式](https://awesomerea.org/zh/resources/ringverse-oura-ring-protocol-case/index.md) · 案例
- [openrsync：ISC 许可的 rsync 协议 27 实现](https://awesomerea.org/zh/resources/openrsync-protocol-case/index.md) · 案例
- [Thermal Master P3：浏览器里的厂商 USB 协议客户端](https://awesomerea.org/zh/resources/thermal-master-p3-protocol-case/index.md) · 案例
- [SNX-VPN：重建 Check Point SNX 的浏览器登录流程](https://awesomerea.org/zh/resources/snxvpn-case/index.md) · 案例
- [OpenDS：重建 FRC Driver Station 客户端](https://awesomerea.org/zh/resources/opends-frc-case/index.md) · 案例
- [CO/Tech 电源插座：复现采集到的无线电命令](https://awesomerea.org/zh/resources/cotech-remote-control-case/index.md) · 案例

## 关于此条目

说明已依据一手来源复核。
原创说明采用 MIT 许可；外部项目、论文与素材保留各自的权利和许可。
