tjpaulsondev/sensus-iperl-decoder
GitHub: tjpaulsondev/sensus-iperl-decoder
通过 USB 逻辑分析仪和 sigrok 被动解码 Sensus iPERL 水表的 UI-1203 编码协议,实现低成本的本地用水量数据采集与记录。
Stars: 1 | Forks: 0
# sensus-iperl-decoder
[](LICENSE)


通过使用廉价的 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, 应用安全, 水表, 物联网, 硬件, 逆向工具, 逻辑分析