i12bp8/wmbuster

GitHub: i12bp8/wmbuster

专为 Flipper Zero 开发的被动式无线 M-Bus 智能仪表监听器,支持欧盟多种仪表协议的解码与 AES-128 解密分析。

Stars: 95 | Forks: 1

wM-Buster — wM-Bus smart-meter analyser for Flipper Zero **Flipper Zero 的被动式无线 M-Bus 监听器** 仅使用 CC1101(内部或外部模块)读取 868 MHz 频段上的 欧盟公用事业仪表(热量、水、燃气、电力、热费分配器)。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/903984da6f124636.svg)](https://github.com/i12bp8/wmbuster/actions/workflows/ci.yml) [![最新发布](https://img.shields.io/github/v/release/i12bp8/wmbuster?include_prereleases&sort=semver)](https://github.com/i12bp8/wmbuster/releases/latest) [![许可证:GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE) [![Flipper Zero](https://img.shields.io/badge/Flipper%20Zero-firmware%20API%2087.1-orange?logo=flipper)](https://flipperzero.one) [![GitHub Pages](https://img.shields.io/badge/docs-GitHub%20Pages-222?logo=github)](https://i12bp8.github.io/wmbuster/) [![仅接收](https://img.shields.io/badge/radio-RX%20only-success)](#what-it-does-not-do) [**项目主页**](https://i12bp8.github.io/wmbuster/)  ·  [**发布版本**](https://github.com/i12bp8/wmbuster/releases)  ·  [**更新日志**](CHANGELOG.md)  ·  [**免责声明**](DISCLAIMER.md)  ·  [**贡献指南**](drivers/CONTRIBUTING.md)
Live meter scan    Per-meter detail
## 功能 - **支持所有四种欧盟模式** — T1、C1、T+C 组合、S1。 T+C 是默认模式,可通过后同步字节检测(`0xCD` / `0x3D` / 直通) 在单一芯片配置上解码 T-mode (3-of-6) 和 C-mode (NRZ 格式 A & B)。 - **EN 13757-3 应用层** — DIF/VIF 遍历器,覆盖能量、 体积、质量、功率、体积流量、质量流量、供水/回水/外部 温度、温差、压力、运行时间、工作时间、 日期、日期时间、HCA 单位、制造编号、总线地址。 - **AES-128 模式 5 解密** — 将 `keys.csv` 放到 SD 卡上, 加密仪表将自动解密为可读行。 - **制造商驱动** — Techem (HCA / 热量 / 水 / 烟雾)、Kamstrup、 Diehl / Hydrometer / Sappel / IZAR、Qundis / ista / Brunata、BMeters、 Engelmann、Sontex、Zenner、Apator、GWF、BFW 等。 - **自定义 Canvas UI** — 带有 RSSI 条、数据包计数的仪表列表, 以及包含解析值、原始十六进制和帧统计信息的每块仪表详情页。 - **SD 日志记录** — 原始 + 已解析的报文保存至 `/ext/apps_data/wmbuster/`, 以便使用 `rtl_433` 或 `wmbusmeters` 进行离线分析。 ## 不能做什么 - **绝不发射。** 设计上排除了 T2 / C2 双向通信和仪表唤醒请求。 - **无 N-mode**(169 MHz 窄带)— Flipper 的 CC1101 在硬件上 被锁定在 300 / 430 / 868 MHz 的 SRD 频段。 - **不支持美国协议** — Itron ERT、Sensus FlexNet、Neptune R900 属于独立的无线电协议栈,目前不受支持。相关理由请参阅 [项目主页](https://i12bp8.github.io/wmbuster/)。 - **无密钥破解,无重放,无欺骗。** 这是一个查看器。 ## 安装 ### 从源代码构建 ``` # 安装 ufbt (Flipper 的 build tool) pip install --upgrade ufbt ufbt update --channel=release # Clone 与 build git clone https://github.com/i12bp8/wmbuster.git cd wmbuster ufbt # produces dist/wmbuster.fap ufbt launch # flash + start on a connected Flipper ``` 主机端回归测试(无需 Flipper): ``` make -C tests check ``` ## 解密(AES-128 模式 5) 较新的欧盟仪表(Techem v0x6A、Kamstrup MULTICAL 等)出厂时启用了 AES-128。将一个 CSV 文件放到 SD 卡的以下路径: ``` /ext/apps_data/wmbuster/keys.csv ``` 每行对应一个仪表,允许使用 `#` 注释: ``` # 制造商 (3 字符), 8 位十六进制 ID, 32 位十六进制 AES-128 key TCH,27404216,0123456789ABCDEF0123456789ABCDEF KAM,12345678,FEDCBA9876543210FEDCBA9876543210 ``` 重启应用程序以重新加载文件。从主菜单打开 **Keys** 以 确认已加载的条目(仅显示每个密钥的指纹)。当 文件中存在匹配的密钥时,仪表行将从 `ENC` 翻转为 `DEC`,并显示 解码后的读数。 ## 模式选择 | 模式 | 频率 | 比特率 | 编码 | 备注 | |-------|------------|-------------------|-----------------------|-----------------------------| | T1 | 868.95 MHz | 100 kchip/s | 3-of-6 | 旧版 Techem 固件 | | C1 | 868.95 MHz | 100 kbit/s | NRZ, 格式 A/B 自动 | 新版 Techem, 大多数 Kamstrup | | T+C | 868.95 MHz | 100 kbit/s | T1 或 C1, 自动检测 | **默认** — 覆盖最广 | | S1 | 868.30 MHz | 32.768 kbit/s | Manchester | 旧版水表 / 燃气表 | ## 外部 CC1101 如果您有一个按照标准 Flipper 引脚分配连接到 GPIO 的 CC1101 模块,请切换至 **Settings → Module → External**。如果未检测到模块, 应用程序将回退到内部无线电。 ## 文档 - **[项目主页](https://i12bp8.github.io/wmbuster/)** — 着陆页、 屏幕截图、安装步骤。 - **[CHANGELOG](CHANGELOG.md)** — 版本说明,逐版本记录。 - **[DISCLAIMER](DISCLAIMER.md)** — 完整法律条款、禁止用途、 频谱 / AES 政策。 - **[drivers/CONTRIBUTING.md](drivers/CONTRIBUTING.md)** — 如何在一个 C 文件中添加新的制造商驱动。 - **[drivers/README.md](drivers/README.md)** — 驱动布局参考。 ## 项目布局 ``` wmbuster/ ├── application.fam # ufbt manifest ├── wmbus_app.[ch] # entry point, scene wiring, settings ├── meters_db.[ch] # bounded in-RAM meter table ├── key_store.[ch] # AES-key CSV loader ├── logger.[ch] # SD logging (raw + parsed) ├── protocol/ │ ├── wmbus_3of6.[ch] # EN 13757-4 §6.2.1.1 chip decoder (T1) │ ├── wmbus_manchester.[ch]# Manchester decoder (S1) │ ├── wmbus_crc.[ch] # CRC-16/EN-13757 + Format A/B verifiers │ ├── wmbus_link.[ch] # L/C/M/A/CI parsing, encryption-mode tag │ ├── wmbus_app_layer.[ch] # DIF/VIF walker + renderer │ ├── wmbus_aes.[ch] # AES-CBC over furi_hal_crypto │ ├── wmbus_manuf.[ch] # 16-bit manuf code <-> 3-letter ASCII │ └── wmbus_medium.[ch] # device-type code -> human string ├── subghz/ │ ├── wmbus_worker.[ch] # CC1101 worker, slicer, CRC, dispatch │ ├── wmbus_hal_rx.c # FIFO drain via SPI (int + ext handles) │ └── wmbus_radio.[ch] # int/ext device selector (ProtoPirate-style) ├── drivers/ │ ├── engine/ # registry + uniform driver interface │ ├── _oms_split.h # shared "OMS prefix -> mfct trailer" helper │ ├── CONTRIBUTING.md # how to add a new driver │ └── europe/ │ ├── techem/ # FHKV-3/4 HCA, heat, water, smoke, MK-Radio │ ├── kamstrup/ # MULTICAL family │ ├── diehl/ # Hydrometer / Sappel / IZAR │ ├── qundis/ # Qundis / ista / Brunata HCAs │ ├── bmeters/ # Hydrodigit │ ├── engelmann/ # Hydroclima HCA │ ├── sontex/ # RFM-TX1 water (legacy + OMS firmwares) │ ├── zenner/ # Zenner B.One │ ├── apator/ # NA-1 │ ├── misc/ # GWF water, BFW 240-Radio │ └── ... # see drivers/README.md ├── views/ # canvas widgets + scenes └── tests/ # host-side regression tests (no Flipper) ``` ## 添加驱动 我们尽可能地简化了添加制造商驱动的工作。通常 情况下只需**一个 C 文件,约 50 行**:将其放入 `drivers/europe//.c`,添加到 `application.fam` 和 注册表中。 关于从 `wmbusmeters` 移植的实际示例,请参见 [**drivers/CONTRIBUTING.md**](drivers/CONTRIBUTING.md)。在 `tests/test_ports.c` 中 包含回归测试的 Pull Request 会被最快合并。 ## 测试 主机测试套件使用公开的 `wmbusmeters` 参考报文对每个制造商驱动进行了验证: ``` make -C tests check ``` 要针对 SDR 进行真实环境验证,请使用 `rtl_433` 捕获同一空间的无线电信号: ``` rtl_433 -f 868.95M -s 1.6M -Y minmax -R 104 -R 105 -F json > capture.jsonl ``` (`-R 104` 是 rtl_433 的 wM-Bus T+C 解码器,`-R 105` 是 S-mode 解码器。) ## 标准与参考 - **EN 13757-4** — wM-Bus PHY / 链路层。 - **EN 13757-3** — 应用层(DIF/VIF)。 - **OMS 规范第 2 卷** — 配置文件 + 加密。 - **TI SWRA522** — CC1101 wM-Bus 实现说明。 解码器已与以下内容进行了交叉核对: - **您自己的仪表** — 根据欧盟指令 2018/2002 第 9-11 条,消费者拥有法定权利访问其自身的消费数据,因此 读取通常是合法的。然而,运营商在法律上没有义务 提供 RF 接口的 AES-128 密钥,因为对称密钥通常 会带来安全和配置风险。一些供应商可能会在收到请求后 将其提供给您,但获取密钥是您个人的责任。 非欧盟司法管辖区存在同等效力的法规。 - **其他仪表** — 可能构成非法拦截私人 通信以及违反 GDPR(或同等法律)非法处理个人数据。 在将此应用程序对准非您所有的仪表之前,请查阅您所在国家/地区的法规。 ## 贡献 欢迎贡献 — 错误报告、驱动移植、UI 优化、文档。 1. **先开 issue**,对于非平凡的更改,以便我们可以对方案进行初步评估。 2. **坚持现有风格**:`Makefile` 中使用制表符,C 语言使用 4 个空格缩进, 不使用 Doxygen,注释解释*为什么*而不是*是什么*。 3. **添加测试**,在任何新驱动的 `tests/test_ports.c` 中 — 取自 `wmbusmeters/tests/test_*.txt` 的报文均可直接使用。 4. **在本地运行** `make -C tests check && ufbt` 并确保两者均通过。 5. **不要提交真实密钥、明文的真实仪表 ID,或非您所有的仪表的** 已解密捕获数据。包含这些内容的 PR 将被强制推送清理。 驱动演练请参阅 [drivers/CONTRIBUTING.md](drivers/CONTRIBUTING.md), 数据卫生策略请参阅 [DISCLAIMER §5](DISCLAIMER.md#5-aes-keys)。 ## 路线图 - 为仍然缺失的大部分欧盟水表移植驱动 (Maddalena、Aquametro、Sensus iConA、Itron Cyble、Elster v200H)。 - 应用内密钥指纹搜索(粘贴十六进制值,查找使用它的仪表)。 - 详情页上每个仪表的 RSSI 历史记录迷你图。 - 翻译。 美国协议(Itron ERT、Neptune R900 等)**不在范围之内** — 它们属于不同的无线电协议栈。如果有人想编写,一个独立的姊妹应用 将是合适的载体。 ## 致谢 站在巨人的肩膀上 — 见上文的 [标准与参考](#standards--references)。 特别感谢 wmbusmeters 的维护者,他们将每一个欧盟仪表的怪异特性 都用清晰的代码记录下来;并感谢 Flipper Zero 开源社区提供的 SubGHz 设备插件抽象,使得支持外部 CC1101 成为一项仅十来行代码的工作。 ## 许可证 在 **GNU General Public License v3.0 或更高版本** 下发布 — 完整文本请参阅 [`LICENSE`](LICENSE)。简而言之:您可以使用、学习、 修改和重新分发本软件,但任何重新分发的副本或 衍生作品必须保留在 GPLv3 下,并随附其完整的 相应源代码。开发期间使用的 `_refs/` 目录 未随 `.fap` 一起分发,并保留其上游许可证。
标签:868MHz, AES-128, CC1101, DIF/VIF解析, EN 13757-3, Flipper Zero, OMS, 客户端加密, 射频分析, 射频模块, 嵌入式开发, 开源硬件, 无线M-Bus, 无线电接收, 无线监听, 智能电表, 气表, 水表, 热能表, 物联网协议解析, 物联网安全, 硬件黑客, 防御绕过