背景

近日安装了 Smart Meter。

安装完毕后师傅发放了一部小屏幕,可远程观看读数。该设备开设了「当前读数」、「今日耗电」、「今日费用」、「每小时耗电柱状图」、「每日耗电柱状图」等板块,但是我们希望能够获得更长时间段的完整的历史读数并自行处理,以便更好地了解和优化家中的用电情况。

本文讨论英国用于电力和燃气的 Smart Meter,其他国家/地区或其他 Smart Meter 情况可能有所不同。

如果您也想要安装 Smart Meter,可联系您的 Energy Supplier 上门安装,通常是免费的。

搜集信息

电表

观察 Smart Meter,发现上面还加装了另一款设备,该设备上写有「SKU1 Cellular」和「ZigBee Certified product」,猜测该设备可能用于上报读数。

该设备左上角标有「WNC UBC-TN6」似乎是型号,搜索后除了 WNC 是制造商的名称外未获得有效信息。后在图片搜索中发现了一张 datasheet。其中指出,该设备叫做 Communications Hub,支持 2G / 3G 以及 ZigBee,背面有一个支持 ICHIS 的数据接口。

经搜索,发现英国的 Smart Meter 存在 SMETS1 和 SMETS2 两款标准。由于我是最近安装,应该是 SMETS2。

小屏幕

安装师傅将小屏幕移交给我时嘱咐过,该设备无需一直连接电源。于是我猜测该设备内置电池,遂询问该设备是否支持电池供电,得到了师傅的肯定。然而插电许久后拔掉电源,设备就黑了。经开盖检查,发现该设备颅内有可安装干电池的电池仓,确实支持电池供电。

小屏幕电源线看似一体实则可以靠大力拔出,拔出后发现是 USB Micro-B 接口。经测试可用普通 USB 电源和线缆供电。

搜索得知该小屏幕叫做 IHD(In-Home Display)。

浏览小屏幕的设置项,发现其支持 Wi-Fi,ZigBee,其中还有一个叫 Glowmarkt 的页面,进入需要登录,而登录凭据的文本框是锁死的。似乎是管理系统。

搜索 Glowmarkt,找到了这个页面,上面在售卖同款 IHD,售价 £64.99。上面指出这款设备不止是个 IHD,还是个 CAD(Consumer Access Device),还出现了「Real time electricity and gas monitoring through our Bright app or via APIs」、「Applications and SDK available」等喜人的字样。

Glow API

既然有 API 我们就来试试看呗。

Glowmarkt Energy Data Tutorial 最后一页链接了几个 Swagger 文档。和想象的不大一样的是,这个 API 是由公网上的服务器提供的而不是 CAD 提供的。经测试,给 CAD 断网数据就看不到了。

而且看起来这个东西的野心不止于电表读数,有一堆各种各样的资源和一套用户系统。似乎有些复杂。

其他方案

那么能不能不去 Glow 的服务器绕一圈呢?

现在我们知道数据的走向是:

  • Smart Meter ==(screen)==> Optical Sensor
  • Smart Meter ==(ICHIS)==> Communications Hub
  • Communications Hub ==(2G/3G)==> Data Communications Company ==> Energy Supplier
  • Communications Hub ==(ZigBee)==> IHD / CAD
  • IHD / CAD ==(screen)==> Optical Sensor
  • IHD / CAD ==(Wi-Fi / Internet)==> Glowmarkt ==> API Server ==> API Client

