跳到主要内容

EC800 4G TCP/UDP 通信(推荐)

前言:虽然在如今的物联网开发中,像MQTT,COAP这些专门为了物联网而诞生的协议逐渐成为主流,但其实TCP/UDP做为最基本的通信方式,依然可以解决大部分的物联通信需求。

一、本例程实现功能

Core通过EC800 4G Cat1模块和指定的服务器建立TCP连接,Core每10秒向服务器发送一个数据包(5字节),服务器每次收到这个5个字节的数据后会原封不动的回传这个5个字节数据给Core。

二、 Core提供的TCP/UDP功能介绍

Core已将TCP的操作封装成三个简单的API函数,分别为:LIB_Cat1TcpUdpEC800Config(),LIB_Cat1TcpUdpEC800Recv(),LIB_Cat1TcpUdpEC800Send()。您只需要调用这三个API即可将EC00 4G模块远程连接上server端开始收发数据。并且Core会自动处理通信中的异常情况并尝试重新恢复通信(比如和server的tcp连接异常断开,网络异常等),您无需考虑这些复杂的情况即可实现4G模块长期稳定的在线通讯。

在LIB_Cat1TcpUdpEC800Config()函数调用时只需将参数改成"TCP"或"UDP"即可实现对应的TCP或UDP功能,至于LIB_Cat1TcpUdpEC800Recv函数和LIB_Cat1TcpUdpEC800Send函数的调用,TCP和UDP时无差别。

三、接线图

layout

注意1:EC800 其他没到的引脚可以不用接。

注意2:上图中虽然是ML302,但和EC800完全兼容。

四、材料清单

名称推荐购买链接模块/芯片硬件资料下载
EC800 4G模块请联系我们flexlua.com 官网下载

product0

五、完整代码

Core通过EC800 4G模块和指定的服务器建立TCP连接,Core每10秒向服务器发送一个5字节数据包,服务器收到后返回同样的5字节数据。

--配置Core的USB口以虚拟串口模式工作,这样print()输出的内容就可以在电脑串口终端上显示了
LIB_UsbConfig("CDC")
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
--设置Cat1模块占用TX0、RX0、D5、D6引脚
--tcp服务器IP:"47.92.146.210" 端口号:8888
--心跳包间隔时间0秒(不使用心跳机制)。如果需要使用请在ApiDoc文档中查阅关于LIB_Cat1TcpUdpEC800Config函数的p8参数详细介绍
--TCP Client模式,如果要使用UDP,将"TCP"改成"UDP"即可
--不开启GPS功能,如果需要使用请在ApiDoc文档中查阅关于LIB_Cat1TcpUdpEC800Config函数的p10参数详细介绍
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中断回调函数
function LIB_10msTimerCallback()
cnt_10ms = cnt_10ms + 1
cnt1_10ms = cnt1_10ms + 1
end
--开始大循环
while(GC(1) == true)
do
--查询是否收到server下发的数据,如果收到就print输出收到的数据
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秒发送一包数据(1,2,3,4,5)给server
if cnt_10ms >= 1000 then --10000ms
cnt_10ms = 0
LIB_Cat1TcpUdpEC800Send(send_tab)
end
--每12秒打印一次Cat1模组状态信息(包含sim卡)
--注意:这里只是为了演示,实际应用中您可以根据您的需求查询即可,不需要一直查询
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
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

代码运行结果

Client端数据接收如下:

result1

六、搭建测试服务端

上面的数据回传服务器,是在阿里云上专门搭建的一个现成的TPC/UDP测试服务端,只负责将设备发来的TCP/UDP数据原封不动的回传下去,开发者可以用它来进行测试,但不能保证该服务器一直稳定可用。

  • TCP测试可用:47.92.146.210",8888
  • UDP测试可用:47.92.146.210",9999

当然最好的还是开发者自己搭建一个这样的测试服务器,或者用利用PC上的网络调试助手工具结合花生壳进行内网穿透来搭建一个测试服务器。