电子说
本文说的所谓的心跳包就是(探测性的)数据包,之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
最大的作用就一句话,就是告诉服务器:
我还活着,别给我踢下线了。
1.为什么需要心跳?
4G物联网设备受限于自身工作环境的影响,极有可能发生网络不稳定的情况。
例如:
人多的环境中,为了保证人联网的及时性,物联网设备的通讯优先级会被运营商调低,极有可能出现多个物联网设备互相竞争4G通讯通道,或者与手机等人联网设备竞争网络通道的情况。
再比如:
野外环境下,本身就人烟罕至的地方,运营商基站覆盖弱。
又或者:
半夜运营商降低基站发射功率来省电,或者半夜进行基站的维护。
还有可能:
服务器遇到特殊情况进行维护升级,没有及时通知物联网设备,导致设备一直进行重连/数据重传等操作,耗尽了物联网卡的流量。
以上等等诸如此类的意外情况,都会使本来正常环境下能联网的4G物联网设备,突然断网,导致服务器长期收不到模组发过来的数据或者模组收不到服务器发过来的数据,进而导致数据延迟、丢失,最终导致用户资产受损。
所以在客户端/服务器设计之初,都会设计一个心跳机制,用来处理服务器/网络异常的情况。
▼ 4G模组心跳设置 ▼
如果使用AT固件:
可以参考如下指令设置心跳:
1)AT+CIPTKA
2)AT^HEARTCONFIG
具体的参数参考的AT指令集,可以设置心跳内容、心跳周期等。
如果使用LuatOS固件:
可以使用socket.config接口:
接口参数设置详见:
https://wiki.luatos.com/api/socket.html
也可以使用sys.timerLoopStart函数:
创建一个定时器,进行心跳包的传输。
2.推荐的心跳间隔
一般来说,人联网的设备,对实时性要求较高,所以一般人联网的设备,根据实际业务的实时性不同,一般心跳间隔时间也从5秒~40秒不等。
物联网设备的实时性要求大多数都不是很高,所以一般来说1分钟/2分钟/3分钟/5分钟也就够用了,可以根据真实的使用场景,以及服务器能够承载的冗余链路数量决定具体的心跳间隔。
如果你使用的是阿里云/腾讯云等可靠的物联网平台,也可以适当拉长自己的心跳周期。例如:阿里云物联网平台推荐的心跳为300秒以上,最长为1200秒。
值得一提的是,心跳间隔时间越短,同等时间内,模组耗电越多。为了节约流量和省电,对大多数物联网设备来说,并不是真的会在用户设定的心跳间隔时间时给服务器发送心跳——真正发送心跳包的间隔时间,往往是用户设置的1.5倍时长,这是心跳机制决定的。
3.如果不用心跳,服务器怎么设计
一般来说,用户使用的是TCP协议或者基于TCP的MQTT这种长连接协议。
如果客户对功耗比较看重,既希望能保持长连接,又不希望在没有数传的时候发送心跳数据导致功耗上升,可以与服务器进行协商,将定时的数据报文,当作应用层心跳报文。
如果上下两包数据接收时间小于设置的应用层心跳时间,则在下一包数据收到以后,检测心跳周期的定时器事件重置。注意:此种方式仅限于数传间隔较小(15分钟内)的情况。
当然,如果对数据传输的完整性不做严格要求,也可以将自己通讯协议改为UDP。
4.不用心跳方式的弊端
TCP协议层是有默认两小时的心跳机制,但是这会造成服务器有时需要处理大量的TCP冗余链接,所以一般服务器都会和客户端协商,启用应用层心跳。
如果没有服务器心跳,4G模组和4G基站之间也是需要一个心跳机制的——因为4G模组不是直接跟服务器连接的,而是通过NAT(即网络地址转换)与服务器连接,NAT就是网络地址转换。
NAT会维护一个映射表,这个映射表会定时检查。如果10分钟内这路socket跟服务器没任何数据往来,就会回收这路的地址,10分钟后应用上再发数据就找不到路由地址了,也就是常说的和服务器断开了链接;如果10分钟内有数据更新,计时器会重新置为10分钟。
如果不需要和模组保持长连接,且不怎么需要和服务器进行交互,半小时甚至更久:
那么可以考虑使用HTTP等链接方式,或者参考4G模组【PSM+超低功耗】教程。
分享完毕,欢迎关注
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !