现象是这样:
家里的网是电信的,小米设备按照步骤配置可以连得上家里的 Wifi,但是米家应用死活显示不出来设备。后来通过手机开跟家里 Wifi 同名热点可以完成注册步骤,在完成注册后就算关掉手机热点净水器也可以正常通过家里的 Wifi 连接到米家 App。
但是过了一两天以后设备在米家 App 里又会消失,需要重新开手机热点帮助连接,然后关掉手机热点家里的 Wifi 又可以正常使用一两天然后嗝屁。如此反复。另外如果在任何时候拔掉设备电源重新插上也是立马嗝屁。
净水器固件版本是最新的 1.3.9.0002
因为这个实在是太影响使用,所以花了一些时间调试并且找到了问题的根源。
先是确认 Wifi 信号没有问题。用手机在净水器位置测试,2.4Ghz 信号显示满格。然后在路由器上查找 DHCP 分配给设备的 IP,ping 可以 ping 通没有丢包现象,说明问题不是无线网络导致的。另外设备在米家 App 显示离线的时候,净水器的 Wifi 状态灯是蓝色长亮,说明的确成功连上 Wifi。
发现净水器在查询 ot.io.mi.com
的 A 记录地址。尽管路由器正确的回复了查询结果,净水器似乎并不买单不停的重试。也就是说因为某种原因净水器认为 DNS 查询失败,所以无法正常连接到小米云服务。
那小米的 DNS 记录到底有什么问题导致净水器无法处理呢?看一下:
在我家里用电信的 DNS 查询 ot.io.mi.com
,返回了 13 条 A,2 条 NS,21 条 NS 的 A 记录,一共 36 条 RR。虽然这个看起来不算多,但考虑小米净水器的 CPU 比较弱(或者固件有 bug ),可能没法处理这么多记录。
这个记录用 dig
看起来是这个样子:
;; QUESTION SECTION:
;ot.io.mi.com. IN A
;; ANSWER SECTION:
ot.io.mi.com. 900 IN A 110.43.87.254
ot.io.mi.com. 900 IN A 117.48.116.221
ot.io.mi.com. 900 IN A 117.48.116.228
ot.io.mi.com. 900 IN A 110.43.87.241
ot.io.mi.com. 900 IN A 124.251.58.178
ot.io.mi.com. 900 IN A 118.26.252.222
ot.io.mi.com. 900 IN A 118.26.252.218
ot.io.mi.com. 900 IN A 118.26.252.221
ot.io.mi.com. 900 IN A 117.48.116.217
ot.io.mi.com. 900 IN A 118.26.252.214
ot.io.mi.com. 900 IN A 110.43.87.240
ot.io.mi.com. 900 IN A 117.48.116.211
ot.io.mi.com. 900 IN A 110.43.87.239
;; AUTHORITY SECTION:
mi.com. 70076 IN NS ns4.dnsv5.com.
mi.com. 70076 IN NS ns3.dnsv5.com.
;; ADDITIONAL SECTION:
ns3.dnsv5.com. 170806 IN A 61.151.180.51
ns3.dnsv5.com. 170806 IN A 129.211.176.212
ns3.dnsv5.com. 170806 IN A 162.14.18.188
ns3.dnsv5.com. 170806 IN A 183.192.201.94
ns3.dnsv5.com. 170806 IN A 223.166.151.16
ns3.dnsv5.com. 170806 IN A 14.215.150.16
ns3.dnsv5.com. 170806 IN A 18.194.2.137
ns3.dnsv5.com. 170806 IN A 52.77.238.92
ns3.dnsv5.com. 170806 IN A 58.251.86.12
ns3.dnsv5.com. 170806 IN A 59.36.120.148
为了测试猜测,在路由器的 DNS 服务设定静态 DNS 记录,把 ot.io.mi.com
劫持并且只解析到其中一个 IP 地址,这样返回的 RR 从 36 条变成了 24 条:
;; QUESTION SECTION:
;ot.io.mi.com. IN A
;; ANSWER SECTION:
ot.io.mi.com. 600 IN A 110.43.87.239
;; AUTHORITY SECTION:
mi.com. 72804 IN NS ns3.dnsv5.com.
mi.com. 72804 IN NS ns4.dnsv5.com.
;; ADDITIONAL SECTION:
ns3.dnsv5.com. 169827 IN A 18.194.2.137
ns3.dnsv5.com. 169827 IN A 52.77.238.92
ns3.dnsv5.com. 169827 IN A 58.251.86.12
ns3.dnsv5.com. 169827 IN A 59.36.120.148
ns3.dnsv5.com. 169827 IN A 61.151.180.51
ns3.dnsv5.com. 169827 IN A 129.211.176.212
ns3.dnsv5.com. 169827 IN A 162.14.18.188
ns3.dnsv5.com. 169827 IN A 183.192.201.94
ns3.dnsv5.com. 169827 IN A 223.166.151.16
ns3.dnsv5.com. 169827 IN A 14.215.150.16
ns4.dnsv5.com. 172619 IN A 183.192.164.119
ns4.dnsv5.com. 172619 IN A 223.166.151.126
ns4.dnsv5.com. 172619 IN A 14.215.150.13
ns4.dnsv5.com. 172619 IN A 18.235.54.99
ns4.dnsv5.com. 172619 IN A 52.198.159.146
ns4.dnsv5.com. 172619 IN A 59.36.120.147
ns4.dnsv5.com. 172619 IN A 61.151.180.52
ns4.dnsv5.com. 172619 IN A 101.226.220.12
ns4.dnsv5.com. 172619 IN A 129.211.176.151
ns4.dnsv5.com. 172619 IN A 162.14.18.121
ns4.dnsv5.com. 172619 IN A 182.254.20.44
设置完了后小米净水器很快在米家里显示为在线,把电源拔了重启也完全正常。
为什么用手机开热点能用呢?猜测是因为手机是联通的网络,小米这个域名明显用了 GeoDNS (电信网络下返回的记录都是电信的 IP ),可能联通的服务器 IP 比较少,所以净水器能正常的解析。解析完了后设备把解析结果缓存一段时间,也就解释了为什么把热点关了还能用一两天而拔电重启马上就跪了。
解决方案:如果有类似问题的同学可以像我这样通过在路由器上劫持解析结果来暂时解决。彻底解决需要小米的人修改你们的权威记录,不要一下返回这么多 RR。或者升级固件让净水器支持处理这么多 RR 的 DNS 响应。
如果小米的同学需要更多信息,请跟我联系。我也可以提供完整的 tcpdump
抓包文件以帮助分析。