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

news2024/11/26 8:59:20


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

前言:本节实现,硬件连接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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1357646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net core使用gb2312编码

nuget包 安装System.Text.Encoding.CodePages 使用 //将byte[]转化为gb2312的字符串,要确保byte[]是存储的gb2312的字符串,要不然会乱码 string ToGb213(byte[] str) {//首先需要注册Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)…

Tableau 各版本安装指南

Tableau下载链接 https://pan.baidu.com/s/1h43aEuSxxkOOa_JPwW_CDg?pwd0531 1.鼠标右击【Tableau2023(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Tableau2023(64bit)】。 2.打开解压后的文件夹,鼠标右击【Setup】…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

PythonStudio=vb7国人写的python可视化窗体设计器IDE,可以替代pyqt designer等设计器了

【免费】PythonStudio-1.1.5-x86最新版国人开发的python界面ide&#xff0c;可以制作窗体资源-CSDN文库https://download.csdn.net/download/xiaoyao961/88688447 【免费】PythonStudio-1.1.5-x64-Setup.exe国人开发的python界面ide&#xff0c;可以制作窗体资源-CSDN文库https…

2023 北京国炬软件年度总结—JeecgBoot与敲敲云

2023年对于北京国炬软件公司来说是一个充满成就和创新的一年。 我们成功推出了APass零代码平台—敲敲云&#xff0c;一款能够在5分钟内搭建应用的新一代零代码平台。自2023年1月1号正式上线以来&#xff0c;敲敲云已经突破了10万注册用户&#xff0c;并与数百家战略合作伙伴达…

prometheus与zabbix监控的对比介绍

一、普米与zabbix基本介绍 1、prometheus介绍 Prometheus的基本原理是Prometheus Server通过HTTP周期性抓取被监控组件的监控数据&#xff0c;任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式&#xff0c;就可以接入Prometheus监控。 工作流程大致分为收集数…

神经网络的核心:帮助新手理解 PyTorch 非线性激活函数

目录 torch.nn子函数非线性激活详解 nn.Softmin Softmin 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax Softmax 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax2d Softmax2d 函数简介 函数工作原理 输入…

谈谈我眼中的用户分层分析!

大家好&#xff0c;我是阿粥。 用户分层是几乎所有品牌都会思考的一个重要命题。 合理的分层能够帮助品牌有效提升用户的忠诚度。 这篇文章&#xff0c;我会带大家熟悉用户分层的基本概念、价值以及分层分析的思路。内容略干&#xff0c;在看的时候可以喝两口水。 同样&#xf…

新国大张阳教授团队开发精度远超AlphaFold的AI蛋白质互作结构预测算法

蛋白质是一类由20种不同氨基酸组成的大分子有机化合物&#xff0c;它们是生命体内各种生物活动的最主要的执行者。蛋白质的绝大多数生物学功能都是通过与其它蛋白质的相互作用来实现。因此&#xff0c;蛋白质-蛋白质相互作用&#xff08;简称‘蛋白质互作’&#xff09;在生命功…

C# OpenCvSharp DNN FreeYOLO 密集行人检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 密集行人检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- …

在 Linux 中开启 Flask 项目持续运行

在 Linux 中开启 Flask 项目持续运行 在部署 Flask 项目时&#xff0c;情况往往并不是那么理想。默认情况下&#xff0c;关闭 SSH 终端后&#xff0c;Flask 服务就停止了。这时&#xff0c;您需要找到一种方法在 Linux 服务器上实现持续运行 Flask 项目&#xff0c;并在服务器…

<HarmonyOS主题课>1~3课后习题汇总

&#xff1c;HarmonyOS第一课&#xff1e;1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件&#xff1f;&#xff08;B&#xff09; A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

JSP页面访问JDBC数据库的六个步骤

【例】创建exgample11_1.jsp页面&#xff0c;并在该页面中使用纯Java数据库驱动程序连接数据库test&#xff0c;并查询数据表goods中的数据。 <% page language"java" contentType"text/html;charsetUTF-8" pageEncoding"UTF-8"%> <% …

JVM工作原理与实战(六):类的生命周期-连接阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载&#xff08;Loading&#xff09; 2.连接&#xff08;Linking&#xff09; 3.初始化&#xff08;Initialization&#xff09; 4.使用&#xff08;Using&…

Linux学习(11)——进程的基本概念

目录 一、程序 1、什么是程序&#xff1f; 二、进程 1、什么是进程&#xff1f; 2、进程具有的特征 2.2进程&#xff0c;线程&#xff0c;协程 2.2.1 进程和线程的区别 2.2.2如何查看一个程序是多线程还是单线程 3、进程使用内存的问题 ①内存泄漏&#xff1a;Memory L…

航天航空线束工艺3D虚拟展馆支持多人异地参观漫游

为了满足汽车线束企业员工工作需要&#xff0c;让新老员工了解到更先进、规范的线束工艺设计技术&#xff0c;华锐视点基于VR虚拟仿真、web3d开发和图形图像技术制作了一款汽车线束工艺设计VR虚拟仿真模拟展示系统。 汽车线束工艺设计VR虚拟仿真模拟展示系统共分为pc电脑端和VR…

swing快速入门(三十八)进度条

&#x1f427;注释很详细&#xff0c;直接上代码 &#x1f414;新增内容 &#x1f95a;1.进度条的创建&#xff08;水平or垂直&#xff09; &#x1f95a;2.使用多线程模拟耗时操作以免阻塞主线程 &#x1f95a;3.进度条属性设置 &#x1f95a;4.复选框状态改变监听器 &am…

js object 去重

测试&#xff1a;数据 let arr [ { a: 1, b: 2 }, { b: 3, a: 4 }, { b: 2, a: 1 } ] 结果 function unique(arr) {const newArr [...arr]for (let i 0; i < newArr.length; i) {for (let j i 1; j < newArr.length; j) {if (this.duibi(newArr[i], newArr[j])) {ne…

【深度学习】各领域常用的损失函数汇总(2024最新版)

目录 1、L1 损失、平均绝对误差&#xff08;L1 Loss、Mean Absolute Error&#xff0c;MAE&#xff09; 2、L2 损失、均方误差&#xff08;L2 Loss、Mean Squared Error&#xff0c;MSE&#xff09; 3、交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 4、混合损失&…

【React系列】Redux(三) state如何管理

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer&#xff1a; function reducer(state ini…