本文說(shuō)的所謂的心跳包就是(探測(cè)性的)數(shù)據(jù)包,之所以叫心跳包是因?yàn)椋核裥奶粯用扛艄潭〞r(shí)間發(fā)一次,以此來(lái)告訴服務(wù)器,這個(gè)客戶端還活著。事實(shí)上這是為了保持長(zhǎng)連接,至于這個(gè)包的內(nèi)容,是沒(méi)有什么特別規(guī)定的,不過(guò)一般都是很小的包,或者只包含包頭的一個(gè)空包。
最大的作用就一句話,就是告訴服務(wù)器:
我還活著,別給我踢下線了。
1.為什么需要心跳?
4G物聯(lián)網(wǎng)設(shè)備受限于自身工作環(huán)境的影響,極有可能發(fā)生網(wǎng)絡(luò)不穩(wěn)定的情況。
例如:
人多的環(huán)境中,為了保證人聯(lián)網(wǎng)的及時(shí)性,物聯(lián)網(wǎng)設(shè)備的通訊優(yōu)先級(jí)會(huì)被運(yùn)營(yíng)商調(diào)低,極有可能出現(xiàn)多個(gè)物聯(lián)網(wǎng)設(shè)備互相競(jìng)爭(zhēng)4G通訊通道,或者與手機(jī)等人聯(lián)網(wǎng)設(shè)備競(jìng)爭(zhēng)網(wǎng)絡(luò)通道的情況。
再比如:
野外環(huán)境下,本身就人煙罕至的地方,運(yùn)營(yíng)商基站覆蓋弱。
又或者:
半夜運(yùn)營(yíng)商降低基站發(fā)射功率來(lái)省電,或者半夜進(jìn)行基站的維護(hù)。
還有可能:
服務(wù)器遇到特殊情況進(jìn)行維護(hù)升級(jí),沒(méi)有及時(shí)通知物聯(lián)網(wǎng)設(shè)備,導(dǎo)致設(shè)備一直進(jìn)行重連/數(shù)據(jù)重傳等操作,耗盡了物聯(lián)網(wǎng)卡的流量。
以上等等諸如此類的意外情況,都會(huì)使本來(lái)正常環(huán)境下能聯(lián)網(wǎng)的4G物聯(lián)網(wǎng)設(shè)備,突然斷網(wǎng),導(dǎo)致服務(wù)器長(zhǎng)期收不到模組發(fā)過(guò)來(lái)的數(shù)據(jù)或者模組收不到服務(wù)器發(fā)過(guò)來(lái)的數(shù)據(jù),進(jìn)而導(dǎo)致數(shù)據(jù)延遲、丟失,最終導(dǎo)致用戶資產(chǎn)受損。
所以在客戶端/服務(wù)器設(shè)計(jì)之初,都會(huì)設(shè)計(jì)一個(gè)心跳機(jī)制,用來(lái)處理服務(wù)器/網(wǎng)絡(luò)異常的情況。
▼ 4G模組心跳設(shè)置 ▼
如果使用AT固件:
可以參考如下指令設(shè)置心跳:
1)AT+CIPTKA
2)AT^HEARTCONFIG
具體的參數(shù)參考的AT指令集,可以設(shè)置心跳內(nèi)容、心跳周期等。
如果使用LuatOS固件:
可以使用socket.config接口:
接口參數(shù)設(shè)置詳見:
https://wiki.luatos.com/api/socket.html
也可以使用sys.timerLoopStart函數(shù):
創(chuàng)建一個(gè)定時(shí)器,進(jìn)行心跳包的傳輸。
2.推薦的心跳間隔
一般來(lái)說(shuō),人聯(lián)網(wǎng)的設(shè)備,對(duì)實(shí)時(shí)性要求較高,所以一般人聯(lián)網(wǎng)的設(shè)備,根據(jù)實(shí)際業(yè)務(wù)的實(shí)時(shí)性不同,一般心跳間隔時(shí)間也從5秒~40秒不等。
物聯(lián)網(wǎng)設(shè)備的實(shí)時(shí)性要求大多數(shù)都不是很高,所以一般來(lái)說(shuō)1分鐘/2分鐘/3分鐘/5分鐘也就夠用了,可以根據(jù)真實(shí)的使用場(chǎng)景,以及服務(wù)器能夠承載的冗余鏈路數(shù)量決定具體的心跳間隔。
如果你使用的是阿里云/騰訊云等可靠的物聯(lián)網(wǎng)平臺(tái),也可以適當(dāng)拉長(zhǎng)自己的心跳周期。例如:阿里云物聯(lián)網(wǎng)平臺(tái)推薦的心跳為300秒以上,最長(zhǎng)為1200秒。
值得一提的是,心跳間隔時(shí)間越短,同等時(shí)間內(nèi),模組耗電越多。為了節(jié)約流量和省電,對(duì)大多數(shù)物聯(lián)網(wǎng)設(shè)備來(lái)說(shuō),并不是真的會(huì)在用戶設(shè)定的心跳間隔時(shí)間時(shí)給服務(wù)器發(fā)送心跳——真正發(fā)送心跳包的間隔時(shí)間,往往是用戶設(shè)置的1.5倍時(shí)長(zhǎng),這是心跳機(jī)制決定的。
3.如果不用心跳,服務(wù)器怎么設(shè)計(jì)
一般來(lái)說(shuō),用戶使用的是TCP協(xié)議或者基于TCP的MQTT這種長(zhǎng)連接協(xié)議。
如果客戶對(duì)功耗比較看重,既希望能保持長(zhǎng)連接,又不希望在沒(méi)有數(shù)傳的時(shí)候發(fā)送心跳數(shù)據(jù)導(dǎo)致功耗上升,可以與服務(wù)器進(jìn)行協(xié)商,將定時(shí)的數(shù)據(jù)報(bào)文,當(dāng)作應(yīng)用層心跳報(bào)文。
如果上下兩包數(shù)據(jù)接收時(shí)間小于設(shè)置的應(yīng)用層心跳時(shí)間,則在下一包數(shù)據(jù)收到以后,檢測(cè)心跳周期的定時(shí)器事件重置。注意:此種方式僅限于數(shù)傳間隔較小(15分鐘內(nèi))的情況。
當(dāng)然,如果對(duì)數(shù)據(jù)傳輸?shù)耐暾圆蛔鰢?yán)格要求,也可以將自己通訊協(xié)議改為UDP。
4.不用心跳方式的弊端
TCP協(xié)議層是有默認(rèn)兩小時(shí)的心跳機(jī)制,但是這會(huì)造成服務(wù)器有時(shí)需要處理大量的TCP冗余鏈接,所以一般服務(wù)器都會(huì)和客戶端協(xié)商,啟用應(yīng)用層心跳。
如果沒(méi)有服務(wù)器心跳,4G模組和4G基站之間也是需要一個(gè)心跳機(jī)制的——因?yàn)?G模組不是直接跟服務(wù)器連接的,而是通過(guò)NAT(即網(wǎng)絡(luò)地址轉(zhuǎn)換)與服務(wù)器連接,NAT就是網(wǎng)絡(luò)地址轉(zhuǎn)換。
NAT會(huì)維護(hù)一個(gè)映射表,這個(gè)映射表會(huì)定時(shí)檢查。如果10分鐘內(nèi)這路socket跟服務(wù)器沒(méi)任何數(shù)據(jù)往來(lái),就會(huì)回收這路的地址,10分鐘后應(yīng)用上再發(fā)數(shù)據(jù)就找不到路由地址了,也就是常說(shuō)的和服務(wù)器斷開了鏈接;如果10分鐘內(nèi)有數(shù)據(jù)更新,計(jì)時(shí)器會(huì)重新置為10分鐘。
如果不需要和模組保持長(zhǎng)連接,且不怎么需要和服務(wù)器進(jìn)行交互,半小時(shí)甚至更久:
那么可以考慮使用HTTP等鏈接方式,或者參考4G模組【PSM+超低功耗】教程。
分享完畢,歡迎關(guān)注
審核編輯 黃宇
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44580瀏覽量
372925 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9129瀏覽量
85350 -
NAT
+關(guān)注
關(guān)注
0文章
145瀏覽量
16236
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論