现实用AIR202_S5最小系统板做一个小开发,配合移动的onenet物联网平台。
air202的开发使用lua脚本,对mqtt的配置如下:
上面的keepAlive单位是秒,也就是多少秒后发送心跳包来保持长连接。
设备启动后,一切正常,然而在10分钟(600秒)后,LuaTool界面提示错误日志如下:
[2018-10-23 08:42:06.827]: [I]-[mqtt.client:checkKeepAlive] pingreq send fail
[2018-10-23 08:42:06.827]: [D]-[mqtt.client:write] C000 2
[2018-10-23 08:42:06.827]: [W]-[socket.client:send] error 6, SEND FAIL
当出现上面错误提示的时候,AIR202会重连,也会连接成功,经过多次观察,发现重连成功后10分钟又再次出现该问题,这样是严重影响正常使用的。
上面问题周期性出现,且间隔都是10分钟,因此基本可以断定,是模组每隔600s发送心跳包,但是发送失败了。
模组使用的是移动的手机卡,考虑到mqtt是基于tcp的长连接,要想维持长连接必须间隔性的发送心跳包来告诉运行商,这个tcp连接我还要用,不要给我切断,所以怀疑是不是600秒发一次心跳包时间间隔太久了呢?
于是,将600s,修改为120s,也就是让模组每隔2分钟就发心跳包,然后进行测,问题得以解决。
总结:
[2018-10-23 08:42:06.827]: [I]-[mqtt.client:checkKeepAlive] pingreq send fail
[2018-10-23 08:42:06.827]: [D]-[mqtt.client:write] C000 2
[2018-10-23 08:42:06.827]: [W]-[socket.client:send] error 6, SEND FAIL
出现上面问题的原因,与模组无关,与onenet物联网平台无关,只跟自己程序里心跳包发送间隔时间太长有关,时间改短点。
有人会觉得心跳包间隔时间短,那发送频率高,多么浪费流量啊?其实不然,你长时间不发送数据,你即使发送几个字节,那么运营商也会按照1K来计算的。