文章目录
1.前言
在前面文章已在云服务器上布置好mqttbroker,并未设置用户名密码啥的,加密啥的
云服务器环境: Linux centos
2. 4G通信模块
4G模块: EC800M-CN
移远通信的,指令和BC26差不多
重点:阿里云服务器的话,物联网卡一定使用移动的,我之前用电信的始终连接不上阿里云
3.模块AT指令
3.1 模块测试指令:
AT、 AT+CIMI AT+CSQ 等
3.2 mqtt相关指令
AT+QMTCFG MQTT 参数配置,选指令,连接发起前配置,如不配置则按默认值连接。
AT+QMTOPEN:打开 MQTT 客户端网络。
AT+QMTCLOSE:关闭 MQTT 客户端网络
AT+QMTCONN:连接 MQTT 服务器。
AT+QMTDISC:断开 MQTT 服务器。
AT+QMTSUB:订阅主题。
AT+QMTPUB:发布消息。
AT+QMTUNS:退订主题。
4.4G模块通过串口助手发送AT指令实现与服务器的mqtt间数据传输
在4G模块测试没问题的情况下,按以下步骤连接服务器mqttbroker:
- 设置mqtt连接参数,目标4G模块,客户端口0-5随意选
AT+QMTCFG=
用来配置4G模块的mqtt参数,有很多,等了解后可设置更多参数,如果服务器mqttbroker没设置,可以不用
- 打开阿里云服务器端:客户端端口,服务器ip,服务器mqtt的端口号
AT+QMTOPEN=0,"8.13.35.24",1883
正常回应为:
OK
+QMTOPEN: 0,0
- 在2命令发出后,尽快发出本条命令,否则可能会返回
+QMTSTAT: 0,1
错误,就得重来一遍了
命令解释:客户端端口号0,因为服务器上mqtt并未设置其它参数,所以这里写0
AT+QMTCONN=0,0
正常回应为:
OK
+QMTCONN: 0,0,0
- 如以上正确,则使用本条命令发布主题和内容:
当qos为0 时,前面四个参数全为0,ni为发布的主题名,nihao为发布的内容
AT+QMTPUB=0,0,0,0,"ni","nihao"
- 服务器订阅主题ni:接收到nihao 信息
mosquitto_sub -v -t ni
6. 若不在发送消息,关闭客户端
AT+QMTDISC=0 断开客户端
- 串口助手发送命令及返回图:
5. stm32节点端融合4G模块实现节点与服务器的数据传输
上面测试完成后只要把指令移到代码里就行了:可能会有些指令格式不太一样,注意一下
5.1关键代码
这里我重定向printf函数到uart4, uart4串口连接4G通信模块,
函数里的while循环都是验证返回信息的,如果你确定返回正常,也可以不验证,加上最好,初始化顺利完成后说明已经连接到服务器的mqtt了,下一步可以发布主题了。
void MQTT_Init(void)
{
Uart1_SendStr("进入初始化MQTT");
/* QMTCFG当你使用它进行加密啥设置用的,设置对象是4G模块,与服务器里mqttbroker设置的一样,当服务器中的mqttbroker没设置时,就用不到这个命令*/
//printf("AT+QMTCFG=\"aliauth\",0\r\n");/
//Delay_ms(300);
printf("AT+QMTOPEN=0,\"ip\",1883\r\n");//通过TCP方式去连接MQTT阿里云服务器
Delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//看下返回状态
while(strx==NULL)
{
Uart1_SendStr("MQTT3");
strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//确认返回值正确
}
Clear_Buffer();
printf("AT+QMTCONN=0,0\r\n ");//去登录MQTT服务器
Delay_ms(300);
strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态
while(strx==NULL)
{
Uart1_SendStr("conn返回失败");
strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//看下返回状态
}
Clear_Buffer();
}
在文件上方宏定义了发布主题:#define PubTopic "EC800"//发布主题
这里发布温湿度数据,调用时可以直接传入两个数字来测试
void aliyunMQTT_PUBdata(uint8_t temp,uint8_t humi,uint8_t pm1,uint8_t pm2,uint8_t pm10,float co)
{
Uart1_SendStr("进入发布数据函数");
uint8_t t_payload[200],len;
len=Mqttaliyun_Savedata(t_payload,temp,humi);//这里转为了json格式
t_payload[len]=0;
printf("AT+QMTPUBEX=0,0,0,0,\"%s\",%d\r\n",PubTopic,len);//发布主题
Delay_ms(300);
printf("%s",t_payload);
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUBEX: 0,0,0");//看下返回状态
while(strx==NULL)
{
strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUBEX: 0,0,0");//看下返回状态
}
Uart1_SendStr((char*)RxBuffer);
Delay_ms(500);
}
主函数:
MQTT_Init();
printff("初始化MQTT");
aliyunMQTT_PUBdata(3,2);
printff("发送云数据成功\r\n");
5.2 云服务器接收节点数据
因为之前忘了记录了,所以我的代码是采集了几个传感器的数据以json格式上传的,所以只能贴现在的数据图了,不过上面的思路没问题的