STM32+ESP8266连接阿里云

 完整工程文件(百度网盘免费下载,提取码:0625)在文章末尾,需要请移步至文章末尾。

目录

宏定义配置

串口通信配置

消息解析及数据发送

ESP8266初始化

注意事项

完整工程文件


        经过基础教程使用AT指令连接阿里云后,大家应该对设备连接云平台的基本流程有所了解。接下来,我们将深入探讨如何通过STM32微控制器来配置和优化连接阿里云的过程。

        STM32提供了广泛的控制和定制选项,能够灵活应对复杂的物联网应用需求。利用STM32,我们能够实现高效且可靠的设备与阿里云之间的通信,支持各种复杂的数据传输和设备管理功能。


宏定义配置

        当使用STM32微控制器连接到阿里云时,通过宏定义可以显著提升代码的可读性和灵活性。在开始配置和编写代码之前,通常会定义一些初始宏来简化代码的编写和调试过程。

//WIFI配置
#define ESP8266_WIFI_INFO		"AT+CWJAP=\"ALIYUN\",\"12345678\"\r\n"

//阿里云证书配置
#define MQTT_CLIENT_ID  "j07fRDwyQJM.STM32D|securemode=2\\,signmethod=hmacsha256\\,timestamp=1720052943739|"
   
#define MQTT_USER_NAME   "STM32D&j07fRDwyQJM"

#define MQTT_PASSWD      "5c7858f8ec839caddb835afc8c9ea8351b1aa7867c05e8d84c8df4eaf9e88ae6"

#define ESP8266_CERT_INFO		"AT+MQTTUSERCFG=0,1,\""MQTT_CLIENT_ID"\",\""MQTT_USER_NAME"\",\""MQTT_PASSWD"\",0,0,\"\"\r\n"

//阿里云域名配置
#define MQTT_HOSTURL  "iot-06z00iurioijdlq.mqtt.iothub.aliyuncs.com"

#define ESP8266_ALIYUN_INFO		"AT+MQTTCONN=0,\""MQTT_HOSTURL"\",1883,0\r\n"

//数据下行                 
#define SUB_TOPIC        "/sys/j07fRDwyQJM/STM32D/thing/service/property/set"

#define ESP8266_SUBTOPIC_INFO		"AT+MQTTSUB=0,\""SUB_TOPIC"\",0\r\n"

//数据上行
#define PUB_TOPIC        "/sys/j07fRDwyQJM/STM32D/thing/event/property/post"

//上行数据
#define JSON_FORMAT      "{\\\"params\\\":{\\\"temp\\\":%d\\,\\\"humi\\\":%d\\}\\,\\\"version\\\":\\\"1.0.0\\\"}"		    

串口通信配置

        当配置STM32与阿里云通信时,串口数据处理函数是至关重要的一部分,用于处理从Wi-Fi模块或其他外设接收到的数据,并与阿里云进行通信。

unsigned char  esp8266_buf[256];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;


//==========================================================
//	函数名称:	ESP8266_Clear
//
//	函数功能:	清空缓存
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_Clear(void)
{

	memset(esp8266_buf, 0, sizeof(esp8266_buf));
	esp8266_cnt = 0;

}

//==========================================================
//	函数名称:	ESP8266_WaitRecive
//
//	函数功能:	等待接收完成
//
//	入口参数:	无
//
//	返回参数:	REV_OK-接收完成		REV_WAIT-接收超时未完成
//
//	说明:		循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{

	if(esp8266_cnt == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
		return REV_WAIT;
		
	if(esp8266_cnt == esp8266_cntPre)				//如果上一次的值和这次相同,则说明接收完毕
	{
		esp8266_cnt = 0;							//清0接收计数
			
		return REV_OK;								//返回接收完成标志
	}
		
	esp8266_cntPre = esp8266_cnt;					//置为相同
	
	return REV_WAIT;								//返回接收未完成标志

}

