tjpaulsondev/sensus-iperl-decoder

GitHub: tjpaulsondev/sensus-iperl-decoder

通过 USB 逻辑分析仪和 sigrok 被动解码 Sensus iPERL 水表的 UI-1203 编码协议,实现低成本的本地用水量数据采集与记录。

Stars: 1 | Forks: 0

# sensus-iperl-decoder [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ![平台: Linux](https://img.shields.io/badge/platform-Linux%20%7C%20aarch64-blue) ![工具: sigrok](https://img.shields.io/badge/tooling-sigrok-green) 通过使用廉价的 USB 逻辑分析仪和 [sigrok](https://sigrok.org/) 接入 **Sensus iPERL** 水表的 3 线 (R/G/B) encoder 输出,被动读取其数据, 并将 **Sensus UI-1203** 协议解码为序列号和加仑数。 无发射,不对仪表进行任何修改——这仅仅是在仪表与其 SmartPoint MXU 无线电之间的链路上进行的一个并行的、只听的接入。 ``` V;RB0012,3,4;IB123456789;MSA1234567e-2,4,,\r -> 12,345.67 US gal ^serial ^reading (raw x 10^exp, unit 4 = US gal) ``` ## 工作原理 iPERL 通过 **Sensus UI-1203 / ECR** 同步协议与其 SmartPoint MXU 通信。MXU 是主设备——它为仪表供电并提供时钟,仪表随后将其读数以 7-bit ASCII 的形式移位回传。我们只需在 MXU 进行定期轮询时在链路上进行监听。 | 仪表线缆 | 分析仪 | 角色 | |------------|----------|------| | **RED** | D0 | 时钟 (~500 Hz, MXU 驱动) | | **GREEN** | D1 | 数据 (集电极开路, 7-data-bit + 校验位帧) | | **BLACK** | GND | 公共端 (**必需**) | 帧格式:`1 个起始位 + 7 个数据位 (LSB 优先) + 校验位 + 1 个停止位`。Payload: `V;RB;IB;MSAe,…`。有关完整的逆向工程说明,请参阅 [`DECODE_NOTES.md`](DECODE_NOTES.md)。 ## 硬件要求 - 一块您拥有或获得授权读取的水表。 - 一个兼容 fx2lafw 的 USB 逻辑分析仪(Saleae Logic 或通用的“24 MHz 8 通道”克隆版)。建议使用对 5 V 容忍的输入(线路电压波动约为 ~3.6 V)。 - 用于并行接入链路的 IC 钩 / 穿刺夹 —— **请勿剪断** 仪表↔MXU 的接线。 ## 接线(并行接入) ``` Meter RED ── D0 (clock) Meter GREEN ── D1 (data) Meter BLACK ── GND (common — connect first) ``` 在夹入之前,请使用万用表验证 BLACK = 0 V。 ## 设置 ``` sudo apt install sigrok-cli # Debian/Ubuntu/Parrot # 可选:移除 analyzer 的 sudo 要求 sudo usermod -aG plugdev "$USER" # then log out/in or replug ``` ## 用法 ``` # 检查接线 / line levels 是否正常 scripts/sanity.sh # 捕获一次 MXU 询问,解码并记录日志,然后退出 scripts/once.sh # 无人值守运行:解码每次询问 -> captures/readings.csv scripts/watch.sh # 解码已保存的 capture scripts/ui1203.py captures/sensus-YYYYMMDD-HHMMSS.sr ``` `watch.sh` 会将 `timestamp,serial,reading,units,capture` 追加到 `captures/readings.csv`。MXU 的轮询通常约为每小时一次,因此 监听器大部分时间处于空闲状态,然后记录每次读取。 ## 脚本 | 脚本 | 用途 | |--------|---------| | `scripts/sanity.sh` | 短暂捕获;报告空闲线路电平(接线检查) | | `scripts/capture.sh` | 在 RED 上升沿触发,保存一个带时间戳的 `.sr` | | `scripts/once.sh` | 捕获 → 解码 (UI-1203) → 追加 CSV → 退出 | | `scripts/watch.sh` | 无人值守循环运行 `once.sh` | | `scripts/ui1203.py` | 将 `.sr` 解码为序列号 + 读数 | | `scripts/recover.py` | 从 `.sr` 中提取原始比特流 | | `scripts/sensus_decode.py` | 分析工具(`selftest`/`diff`/`regress`/`recover`) | ## 隐私 捕获的数据包含您仪表的序列号和读数。`captures/` 和您本地的 `scripts/known.json` 已被 **gitignored** —— 请勿将它们提交到版本控制中。 复制 `scripts/known.json.example` 到 `scripts/known.json` 以设置您自己的基准参考。 ## 状态 / 可移植性 解码已在实际的 iPERL + SmartPoint MXU 上确认有效。该工具链基于 sigrok,并可在 aarch64 架构(例如手持 Linux 设备)上运行。接线颜色和 确切的帧格式可能因仪表/寄存器代数和授权商而异 (Badger ADE, Elster, Master Meter 均使用 UI-1203) —— 请使用示波器进行验证。 ## 致谢 协议已确认识别为 Sensus UI-1203 / ECR。参考实现: [`rszimm/kmeter`](https://github.com/rszimm/kmeter), [`michlv/sensus_protocol_lib`](https://github.com/michlv/sensus_protocol_lib)。 ## 许可证 MIT
标签:sigrok, 应用安全, 水表, 物联网, 硬件, 逆向工具, 逻辑分析