32节点端通过4g通信发布mqtt主题,服务器mqtt订阅获取节点数据 (2)

5 篇文章 0 订阅
1 篇文章 0 订阅

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:

  1. 设置mqtt连接参数,目标4G模块,客户端口0-5随意选
AT+QMTCFG=     

用来配置4G模块的mqtt参数,有很多,等了解后可设置更多参数,如果服务器mqttbroker没设置,可以不用

  1. 打开阿里云服务器端:客户端端口,服务器ip,服务器mqtt的端口号
AT+QMTOPEN=0,"8.13.35.24",1883
正常回应为:
OK
+QMTOPEN: 0,0

  1. 在2命令发出后,尽快发出本条命令,否则可能会返回+QMTSTAT: 0,1 错误,就得重来一遍了
    命令解释:客户端端口号0,因为服务器上mqtt并未设置其它参数,所以这里写0
AT+QMTCONN=0,0
正常回应为:
OK
+QMTCONN: 0,0,0

  1. 如以上正确,则使用本条命令发布主题和内容:
    当qos为0 时,前面四个参数全为0,ni为发布的主题名,nihao为发布的内容
AT+QMTPUB=0,0,0,0,"ni","nihao"  
  1. 服务器订阅主题ni:接收到nihao 信息
mosquitto_sub -v -t ni

在这里插入代码片
在这里插入图片描述
6. 若不在发送消息,关闭客户端

AT+QMTDISC=0   断开客户端

  1. 串口助手发送命令及返回图:
    在这里插入图片描述

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(32);
  printff("发送云数据成功\r\n");

5.2 云服务器接收节点数据

因为之前忘了记录了,所以我的代码是采集了几个传感器的数据以json格式上传的,所以只能贴现在的数据图了,不过上面的思路没问题的
在这里插入图片描述

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
1. 连接ESP324G设备 将ESP324G设备连接起来,并确保它们的通信正常。 2. 安装MicroPython固件 将MicroPython固件烧录到ESP32上,可使用esptool或者其他工具。 3. 连接WiFi和MQTT服务器 使用MicroPython代码连接WiFi和MQTT服务器。以下是代码示例: ```python import network import mqtt import time wifi_ssid = "your_wifi_ssid" wifi_password = "your_wifi_password" mqtt_server = "your_mqtt_server" mqtt_port = 1883 mqtt_user = "your_mqtt_user" mqtt_password = "your_mqtt_password" station = network.WLAN(network.STA_IF) station.active(True) station.connect(wifi_ssid, wifi_password) while not station.isconnected(): time.sleep(1) print("Connected to", wifi_ssid) client = mqtt.MQTTClient("esp32", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_password) client.connect() ``` 4. 获取网络时间 使用MicroPython代码从NTP服务器获取网络时间。以下是代码示例: ```python import ntptime import time ntptime.settime() print("Current time:", time.localtime()) ``` 5. 发送时间到MQTT服务器 使用MicroPython代码将时间发布MQTT服务器。以下是代码示例: ```python import time while True: current_time = time.localtime() timestamp = time.mktime(current_time) client.publish("time", str(int(timestamp))) time.sleep(60) ``` 以上代码将每分钟发布一个时间戳到MQTT服务器的"time"主题。您可以根据需要更改发布时间间隔或主题名称。 完整代码示例: ```python import ntptime import network import mqtt import time wifi_ssid = "your_wifi_ssid" wifi_password = "your_wifi_password" mqtt_server = "your_mqtt_server" mqtt_port = 1883 mqtt_user = "your_mqtt_user" mqtt_password = "your_mqtt_password" station = network.WLAN(network.STA_IF) station.active(True) station.connect(wifi_ssid, wifi_password) while not station.isconnected(): time.sleep(1) print("Connected to", wifi_ssid) client = mqtt.MQTTClient("esp32", mqtt_server, port=mqtt_port, user=mqtt_user, password=mqtt_password) client.connect() while True: ntptime.settime() current_time = time.localtime() timestamp = time.mktime(current_time) client.publish("time", str(int(timestamp))) time.sleep(60) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌最俊朗-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值