AIR202模块配合ONENET平台发送心跳包失败问题

                        <p>现实用AIR202_S5最小系统板做一个小开发,配合移动的onenet物联网平台。</p><p>air202的开发使用lua脚本,对mqtt的配置如下:</p><div style="color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &quot;Courier New&quot;, monospace; line-height: 19px; white-space: pre;"><div><span style="color: #c586c0;">local</span> subTopic = <span style="color: #ce9178;">"/lock/176766/45967572/get"</span> <span style="color: #6a9955;">--设备端需要订阅的topic</span></div><div><span style="color: #c586c0;">local</span> mqttIp,mqttPort =  <span style="color: #ce9178;">"mqtt.heclouds.com"</span>,<span style="color: #ce9178;">"6002"</span> <span style="color: #6a9955;">--定义onenet的服务器域名和端口</span></div><div><span style="color: #c586c0;">local</span> clientId = <span style="color: #ce9178;">"xxx"</span> <span style="color: #6a9955;">--在onenet平台创建设备时,系统自动生成的设备id</span></div><div><span style="color: #c586c0;">local</span> userName = <span style="color: #ce9178;">"xxx"</span>  <span style="color: #6a9955;">--在onenet平台创建设备时,系统生成的产品id</span></div><div><span style="color: #c586c0;">local</span> passWord = <span style="color: #ce9178;">"xxxx="</span> <span style="color: #6a9955;">--onenet平台的APIkey</span></div><div><span style="color: #c586c0;">local</span> keepAlive = <span style="color: #b5cea8;">600</span>  </div></div><p><br></p><p>上面的keepAlive单位是秒,也就是多少秒后发送心跳包来保持长连接。</p><p>设备启动后,一切正常,然而在10分钟(600秒)后,LuaTool界面提示错误日志如下:</p><p>[2018-10-23 08:42:06.827]: [I]-[mqtt.client:checkKeepAlive]<span style="white-space:pre">    </span>pingreq send fail</p><p>[2018-10-23 08:42:06.827]: [D]-[mqtt.client:write]<span style="white-space:pre">    </span>C000<span style="white-space:pre">    </span>2</p><p>[2018-10-23 08:42:06.827]: [W]-[socket.client:send]<span style="white-space:pre">    </span>error<span style="white-space:pre">    </span>6, SEND FAIL</p><p><br></p><p>当出现上面错误提示的时候,AIR202会重连,也会连接成功,经过多次观察,发现重连成功后10分钟又再次出现该问题,这样是严重影响正常使用的。</p><p>上面问题周期性出现,且间隔都是10分钟,因此基本可以断定,是模组每隔600s发送心跳包,但是发送失败了。</p><p>模组使用的是移动的手机卡,考虑到mqtt是基于tcp的长连接,要想维持长连接必须间隔性的发送心跳包来告诉运行商,这个tcp连接我还要用,不要给我切断,所以怀疑是不是600秒发一次心跳包时间间隔太久了呢?</p><p>于是,将600s,修改为120s,也就是让模组每隔2分钟就发心跳包,然后进行测,问题得以解决。</p><p><br></p><p>总结:</p><p>[2018-10-23 08:42:06.827]: [I]-[mqtt.client:checkKeepAlive]<span style="white-space: pre;">    </span>pingreq send fail</p><p>[2018-10-23 08:42:06.827]: [D]-[mqtt.client:write]<span style="white-space:pre">    </span>C000<span style="white-space:pre">    </span>2</p><p>[2018-10-23 08:42:06.827]: [W]-[socket.client:send]<span style="white-space:pre">    </span>error<span style="white-space:pre">    </span>6, SEND FAIL</p><p>出现上面问题的原因,与模组无关,与onenet物联网平台无关,只跟自己程序里心跳包发送间隔时间太长有关,时间改短点。</p><p>有人会觉得心跳包间隔时间短,那发送频率高,多么浪费流量啊?其实不然,你长时间不发送数据,你即使发送几个字节,那么运营商也会按照1K来计算的。</p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><div><br></div><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p><p><br></p>

上次更新 2021-01-28