智能电表怎么远程抄表的?这个问题我好奇了很久。直到看到 rtlamr 这个开源项目才明白:你家电表每隔几秒就在 900MHz 频段广播一次自己的 ID 和读数,任何人在信号范围内都能收到——不需要对电表做任何操作,不需要接线,一台几十块的 USB 电视棒加一个开源工具就行。
这篇文章从 ERT 协议原理讲起,给出完整的硬件选型和命令行实测,最后说清楚边界(包括国内能不能用)。
ERT 协议:电表为什么自己往外广播
ERT(Encoder Receiver Transmitter)是 Itron 公司设计的智能抄表协议。电力公司抄表员不用进你家门——他们开车在小区兜一圈,车上的接收器就能把各家各户的读数全收走。原理就是电表自己在 900MHz ISM 频段持续广播。
消息类型一共有六种:
| 类型 | 报什么 | 典型用途 |
|---|---|---|
| SCM | 标准消费消息,只报总用量 | 基础抄表 |
| SCM+ | 精度更高,ID 更长 | 新型表计 |
| IDM | 过去 47 个 5 分钟间隔的用量 | 看用电曲线(最值得收) |
| NETIDM | 户用并网发电,用电+发电量 | 光伏户 |
| R900 / R900BCD | Neptune 水表,带漏水标记 | 水表 |
六种消息覆盖了电、水、气三种表。特别是 IDM,把 47 个 5 分钟采样点的数据一次报出来——你等于能看到一个家庭连续近 4 小时的用电曲线,几点开空调、几点关灯,一目了然。
前提说明:这是北美 Itron ERT 生态。中国智能电表走 DL/T 645 协议,不用 ERT,国内拿 RTL-SDR 收邻居电表大概率空手而归(后面细说)。
硬件:总投入七十块
- RTL-SDR USB 接收棒:本质是 USB 电视棒,RTL2832U 芯片,淘宝搜"RTL-SDR"¥30-¥50
- 900MHz 天线:¥15 左右
- 电脑:装 Go 1.21+,跑 rtlamr
rtlamr 是 Go 写的开源工具,2511 Star,作者 bemasher 从 2014 年维护到现在,一个人维护了 12 年。

三行命令跑起来
第一步:装 rtlamr
go install github.com/bemasher/rtlamr@latest
第二步:开两个终端
终端 A,启动 RTL-SDR 的 TCP 服务:
rtl_tcp
终端 B,启动 rtlamr:
rtlamr
两条命令零配置文件。首次运行自动扫描 900MHz 附近频段,锁定 ERT 信号后输出:
{Time:2024-01-01T12:00:00 SCM:{ID:12345678 Type:4 Tamper:{...} CRCValid:true Consumption:12345}}
纯文本一行一条消息,可以 > 重定向到文件,也可以管道给其他程序。
关键参数(实测常用)
rtlamr -h 能列出全部参数,常用的这几个值得记住:
# 只看指定电表 ID(比如你自己家的表)
rtlamr -filterid=12345678# 只收 IDM 消息(拿 5 分钟粒度用电曲线)
rtlamr -msgtype=idm# JSON 输出,方便接管道/程序处理
rtlamr -format=json# 去重:每个表只保留一条
rtlamr -unique=true# 指定接收时长后退出(脚本化采集)
rtlamr -duration=1h
参数说明(官方 wiki 原文):
-filterid:只显示逗号分隔 ID 列表中的电表消息-filtertype:只显示指定类型的消息-format:输出格式,plain/csv/json/xml-msgtype:接收的消息类型,all/scm/scm+/idm/netidm/r900/r900bcd-single:单次执行,配合-filterid时等每个表正好收到一个包-unique:抑制每个电表的重复消息-server:rtl_tcp 实例地址,默认127.0.0.1:1234
所有参数都能用环境变量覆盖,格式是 RTLAMR_参数名大写,比如 RTLAMR_MSGTYPE=idm——方便 systemd / docker 管理进程时注入配置。命令行参数优先级高于环境变量。
实测数据:25 分钟收到 900 个设备
作者在 README 里写了实测:NooElec NESDR Nano R820T + 原厂天线,25 分钟窗口稳定收到约 300 个电表的信号,间歇收到另外 600 个。
"稳定"的定义是预期 12 条消息至少收到 10 条,"间歇"是收到 3-9 条。这还是在典型的美国低密度社区测的——这个密度远超直觉。
每个数据包里有电表 ID、当前累计读数、时间戳;IDM 消息还有差分消费数据(过去几小时每个 5 分钟窗口的用量)。把数据画成曲线,能看出一个家庭的用电节奏。社区维护了一份 Google Sheets 收录实测兼容的表型,作者仓库里也有 meters.csv 按电、水、气分类。
数据管道:接入智能家居
rtlamr 社区已有 MQTT 桥接方案,数据流:
rtlamr → MQTT Broker → Home Assistant / Node-RED → InfluxDB → Grafana
-format=json 输出可以直接被桥接程序消费,从收数到可视化一整套管道都能搭起来。追踪家里哪个电器在偷电、关心光伏发了多少用多少、发现水管漏水而不是等账单——这是作者认证的"合乎伦理"用法。
边界与合规
rtlamr 是接收器,不是破解工具。它不发送任何信号、不篡改数据、不跟电表交互,只是被动监听 900MHz 频段的公开广播——法律上叫"非侵入式接收"。作者在 README 用一整段讲伦理边界,把用途明确分成"合乎伦理"(追踪自家电器耗电/光伏计量/漏水检测)和"不合乎伦理"(推断特定人生活规律并据此行动)两类。
协议是 AGPL v3.0:可以商用、可以修改,但网络使用也算分发,必须公开源码。
国内能用吗?
直接结论:国内智能电表走 DL/T 645,不是 ERT,收不到。但两个例外:
- 国内部分水表/燃气表会用 ISM 频段无线传输——如果表上有 FCC ID 标签或 Itron logo,有戏
- RTL-SDR 本身 ¥30-¥50 是通用工具:收 ADS-B 航班信号、FM 广播、业余无线电都能干,rtlamr 只是玩法之一,买了不亏
想验证自家表能不能收:找表上的 FCC ID 标签,跟仓库 meters.csv 或社区 Google Sheets 里的兼容表型对比一下。
总结
RTL-SDR + rtlamr 这条链路的价值在于:它把"智能电表数据"从电力公司的黑盒变成了空气中可被任何人接收的公开广播——七十块的成本,三行命令,就能亲眼看到自己家(甚至邻居家)的用电数据在空中流动。对无线电玩家来说,这既是 ERT 协议的一次完整实践,也是 RTL-SDR 众多玩法中门槛最低、反馈最直观的一个。
