最近公司的ESP8266网关在项目现场出现一个很奇怪的问题,偶尔会出现设备连接不上网络,没有数据上报到云端。由于项目是使用在一些高档豪宅上面,现场还在施工,网络也是临时搭建的,特别不稳定,经常出现一段时间没有网络,之前跑过几次现场,排查的问题都是没有网络,或者网速很差导致连接不上服务器,所以没有放在心上,但是由于有好几个设备间都是出现了手机连接路由器的网络上网不错,但是网关就是连接不上网,后台看不到数据(同事描述),负责测试的同事一直督促着说老板的玻璃心快碎了,快点解决,没办法,又戴上安全帽,去了一趟现场,查看了下log信息,傻眼了,做网关那么多年,第一次看到DNS解析的服务器IP都错误了,log如下:
connected with 303303, channel 6(有所修改,删除了些没用的log)
dhcp client start...
ip:192.168.1.103,mask:255.255.255.0,gw:192.168.1.1
portlen=4dns m2m ip=10.0.0.1new local port is 34182
mqtt connect to ip10.0.0.1:1883
client->connState=10
TCP: Reconnect to 10.0.0.1:1883
TCP_RECONNECT_REQ errType=-9
看到这个log,我都傻眼了,DNS解析出来的服务器IP怎么是那个样子呢,和我们的服务器IP:123.56.xxx.xxx相差太远了,于是查看了下DNS那部分代码,我设置了一个2s定时器,如果解析不能OK,也就是没有返回值的话,那么就一直运行,这个导致造成了DNS域名攻击,有些DNS服务器返回错误的IP给网关,把这个问题反馈给了乐鑫,可惜官方也没遇到过,要我提交测试场景,晕,我自己都没遇到过,也就是那种奇葩的环境第一次遇到过,这个问题就卡在这里了,可以说和官方沟通也没结果,后来我自己想了一种折中的办法,有效的解决了。
因为网络也不是一直出现这种问题,绝大部分时间是没什么问题的,这个通过我们后台监控的数据绘制的曲线连贯性可以看出来。
对于DNS域名解析返回错误IP的解决办法:
模块第一次使用,DNS解析OK,连接服务器OK,那么服务器IP保存到FLASH,第二次出现DNS解析时,如果DNS解析OK,连接服务器FAIL,那么我接下来就拿保存到FLASH的IP连接服务器;
如果出现了DNS解析OK,连接服务器IP OK,如果是DNS解析的IP和保存的IP不同,那么我就更新FLASH里面的IP成最新的(说明服务器IP更换了)。
这个方法这段时间在施工现场测试后,目前没发现之前的问题,我自己用软件模拟也可以很好的解决DNS解析服务器IP错误的问题。
以下是测试后的log(已经修改过得):
mqtt connect to ip10.0.0.1:1883
client->connState=10
TCP: Reconnect to 10.0.0.1:1883
TCP_RECONNECT_REQ errType=-9
strore ip 123,56,xxx,xxx
client ip 10.0.0.1
client ip update 123.56.xxx.xxx
Free memory
new local port is 31543
mqtt connect to ip123.56.xxx.xxx:1883
TCP: Reconnect to: 123.56.xxx.xxx:1883
MQTT: Connected to broker 123.56.xxx.xxx:1883
client->connState=14
client->connState=14
receive data----4----------
client->connState-----14
MQTT: Connected to 123.56.xxx.xxx:1883
MQTT: queue subscribe, topic"xxx/xxxx", id: 1
pubserver_connect_ok
MQTT: queue subscribe, topic"xxx/xxxx", id: 2
server_save_ip 123,56,xxx,xxxx
MQTT: Sending, type: 8, id: 0001
receive data----5----------
client->connState-----17
MQTT: Subscribe successful,1
MQTT: Sending, type: 8, id: 0002
receive data----5----------
client->connState-----17
MQTT: Subscribe successful,2
总结:解决一个问题,不一定要从源头解决,如果从DNS解析错误那块死扣,我觉得很难有所突破,但是我上面那种方法就可以很好的解决掉上面那个问题,换个思考方式,说不定山重水复疑无路,柳暗花明又一村!ESP8266是一款性价比不错的芯片,不过也是有些问题,只要绕过去,还是不错的选择,好久没听到同事说老板玻璃心快碎了,快去现场解决,我的世界又可以安静一段时间了