【完整流程】实现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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年阿里云服务器按年与按带宽活动价格出炉,最低仅需61元/1年

2024年阿里云服务器活动价格出炉了,新版活动价格表分为按年与按带宽两个价格表,按年最高可选择5年,按带宽可选择按量付费带宽和按固定带宽模式,按年活动价格最低61元/1年,按照带宽模式最低365.33元/1年,不同…

深情回忆VB编程之路

深情回忆VB编程之路 在上世纪90年代末,我与编程世界的初次邂逅始于QBasic这一古老而亲切的语言。那时的编程环境虽然简陋,但却蕴藏着无穷的可能性,每个字符仿佛跳跃着生命,在黑色屏幕中编织出我对编程世界最初的憧憬和梦想。 时光…

计算机网络学习笔记(5)——运输层

本文继续整理计算机网络体系架构知识内容。今日主讲——运输层。 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。 运输层提供了应用进程间的逻辑通信。运输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看 见的好像在两…

JavaScript基本使用方法

JavaScript 是一种脚本语言,常用于 Web 开发。这里是一些基本的使用方法: 声明变量: 在 JavaScript 中,可以使用 var、let 或 const 关键字来声明变量。例如: var age 25; let name "John"; const PI …

【51单片机】点亮第一个LED灯(含创建文件等基础操作)

51单片机现在不仅是电子信息专业学生的必修课,也是进入嵌入式领域的踏脚石。 本系列将会按照江科大的视频进行,也算是相当于一个笔记,进行巩固 实现第一个LED灯的点亮其实并不复杂,重要的是有一些准备工作比较繁琐,就…

Android RecyleView 使用 Gilde 加载图片引发的卡顿问题

Glide 是一个用于 Android 的图片加载和缓存库。它可以帮助开发者快速、高效地加载网络图片、本地文件和视频帧,并且能够自动缓存图片数据,减少网络请求。Glide 具有良好的性能和易用的 API,支持常见的图片加载需求,例如图片压缩、…

局部与整体的关联特性,如图所示

局部与整体的关联特性是指事物的局部部分与整体之间存在一定的关联关系。它强调整体是由局部构成,局部又反向影响整体。具体包括以下几个方面的特性: 互依性:局部与整体相互依赖,一个的变动会影响另一个的变动。局部的变化会对整体…

bootstrap5实现蛋糕店网页Bakery设计模板

一、需求分析 蛋糕店的网页通常是指蛋糕店的官方网站。这些网页的功能可以因店铺而异,但一般会包含以下内容: 主页:主页通常是网站的起点,展示店铺的品牌形象、特色蛋糕和推广信息。主页通常会设计成吸引人眼球、易于导航的页面。…

vue3 vuedraggable draggable element must have an item slot

vue3vite 看官网使用这种<template #item“{ element }”> <draggablev-model"myArray"start"onStart"end"onEnd":sort"false"item-key"id"draggable".item"handle".mover" ><template…

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…

机器视觉系统选型-镜头选型常见误区—焦距选择公式

视觉工程师在选择镜头时经常要用到一个公式来选择镜头的焦距。根据这个公式&#xff0c;如果 已知芯片大小、拍摄视野和工作距离的要求&#xff0c;可以算出镜头的焦距。在大部分情况下&#xff0c;这个 公式是可以用的。但这只是一个近似公式&#xff0c;有些情况下使用这个公…

广义双曲分布、KS检验与抄底沪指

上一篇笔记我们抛出一个问题&#xff0c;沪指大跌 4%时&#xff0c;能不能抄底&#xff1f;今天的笔记&#xff0c;我们就通过 KS 检验&#xff0c;找出沪指的概率分布&#xff0c;进而回答这个问题。在后面的笔记中&#xff0c;我们还将换一个方法继续回答这个问题。 K-S 检验…

Matlab/F#/R进行数据分析和建模算法的经验,vb.net输给他了

微软放弃了vb.net的开发&#xff0c;但是持续花费巨资投入F#,简单一看他的语法就是qbasic ,vb6一样。鹿死谁手&#xff0c;谁能相信vb.net竟然被f#给干掉了。外面有vb6语法的python成了全球第一的编程语言,内部还有强大的教授开发的这工具扯后腿。 有人说为什么中国搞不出像mat…

漏洞复现--天融信TOPSEC两处远程命令执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;5&#xff09; 2.2 HOST主桥 本节以MPC8548处理器为例&#xff0c;说明HOST主桥在PowerPC处理器中的实现机制&#xff0c;并简要介绍x86处理器系统使用的HOST主桥。 …

一文讲透Stata计量经济学中如何分中东西区域回归?

stata如何分中东西区域回归本质上是异质性检验。 异质性检验即针对样本进行分类分组&#xff0c;基于各组样本分别开展的实证检验。异质性检验通常在基准回归之后&#xff0c;基准回归依据的是全部的样本&#xff0c;当基准回归得到的结果较为显著&#xff0c;即核心解释变量显…

多线程基础入门【Linux之旅】——上篇【线程控制,线程互斥,线程安全】

目录 前文 回望页表 一&#xff0c;什么是线程 二&#xff0c;使用 pthread_create &#xff08;线程创建&#xff09; 三&#xff0c;线程控制 1 &#xff0c;线程共享进程数据&#xff0c;但也拥有自己的一部分数据: 2&#xff0c; 线程 VS 进程优点 3&#xff0c;…

服务器内存介绍

本篇文章用于介绍服务器内存&#xff0c;包括基本概念、内存演进、规格识别、内存条配置规则等 1、基本概念 服务器内存是指安装在服务器主板上的用于存储和处理数据的硬件组件。它是服务器中的主要性能关键因素之一&#xff0c;对于服务器的运行速度、多任务处理能力和数据处…

Linux 进程(九) 进程等待

子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏&#xff0c;所以父进程回收子进程是必然要做的。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill …

线性代数笔记6 1.4

学习视频&#xff1a; 2.2 矩阵运算&#xff08;二&#xff09;_哔哩哔哩_bilibili 包括内容&#xff1a; p23 3.2 线性相关线性无关 p24 3.3 向量的秩&#xff08;一&#xff09; p25 3.3 向量的秩&#xff08;二&#xff09; p26 4.1 线性方程组 p27 4.2 线性方程组有解…