【完整流程】实现STM32+ESP8266+MQTT+阿里云+APP——【第二节-编写STM32程序初步实现ESP8266上云&发布订阅消息】

🌟博主领域:嵌入式领域&人工智能&软件开发

**前言:**本节实现,硬件连接STM32与ESP8266,编写STM32程序通过at命令方式实现STM32+ESP8266与阿里云物联网平台发布订阅消息,本节最终实现初步的发布订阅消息(能够发布消息给阿里云物联网平台但无外设数据,能够订阅阿里云物联网平台发送的消息来开关LED灯)。

硬件连接: 硬件连接STM32与ESP8266接线参考我的博文:接线-CSDN博客

串口通信程序: 参考我的博文:【程序】USART串口通信接收数据(标准库带printf)-CSDN博客

目录

1.编写STM32程序通过AT命令实现发布消息

2.编写STM32程序通过AT命令实现订阅消息


1.编写STM32程序通过AT命令实现发布消息

首先,通过第一节,你应该明白阿里云的MQTT连接参数也就是三元素,会使用很多次,本节也会继续使用。而且上一节你也明白AT命令的格式了,本节会使用与上一节不太一样的AT命令格式,本节的AT命令格式更加简单易懂。

1.获取MQTT连接参数(阿里云三元素)。

本节可直接通过如下方式获取三元素:进入阿里云物联网平台,再点击设备,再点击查看,再点击设备信息,再点击MQTT连接参数点击查看,复制参数信息(参数包括:用户名、密码、clientId、连接域名、port)。以上参数会在后续编写AT命令时使用到。

2.编写STM32程序AT命令来实现上云。

将第一步获取的MQTT连接参数(用户名、密码、clientId、连接域名、port)填写到如下AT命令格式处。如下七步实现设备上云(连接阿里云物联网平台),如下代码在main(void)里写入即可,亲测无误,可实现上云,需要注意在书写AT命令时注意以下两点:1."前面要加转义字符 。2.\前面要加转义字符。

复制代码
int main(void)
{
...//省略无关代码

/**
 * @brief	发送at指令,让ESP8266连接到阿里云,让设备在线
 * @ntoe	注意:   1."前面要加转义字符    2.\前面要加转义字符
 */
	//第一步,复位,只用一次  AT+RST
	printf("AT+RST\r\n");	
	Delay_ms(2000);	
	
	//第二步,模式,只用一次  AT+CWMODE=1
	printf("AT+CWMODE=1\r\n");	
	Delay_ms(3000);					
	
	//第三步  AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
	printf("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n");	
	Delay_ms(3000);					
	
	//第四步,连接wifi  AT+CWJAP="WiFi名字","WiFi密码"
	printf("AT+CWJAP=\"WiFi名字\",\"WiFi密码\"\r\n");	
	Delay_ms(5000);	
	
	//第五步  AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,""
	printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"用户名\",\"密码\r\n");
	Delay_ms(5000);				
	
	/* 第六步  AT+MQTTCLIENTID=0,"ClienId"   注意:clientId第二个参数注意每个逗号前加分隔符\  */
	printf("AT+MQTTCLIENTID=0,"ClienId" \r\n");
	Delay_ms(3000);	

	//第七步  AT+MQTTCONN=0,"连接域名",1883,1
	printf("AT+MQTTCONN=0,"连接域名",1883,1\r\n");
	Delay_ms(3000);	

...//省略无关代码
}

实现效果如下:在设备处,可看到当前设备由离线转为在线状态,即证明设备连接到阿里云物联网平台成功。

3. 编写STM32程序AT命令来实现发布指令。

继续main函数里的第七步后面写第八步和第九步,通过AT命令来实现订阅发布消息,亲测无误,需要注意三点:1."前面要加转义字符。2.\前面要加转义字符。3.标识符前后是三个\,如 \\\"标识符\\\"。

还需要注意,此处的两个指令, 订阅指令 AT+MQTTSUB=0,"topic",1 与发布指令AT+MQTTPUB=0,"topic","AJson格式内容",1,0 以上两个指令与第一节的书写格式一致,此处不再重复,忘记的童鞋请回到第一节获取你的订阅与发布指令。

需要注意,此处的订阅消息指令实际上并没有实现,但是先写上去便于后面使用并实现订阅消息。