//==========================================================
//	函数名称:	ESP8266_SendCmd
//
//	函数功能:	发送命令
//
//	入口参数:	cmd:命令
//				res:需要检查的返回指令
//
//	返回参数:	0-成功	1-失败
//
//	说明:		
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
	
	unsigned char timeOut = 200;

	Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
	
	while(timeOut--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
			if(strstr((const char *)esp8266_buf, res) != NULL)		//如果检索到关键词
			{
				ESP8266_Clear();									//清空缓存
				
				return 0;
			}
		}
		
		delay_ms(10);
	}
	
	return 1;

}

消息解析及数据发送

        当处理来自阿里云平台的下行数据以及上行数据时,需要实现消息解析和向阿里云发送数据的功能,具体涉及MQTT消息的解析和处理。

//==========================================================
//	函数名称:	Json_Analysis
//
//	函数功能:	JSON数据解析
//
//	入口参数:	json_data:待解析数据
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void Json_Analysis(unsigned char *json_data)
{
	
	cJSON *JSON_Value;
	
	cJSON* root = cJSON_Parse((const char*)json_data);
	
	if(root == NULL)
	{
		UsartPrintf(USART_DEBUG,"cJSON_Error!\r\n");
	}
	else
	{
		cJSON* items = cJSON_GetObjectItem(root,"items");

		cJSON* lighting = cJSON_GetObjectItem(items,"lighting");
		
		JSON_Value = cJSON_GetObjectItem(lighting,"value");
		
		if(JSON_Value ->valueint)
		{
			UsartPrintf(USART_DEBUG,"OPEN_LED!\r\n");
			LED0 = 0;
		}
		else
		{
			UsartPrintf(USART_DEBUG,"CLOSE_LED!\r\n");
			LED0 = 1;
		}
	}
	cJSON_Delete(root);
}

//==========================================================
//	函数名称:	ESP8266_SendData
//
//	函数功能:	发送数据
//
//	入口参数:	无
//				
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_SendData(void)
{

	unsigned char cmdBuf[256];
	
	ESP8266_Clear();											//清空接收缓存
	
	sprintf((char *)cmdBuf,"AT+MQTTPUB=0,\""PUB_TOPIC"\",\""JSON_FORMAT"\",0,0\r\n",temp,humi);   //发送命令	
	
	while(ESP8266_SendCmd((char *)cmdBuf, "OK"));
	
	UsartPrintf(USART1,"temp:%d, humi:%d\r\n",temp,humi);		//调试串口打印
}

//==========================================================
//	函数名称:	ESP8266_ReceiveData
//
//	函数功能:	接收数据
//
//	入口参数:	timeOut:等待时间
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_ReceiveData(unsigned short timeOut)
{

	char *ptrMQT = NULL;
	
	unsigned int   msg_len=0;
	unsigned char  msg_body[256] = {0};
	
	do
	{
		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
		{
			ptrMQT = strstr((char *)esp8266_buf, "+MQTTSUBRECV:0");				//搜索“MQT”头
			if(ptrMQT == NULL)											//如果没找到,可能是MQT头的延迟,还是需要等待一会,但不会超过设定的时间
			{
				UsartPrintf(USART_DEBUG, "\"MQT\" not found\r\n");
			}
			else
			{
				sscanf((const char *)ptrMQT,"+MQTTSUBRECV:0,\""SUB_TOPIC"\",%d,%s",&msg_len,msg_body);
				
				//UsartPrintf(USART_DEBUG,"len:%d,msg:%s\r\n",msg_len,msg_body);
				
				Json_Analysis(msg_body);
			}
		}
		delay_ms(5);
		timeOut--;	
	} while(timeOut >0);
}

ESP8266初始化

        最后对ESP8266模块进行初始化,以确保它能够与STM32微控制器实现通信,为两者之间稳定的数据交换建立必要的基础。