逐个考虑在各个环节读取的可能性:

  • 安装摄像头从电表屏幕上读取
    • 我的电表不在家里,给摄像头持续供电有困难。
    • 我的电表处于封闭房间内,通常无照明,获得清晰图像有困难。
    • 我的电表处于公共区域,取得安装摄像头的授权有困难。
    • 读数的自动识别存在一定的工程难度。
    • 费电。
  • 从 ICHIS 上读取数据
    • 不熟悉协议,需要学习。
    • 需要改动电表上的有线连接,存在法律风险。
    • 电表和 Communications Hub 均非我所有,弄坏了要赔。
    • 操作不当可能导致计费出错、供电中断、邻居停电、电器损坏、我被电死、发生火灾等不良影响。
  • 从 Communications Hub 到 DCC 的通信中截获数据
    • 不熟悉协议,需要学习。
    • 需要采购专门的无线设备,需要缴费。
    • 由于 Energy Supplier 通常不需要实时数据,这条路上的数据可能较为稀疏(如每天报告一次)。
    • 截获 3G 数据好像不那么容易。
    • 存在相当的工程难度。
  • 找 DCC / Energy Supplier 要数据
    • 没有听说有该项业务。
    • 还不如用 Glow API。
  • 通过 ZigBee 从 Communications Hub 读取数据
    • 不熟悉协议,需要学习。
    • 需要采购专门的无线设备,需要缴费。
    • 听说有加密,需要相关批准方可加入 HAN(Home Area Network)。
    • 存在相当的工程难度。
  • 安装摄像头从 IHD 上读取数据
    • 读数的自动识别存在一定的工程难度。
    • 一旦 IHD 屏幕熄灭或进入其他页面,需要手动恢复。
    • 费电。
  • 截获 CAD 向 Glowmarkt 上传的数据
    • 这个好诶

截获 CAD 向 Glowmarkt 上传的数据

我们来看看 CAD 到底上传了些啥。

在路由上 tcpdump 后观察到:

  • 时不时会发出 NTP 请求。走时准确很重要。
  • 时不时会主动和 154.51.148.12:443149.11.44.36:443 通过 TLS 1.2 讲点悄悄话,报文都不长。

看起来像是通过 HTTPS 报告数据。不知道怎么往里面装证书,看起来难办了。

不过先看看这俩 IP 是啥。筛选出 DNS 包,发现是 cc.28.e2.4c11ae.cad.sensornet.info。上去瞧一瞧:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
➜  ~ curl https://cc.28.e2.4c11ae.cad.sensornet.info
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
HTTPS-proxy has similar options --proxy-cacert and --proxy-insecure.

还是尊贵的自签证书,十年有效期,下个月到期。既然是自签证书,估计 CA 都写死在设备里了(也可能是十年前没钱买证书)。

![sensornet-certificate](../../../2021/02/sensornet-certificate.png)

强行打开发现是个 OpenResty 的欢迎页面,没什么东西。

![sensornet-openresty](../../../2021/02/sensornet-openresty.png)

那么这个奇怪的域名又是什么呢,发现他们有自己的 NS 服务器,dns1.sensornet.info - dns9.sensornet.info。随便试了几个发现 *.cad.sensornet.info 解析出来都是这俩 IP,也不知道前面那坨有啥用。

还是想试试看能不能偷看到传输的内容,于是打开 sslsplit 。由于懒得配路由,直接从本机分享一个 Wi-Fi 热点给 CAD。macOS 上没有 iptables,转发可用 pfctl 做,规则如下:

1
rdr pass on bridge100 proto tcp from ${CAD_IP} to any port 443 -> 127.0.0.1 port 8443

然后就成功了……

cad-protocol-wireshark

销售这款 IHD / CAD 的页面上写道「using the latest SSL technology for secure Internet communications.」。嗯,真安全。

这个协议也十分的简单。CAD 每隔几秒就向 https://cc.28.e2.4c11ae.cad.sensornet.info/zb02 POST 一个 json 对象,里面有电表读数 Energy Supplier 名称等信息,HTTP Header 中有设备序列号等信息。服务器收到后回复「200」。嗯,就是 HTTP Body 里有「200」三个字。

那么事情就简单了,我们只需要自己搞个假服务器随便挂个证书实现这个简单协议然后在路由器上把域名解析过去即可断开 CAD 的互联网连接。

当然,为了走时准确,我们也可以给它提供 NTP 服务。据观察,该设备喜欢用 0.pool.ntp.org - 3.pool.ntp.org。我们可以将他它们解析到本地 NTP 服务。或者粗暴一些将所有域名都解析到假服务器,并在上面同时提供 HTTPS 和 NTP 服务。或者,更简单一些,直接丢弃报文中的时间而用收到报文时的系统时间替代。

思考

  • Glowmarkt Energy Data Tutorial 中将 octopus energy 列为 Glow 的一种 End User Applications。是 octopus 开发了一款前端 app 还是他们用的这个不可靠不安全的数据来对峰谷电用户计费呢?