零門檻用幾行代碼實(shí)現(xiàn) EC800 4G TCP和UDP 通信(tcp8000)
EC800 4G TCP/UDP 通信(推薦)
本教程來源于 FlexLua 官網(wǎng),降低 IoT 硬件開發(fā)難度,零門檻 Lua 低代碼編程技術(shù)開發(fā) IoT 硬件。
前言:雖然在如今的物聯(lián)網(wǎng)開發(fā)中,像MQTT,COAP這些專門為了物聯(lián)網(wǎng)而誕生的協(xié)議逐漸成為主流,但其實(shí)TCP/UDP做為最基本的通信方式,依然可以解決大部分的物聯(lián)通信需求。
一、本例程實(shí)現(xiàn)功能
Core通過EC800 4G Cat1模塊和指定的服務(wù)器建立TCP連接,Core每10秒向服務(wù)器發(fā)送一個(gè)數(shù)據(jù)包(5字節(jié)),服務(wù)器每次收到這個(gè)5個(gè)字節(jié)的數(shù)據(jù)后會原封不動(dòng)的回傳這個(gè)5個(gè)字節(jié)數(shù)據(jù)給Core。
二、 Core提供的TCP/UDP功能介紹
Core已將TCP的操作封裝成三個(gè)簡單的API函數(shù),分別為:LIBCat1TcpUdpEC800Config(),LIBCat1TcpUdpEC800recv(),LIB_Cat1TcpUdpEC800Send()。您只需要調(diào)用這三個(gè)API即可將EC00 4G模塊遠(yuǎn)程連接上server端開始收發(fā)數(shù)據(jù)。并且Core會自動(dòng)處理通信中的異常情況并嘗試重新恢復(fù)通信(比如和server的tcp連接異常斷開,網(wǎng)絡(luò)異常等),您無需考慮這些復(fù)雜的情況即可實(shí)現(xiàn)4G模塊長期穩(wěn)定的在線通訊。
在LIBCat1TcpUdpEC800Config()函數(shù)調(diào)用時(shí)只需將參數(shù)改成"TCP"或"UDP"即可實(shí)現(xiàn)對應(yīng)的TCP或UDP功能,至于LIBCat1TcpUdpEC800Recv函數(shù)和LIB_Cat1TcpUdpEC800Send函數(shù)的調(diào)用,TCP和UDP時(shí)無差別。
三、接線圖
注意1:EC800 其他沒到的引腳可以不用接。
注意2:上圖中雖然是ML302,但和EC800完全兼容。
四、材料清單
- EC800 4G模塊
五、完整代碼
Core通過EC800 4G模塊和指定的服務(wù)器建立TCP連接,Core每10秒向服務(wù)器發(fā)送一個(gè)5字節(jié)數(shù)據(jù)包,服務(wù)器收到后返回同樣的5字節(jié)數(shù)據(jù)。
–配置Core的USB口以虛擬串口模式工作,這樣print()輸出的內(nèi)容就可以在電腦串口終端上顯示了
LIB_UsbConfig("CDC")
–使能系統(tǒng)10毫秒定時(shí)器開始工作
LIB_10msTimerConfig("ENABLE")
–設(shè)置Cat1模塊占用TX0、RX0、D5、D6引腳
–tcp服務(wù)器IP:"47.92.146.210" 端口號:8888
—心跳包間隔時(shí)間0秒(不使用心跳機(jī)制)。如果需要使用請?jiān)贏piDoc文檔中查閱關(guān)于LIB_Cat1TcpUdpEC800Config函數(shù)的p8參數(shù)詳細(xì)介紹
–TCP Client模式,如果要使用UDP,將"TCP"改成"UDP"即可
–不開啟GPS功能,如果需要使用請?jiān)贏piDoc文檔中查閱關(guān)于LIB_Cat1TcpUdpEC800Config函數(shù)的p10參數(shù)詳細(xì)介紹
LIB_Cat1TcpUdpEC800Config("UART0","D5","HIGH","D6","HIGH","47.92.146.210",8888,0,"TCP","NO_GPS")
–變量初始化
send_tab = {1,2,3,4,5}
cnt_10ms = 0
cnt1_10ms = 0
–定義10ms中斷回調(diào)函數(shù)
function LIB_10msTimerCallback()
cnt_10ms = cnt_10ms 1
cnt1_10ms = cnt1_10ms 1
end
–開始大循環(huán)
while(GC(1) == true)
do
–查詢是否收到server下發(fā)的數(shù)據(jù),如果收到就print輸出收到的數(shù)據(jù)
recv_flag,recv_tab = LIB_Cat1TcpUdpEC800Recv()
if recv_flag == 1 then
print(string.format("tcp client receive %d bytes", #recv_tab))
for k,v in ipairs(recv_tab) do
print(k,v)
end
end
–每6秒發(fā)送一包數(shù)據(jù)(1,2,3,4,5)給server
if cnt_10ms >= 1000 then –10000ms
cnt_10ms = 0
LIB_Cat1TcpUdpEC800Send(send_tab)
end
–每12秒打印一次Cat1模組狀態(tài)信息(包含sim卡)
–注意:這里只是為了演示,實(shí)際應(yīng)用中您可以根據(jù)您的需求查詢即可,不需要一直查詢
if cnt1_10ms >= 1200 then –12000ms
cnt1_10ms = 0
state,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery()
print(string.format("module state: %s", State))
print(string.format("module IMSI: %s", IMSI))
print(string.format("module ICCID: %s", ICCID))
print(string.format("module CSQ: %d ", CSQ))
end
end
如果感興趣,上面代碼中出現(xiàn)的LIB開頭的庫函數(shù)可以在 API文檔 中通過Ctrl F查詢。
代碼運(yùn)行結(jié)果
Client端數(shù)據(jù)接收如下:
六、搭建測試服務(wù)端
上面的數(shù)據(jù)回傳服務(wù)器,是在阿里云上專門搭建的一個(gè)現(xiàn)成的TPC/UDP測試服務(wù)端,只負(fù)責(zé)將設(shè)備發(fā)來的TCP/UDP數(shù)據(jù)原封不動(dòng)的回傳下去,開發(fā)者可以用它來進(jìn)行測試,但不能保證該服務(wù)器一直穩(wěn)定可用。
- TCP測試可用:47.92.146.210",8888
- UDP測試可用:47.92.146.210",9999
當(dāng)然最好的還是開發(fā)者自己搭建一個(gè)這樣的測試服務(wù)器,或者用利用PC上的網(wǎng)絡(luò)調(diào)試助手工具結(jié)合花生殼進(jìn)行內(nèi)網(wǎng)穿透來搭建一個(gè)測試服務(wù)器。