前言:虽然在如今的物联网开发中,像MQTT,COAP这些专门为了物联网而诞生的协议逐渐成为主流,但其实TCP/UDP做为最基本的通信方式,依然可以解决大部分的物联通信需求。所以我们在选择物联网协议时,也没必要一味的追求人云亦云,尤其是新手容易产生一种误区,别人都用MQTT那我也要用MQTT,其实您要做的是静下心来了解TCP/UDP和MQTT或者COAP这样的协议在通信方式,架构上的区别,然后和您的服务端开发人员在一起商议,结合物联网设备数量规模、设备是否长时间在线以及服务器容量和部署成本等特性来决定用什么协议。
一、本例程实现功能
Core通过ML302 4G Cat1模块和指定的服务器建立TCP连接,Core每10秒向服务器发送一个数据包(5字节),服务器每次收到这个5个字节的数据后会原封不动的回传这个5个字节数据给Core。
注意:ML302-GNML型号是支持2G网络的,如果您使用的4G天线满足DCS1800频段(17101785MHz),那么在没有4G网络的环境时,模块会自动接入2G网络,这样就极大扩展了其应用范围。如果您只想用2G网络不用4G网络,可以将4G天线换成满足GSM900(880915MHz)频段的天线。
二、 Core提供的TCP/UDP功能介绍
Core已将TCP的操作封装成三个简单的API函数,分别为:LIB_Cat1TcpUdpConfig(),LIB_Cat1TcpUdpRecv(),LIB_Cat1TcpUdpSend()。您只需要调用这三个API即可将ML302 4G模块远程连接上server端开始收发数据。并且Core会自动处理通信中的异常情况并尝试重新恢复通信(比如和server的tcp连接异常断开,网络异常等),您无需考虑这些复杂的情况即可实现4G模块长期稳定的在线通讯。
在LIB_Cat1TcpUdpConfig()函数调用时只需将参数改成"TCP"或"UDP"即可实现对应的TCP或UDP功能,至于LIB_Cat1TcpUdpRecv函数和LIB_Cat1TcpUdpSend函数的调用,TCP和UDP时无差别。
三、接线图
五、完整代码
Core通过ML302 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_Cat1TcpUdpConfig函数的p8参数详细介绍
--TCP Client模式,如果要使用UDP,将"TCP"改成"UDP"即可
--不开启GPS功能,如果需要使用请在ApiDoc文档中查阅关于LIB_Cat1TcpUdpConfig函数的p10参数详细介绍
LIB_Cat1TcpUdpConfig("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_Cat1TcpUdpRecv()
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_Cat1TcpUdpSend(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
代码运行结果
(1)实际接线图如下:
(2)Client端(Core)数据接收如下:
六、搭建测试服务端
上面的数据回传服务器,是在阿里云上专门搭建的一个现成的TPC/UDP测试服务端,只负责将设备发来的TCP/UDP数据原封不动的回传下去,开发者可以用它来进行测试,但不能保证该服务器一直稳定可用。
TCP测试可用:47.92.146.210",8888
UDP测试可用:47.92.146.210",9999
当然最好的还是开发者自己搭建一个这样的测试服务器,或者用利用PC上的网络调试助手工具结合花生壳进行内网穿透来搭建一个测试服务器,花生壳内网穿透已经在之前的《NBIOT TCP通信》中介绍过了,这里就不赘述了。
更多详情请参看 shineblink.com官网链接