//==========================================================
//	函数名称:	ESP8266_Init
//
//	函数功能:	初始化ESP8266
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_Init(void)
{
	
	ESP8266_Clear();
	
	UsartPrintf(USART_DEBUG, "0. RST\r\n");
	while(ESP8266_SendCmd("AT+RST\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "1. AT\r\n");
	while(ESP8266_SendCmd("AT\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "3. CWDHCP\r\n");
	while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "5. CONFIG CERT INFO\r\n");
	while(ESP8266_SendCmd(ESP8266_CERT_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "6. CONFIG ALIYUN NETWORK\r\n");
	while(ESP8266_SendCmd(ESP8266_ALIYUN_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "7. SUBSCRIBE TOPIC\r\n");
	while(ESP8266_SendCmd(ESP8266_SUBTOPIC_INFO, "OK"))
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "8. ESP8266 Init OK\r\n");

}

注意事项

        此外,当处理大量的JSON数据时,如果未调整栈的大小,可能会导致栈溢出问题,进而影响程序的运行结果,甚至导致程序崩溃。在这种情况下,需要手动调整栈的大小,以确保程序能够正常运行。

堆栈大小调整

  • 打开启动文件后,点击下方的Configuration Wizard,通过Option设置框调整堆栈空间的大小。建议将堆栈大小设置为以下数值:
Stack_Size      EQU     0x00000800

Heap_Size       EQU     0x00000400

完整工程文件​​​​​​​

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

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

相关文章

如何通过ip地址判断网络类别

在计算机网络中,IP地址不仅是设备在网络中的唯一标识,同时也隐含了网络类别的信息。了解如何根据IP地址判断网络类别,对于网络管理员、系统工程师以及网络爱好者来说都是一项基本技能。本文将详细介绍如何通过IP地址判断网络类别。 一、IP地址…

伦敦银交易平台价格的突破成不成功?这点很重要!

在伦敦银交易中,当银价出现突破的时候,也正是引起很多投资者关注的时候。一旦银价出现突破,很可能是新行情的开端。但是做过突破交易,有相关经验的朋友会发现,自己在伦敦银交易平台做突破的时候,也并不是每…

等保2.0中,云计算平台如何做到数据的分类和加密?

在信息化浪潮的激荡中,云计算平台已然成为企业智慧运作的心脏,承载着海量的数据资产。随着中国国家网络安全等级保护制度迈入2.0时代,对云计算平台的数据安全提出了更为严苛的要求。在这一背景下,如何巧妙地编织数据的分类之网&am…

MySQL的慢sql

什么是慢sql 每执行一次sql,数据库除了会返回执行结果以外,还会返回sql执行耗时,以mysql数据库为例,当我们开启了慢sql监控开关后,默认配置下,当sql的执行时间大于10s,会被记录到慢sql的日志文件…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具,支持中英日三种语言,语音处理接近人类水平,使用Flash-Attn算法处理大规模数据,提供高效、准确、稳定的TTS体验。 Fish Audio

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

Avalonia 常用控件四 Text Controls

1、AutoCompleteBox <StackPanel Margin"20"><TextBlock Margin"0 5">选择一种动物</TextBlock><AutoCompleteBox x:Name"animals" FilterMode"StartsWith"/><!--AutoCompleteBox:Items:要匹配的项目列表。…

如何检查 Windows 版本?这几种方法都可以查看

设置界面查看 要想查看电脑安装的 Windows 版本我们可以在设置界面进行查看&#xff0c;打开设置界面之后点击系统。 接下来在左边框中往下滑动&#xff0c;点击关于选项&#xff0c;然后在右边框中往下滑动找到 Windows 规格模块&#xff0c;在这里就可以看见安装的 Windows …

windows sshkeygen 多平台添加配置

文章目录 .ssh目录生成新的ssh配置添加公钥到仓库验证 .ssh目录 windows下一般为&#xff1a;C:\Users\15237.ssh &#xff0c;其中“15237”为当前登录用户 生成新的ssh .ssh目录下打开“Git Bash Here”&#xff08;如果没有&#xff0c;先安装 Git 软件&#xff09; 执行…

学会python——用python生成一个验证码(python实例二十)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.生成验证码 3.1 代码构思 3.2 代码实例 3.3 运行如果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&…

无人直播怎么玩,一文带你了解AI小姐姐自动换装玩法

最近经常有小伙伴问我 就是像这种&#xff0c;一刷礼物&#xff0c;小姐姐就换装的视频到底该怎么做 今天就来教大家 如何来制作这种直播视频 第一步&#xff1a;搭建OBS 1、设置屏幕分辨率&#xff1a; 背景&#xff1a;因为一般初始状态&#xff0c;屏幕是横屏的&#xf…

从零开始的python学习生活1

python函数的对返回值 本来多个return是不行的 这种语法就能接受多个返回值 def hanshu():return 1,"hello",True x,y,z hanshu() print(x) print(y) print(z)函数的多种传参方式 提前说明白了顺序就无所谓了 关键字传递一个传递参数&#xff0c;一个传递键值…

04-Haproxy搭建Web群集

理论讲解 Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS 和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂:Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff…

人员定位系统于不同场景的实际应用

人员定位系统的应用&#xff0c;尽管还没有做到大范围的普及&#xff0c;但是这一系统在不同企业&#xff0c;不同单位的实际应用效果还是很好的&#xff0c;所以人员定位系统也应用于不同场景当中了&#xff0c;那么&#xff0c;本文就来讲讲这一系统在不同场景的实际应用。 人…

CV每日论文--2024.7.3

1、HouseCrafter: Lifting Floorplans to 3D Scenes with 2D Diffusion Model 中文标题&#xff1a;HouseCrafter&#xff1a;使用 2D 扩散模型将平面图提升为 3D 场景 简介&#xff1a;HouseCrafter是一种新的方法,能够将平面图转换为完整的大型3D室内场景(如房屋)。它的关键…

软件架构之系统性能评价

软件架构之系统性能评价 第 5 章 系统性能评价5.1 性能指标5.1.1 计算机 5.1.2 网络5.3 性能设计5.3.1 阿姆达尔解决方案5.3.2 负载均衡 5.4 性能评估5.4.1 基准测试程序5.4.2 Web 服务器的性能评估5.4.3 系统监视 第 5 章 系统性能评价 系统性能是一个系统提供给用户的众多性…

80+ ChatGPT 文献综述指令

进行文献综述通常似乎是一项艰巨的任务。它是学术和研究工作的重要组成部分&#xff0c;涉及对先前发表的与特定主题相关的研究进行全面和批判性分析。目标是深入了解该主题的知识状况&#xff0c;找出差距&#xff0c;并为进一步研究奠定基础。 传统上&#xff0c;文献综述是…

idm 支持断点续传吗 idm 断点续传如何使用 idm断点续传怎么解决 idm下载中断后无法继续下载

断点续传功能&#xff0c;让我再也不会惧怕下载大型文件。在断点续传的帮助下&#xff0c;用户可以随时暂停下载任务&#xff0c;并在空闲时继续之前的下载进程。下载文件不惧网络波动&#xff0c;断点续传让下载过程更稳定。有关 idm 支持断点续传吗&#xff0c;idm 断点续传如…

Java:String 类

文章目录 一、概念二、创建字符串三、字符串长度四、连接字符串五、比较字符串 一、概念 字符串广泛应用 在 Java 编程中&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。 二、创建字符串 创建字符串最简单的方式如下: // 直接创…

C++ 面试宝典之:空类大小究竟是不是 0?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/pD4bIjX2kDzo8gbYRPktPQ 首先&#xff0c;空类是什么&#xff1f;空类指的是不包含任何数据成员的类&#xff0c;但可能包含方法成员。 实例化时…