一个联网设备,使用单片机+3G模块进行通讯,其中使用3G模块的HTTP协议和服务器进行交互,使用HTTP进行长连接定时发送心跳包。实际联网测试发现,无法保持长久在线状态,每隔1个小时会断几次,之后单片机客户端马上重连,有时重连很快,有时很慢。
分析:怀疑TCP关闭的异常处理不好,根据TCP四次握手过程,很可能出现单片机端http网络程序在TCP未正常关闭时,就去建立新的连接,这时客户端原有长连接很可能会处于倒数第二次FIN-WAIT-2状态,这时服务器认为客户端还没有关闭。客户端重新进行连接过程,则会出现长时间等待即最后一次握手关闭等待,这时可能最长等待时间会到5-6分钟,然后才能重新建立连接。
解决思路:
1、分析客户端和服务器段HTTP长连接代码,找到其中对异常情况处理不好的地方进行完善。
2、假如思路1解决不了,就得考虑重新设计长连接交互方案,使用TCP进行长连接定时发心跳包,客户端和服务器对11种TCP状态的异常处理做充分考虑与设计;另外使用http进行短连接交互数据。
3、一般http库不带TCP状态返回,这时建议使用TCP长链接;假如自己封装的http库,则可以增加TCP状态,在此基础上则可以使用http进行长连接。
嵌入式工控类产品,需要保证高可靠性,抗干扰与自恢复能力。关于自恢复能力,重要的是设计好看门狗策略,根据逐步摸索的经验,比较完整的看门狗策略是:第一级硬件看门狗,其作用为避免电磁干扰,散热问题等导致系统直接死机,同时保证boot阶段和kernel阶段死机可以实现自恢复;第二级CPU内部看门狗,其主要作用监控系统应用和大部分内核异常导致死机情况,并能自恢复;第三级应用看门狗,一些业务应用软件避免自身异常退出或进程死掉,无法自恢复问题。