复制代码
int main(void)
{
...//省略无关代码

/**
 * @brief       订阅发布指令
 * @ntoe      AT+MQTTSUB=0,"topic",1					//订阅指令
 *			  AT+MQTTPUB=0,"topic","AJson格式内容",1,0	//发布指令
 *				注意:1."前面要加转义字符    2.\前面要加转义字符  3.标识符前后是三个\,如 \\\"标识符\\\"
 */
	//第八步,订阅指令
	printf("AT+MQTTSUB=0,"写成你自己的"\r\n");		
	Delay_ms(5000);			//延迟
	
	//第九步,发json数据   {"标识符":1}
	printf("AT+MQTTPUB=0,"写成你自己的"r\n");		
	Delay_ms(5000);			//延迟

...//省略无关代码
}

实现效果如下:在监控运维处点击查看日志服务,可看到设备发布到阿里云物联网平台之间的消息,即实现了编写STM32程序AT命令来实现发布指令。

2.编写STM32程序通过AT命令实现订阅消息

在main函数中的while循环中写入如下代码,需要注意需要配置好串口通信程序(见我的博客【程序】USART串口通信接收数据(标准库带printf)-CSDN博客)。

复制代码
...//省略无关代码
while(1)
	{	
//---------------------------------------------------------
/**
 * @brief       订阅消息,判断阿里云发下来的json数据里是否有:0}与:1}
 * @ntoe      
 */		
		if(USART_RX_STA&0x8000)//判断接收到完整的字符串  完成
		{					   			
				
			if(strstr((const char*)USART_RX_BUF,":1}"))//判断阿里云发下来的json数据里是否有:1}
				{
						led1_on();	//LED=1 亮
				}
				if(strstr((const char*)USART_RX_BUF,":0}"))//判断阿里云发下来的json数据里是否有:0}
				{
						led1_off();	//LED=1	灭
				}	

				memset(USART_RX_BUF,0,600);         //将接收区清0
				USART_RX_STA=0;//标志位置0,退出if判断
		}	

...//省略无关代码
}	

需要注意,判断阿里云发下来的json数据里是否有:0}与:1},此处的:0}与:1}是在第一节出现过的,在第一节MQTT.fx测试订阅消息时候,通过MQTT.fx得到订阅消息时的回传消息,中有{"LED":0}与{"LED":1},通过这来判断阿里云发下来的json数据里是否有:0}与:1}

最终实现的效果是,点击进入监控运维,点击在线调试,可以看到实时的日志,设备可发布消息到阿里云物联网平台,设备可订阅阿里云物联网平台消息来控制LED灯的开关。

🌟个人主页:阿齐Archie

🌟个人vx公主呺:阿齐Archie

相关推荐
balance_rui3 小时前
FreeRTOS
笔记·stm32
LCG元3 小时前
STM32实战案例:基于HC-SR04的超声波测距与倒车雷达系统
stm32·单片机·嵌入式硬件
华清远见IT开放实验室4 小时前
智能手表完整项目实现,比赛求职双向加分,基于嵌入式大赛推荐开发板(STM32U5)
stm32·单片机·嵌入式硬件·学习·智能手表·嵌入式大赛
BackCatK Chen4 小时前
STM32保姆级入门教程|第8章:PT100高精度测温实战 + ADS1232驱动 + 24位ADC数据解析(功能超详细+CubeIDE手把手)
stm32·stm32cubeide·高精度测温·ads1232·pt100·24位adc·工业实战
危桥带雨4 小时前
FLASH理论基础
stm32·单片机·嵌入式硬件
进击的小头5 小时前
第18篇:嵌入式电机控制专用外设:正交编码脉冲模块原理与闭环控制应用
arm开发·单片机·嵌入式硬件
feifeigo1235 小时前
STM32 LCD彩色液晶屏显示汉字、英文、数字
stm32·单片机·嵌入式硬件
实在太懒于是不想取名7 小时前
STM32N6的开发日记(4):快速上手LTDC显示图片-让屏幕刷新丝滑流畅
stm32·单片机·嵌入式硬件
实在太懒于是不想取名7 小时前
STM32N6的开发日记(1):上手难度拉满的N6有哪些不同?
stm32·单片机·嵌入式硬件
LingLong_roar7 小时前
keil未指定 PY32F0 具体芯片型号导致编译报错及无法烧录问题
单片机·嵌入式硬件