最近在做一个采用SIM7600模块,做一个MQTT协议传输数据到服务器,这里我先简单介绍一下关于AT指令的流程,后面有时间我会详细介绍自己移植的底层MQTT协议在单片机上面的实现(用于某些模块没有内置关于MQTT的AT指令),这里我给大家推荐一个链接是中国移动的onenet平台的MQTT相关源码,他们给出了单片机的应用代码,需要的话可以自己去参考。还有就是别去相信网上和淘宝的什么开发板说什么实现了MQTT协议上传服务器,他就是抄的中国移动onene的代码,黑心商家啊(拿别人的开源成果来卖钱)。
下面介绍下关于SIM7600CE模块实现AT指令上传服务器的流程。关于HTTP、TCP/TP、以及UDP我就不介绍了,卖家的资料里都有详细的说明。
AT+CRESET //复位
OK
//开机输出信息
RDY
+CPIN: READY
SMS DONE
PB DONE
注意在进行复位后,大约需要15s时间的等待时间。等到完全输出开机信息后,向模块发送AT指令才会有效果。
//查询是否检测到卡
AT+CPIN?
+CPIN: READY
OK
//查询信号质量
AT+CSQ
+CSQ: 26,99
OK
//检测联网
AT+CREG?
+CREG: 0,1
OK
//检测4G网
AT+CGREG?
+CGREG: 0,1
OK
//设置 APN
AT+CGDCONT=1,"IP","CMNET"
OK
//确保第一个PDP上下文获取IP地址
AT+CGPADDR
+CGPADDR: 1,10.114.29.137
+CGPADDR: 2,0.0.0.0,0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
+CGPADDR: 3,0.0.0.0,0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
OK
//启动MQTT服务,激活PDP上下文
AT+CMQTTSTART
OK
+CMQTTSTART: 0
//获取客户
AT+CMQTTACCQ=0,"client test0"
OK
注意启动MQTT服务时,不能反复启动后,再启动。否则会报错。
//"tcp://116.247.119.165:5141”必须以“tcp://”开头。如果不包括端口,默认端口为1883。
//第3个参数是从客户机接收到的两条消息之间的时间间隔。当长时间没有消息发送到服务器时,客户端将发送一个保持活动的数据包。范围是从60s至64800s(18小时)。
//第4个参数清除会话标志。值的范围是从0到1,默认值是0。
0-服务器断开连接后必须存储客户端的订阅。这包括继续存储QoS1和QoS2个订阅主题的消息,以便在客户端重新连接时可以传递这些主题。服务器还必须在连接丢失时保持正在传输的飞行中消息的状态。必须保留此信息,直到客户端重新连接。
1-服务器必须放弃以前维护的有关客户端的任何信息,并将连接视为“干净”。当客户端断开连接。
//第5,6个参数分别为服务器的名字和密码
//MQTT连接服务器
AT+CMQTTCONNECT=0,"tcp://120.76.100.197:18831",60,1,"TEST","TEST"
OK
+CMQTTCONNECT: 0,0
这里也需要注意的是,连接到服务器后再次连接,会报错。
//订阅一个主题
AT+CMQTTSUB=0,3,1
>ISC //输入的主题
OK
+CMQTTSUB: 0,0
//发布一个主题
AT+CMQTTTOPIC=0,3
>ISC //发布的主题
OK
//发布消息
AT+CMQTTPAYLOAD=0,12
>youlangtest1 //发布的消息
OK
//发送服务器
AT+CMQTTPUB=0,1,60
OK
+CMQTTPUB: 0,0
//以下是订阅后的回执信息
+CMQTTRXSTART: 0,3,12
+CMQTTRXTOPIC: 0,3
ISC
+CMQTTRXPAYLOAD: 0,12
youlangtest1
+CMQTTRXEND: 0
//取消订阅主题
AT+CMQTTUNSUB=0,4,0
>ISC1
OK
+CMQTTUNSUB: 0,0
这里我使用了通信猫中的MQTT的调试软件的服务器通信猫调试助手。我测试的时候,不知道为什么有点小BUG,在调试软件那边只能显示接收一次推送,但是实际上每次都是推送成功了的。所以在测试中,我采用了先订阅主题,再发布自己的主题,来实现自发自收的效果进而测试。