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 0x00000800Heap_Size EQU 0x00000400
完整工程文件
相关文章:

STM32+ESP8266连接阿里云
完整工程文件(百度网盘免费下载,提取码:0625)在文章末尾,需要请移步至文章末尾。 目录 宏定义配置 串口通信配置 消息解析及数据发送 ESP8266初始化 注意事项 完整工程文件 经过基础教程使用AT指令连接阿里云后…...

shark云原生-日志体系-ECK
文章目录 0. ECK 介绍1. 部署 CRDS & Opereator2. 部署 Elasticsearch 集群3. 配置存储4. 部署示例 0. ECK 介绍 ECK(Elastic Cloud on Kubernetes)是Elasticsearch官方提供的一种方式,用于在Kubernetes上部署、管理和扩展Elasticsearch…...

第二次作业
一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 一、数据库(步骤) 1、登陆数据库 mysql -hlocalhost -uadmin -p123456 2、创建…...

Java8 新特性stream、forEach常用方法总结
1、去重 List<Long> list new ArrayList<>();list.add(1L);list.add(2L);list.add(3L);list.add(3L);list.stream().distinct().collect(Collectors.toList()); 2、筛选出符合条件的数据 1)单条件筛选 筛选出性别为男的学生: List<…...

C语言4 运算符
目录 1. 算术运算符 2. 关系运算符 3. 逻辑运算符 4. 位运算符 5. 赋值运算符 6. 自增和自减运算符 7. 条件运算符(三元运算符) 8. 逗号运算符 9. sizeof 运算符 10. 取地址和解引用运算符 11.运算符的优先级 1. 算术运算符 (加法)࿱…...

【数据分析】Pandas_DataFrame读写详解:案例解析(第24天)
系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 文章目录 系列文章目录前言一、 读写文件数据1.1 读写excel文件1.2 读写csv文件1.3 读写mysql数据库 二、df查询数据操作2.1 查询df子集基本方…...

quill编辑器使用总结
一、vue-quill-editor 与 quill 若使用版本1.0,这两个组件使用哪个都是一样的,无非代码有点偏差;若需要使用表格功能,必须使用 quill2.0 版本,因为 vue-quill-editor 不支持table功能。 二、webpack版本问题 在使用 q…...

快手矩阵管理系统:引领短视频运营新潮流
在短视频行业蓬勃发展的今天,如何高效运营和优化内容创作已成为企业和创作者关注的焦点。快手矩阵管理系统以其强大的核心功能,为短视频内容的创作、发布和管理提供了一站式解决方案。 智能创作:AI自动生成文案 快手矩阵管理系统的智能创作…...

文心一言:探索AI写作的新境界
在人工智能飞速发展的今天,AI写作助手已经成为许多写作者、内容创作者和营销专家的重要工具。"文心一言"作为一个先进的AI写作平台,以其强大的语言理解和生成能力,为用户提供了从文本生成到编辑、优化等一系列服务。本文将介绍如何…...

认证资讯|Bluetooth SIG认证
在当今高度互联的世界中,无线技术的普及已经成为我们生活和工作中不可或缺的一部分。作为领先的无线通信技术之一,Bluetooth技术以其稳定性、便捷性和广泛的应用场景而备受青睐。然而,要想在激烈的市场竞争中脱颖而出,获得Bluetoo…...

我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品
我国静止无功发生器(SVG)市场规模逐渐扩大 高压SVG为主流产品 静止无功发生器(SVG)又称为静止同步补偿器、先进静止补偿器、静止调相机等,是利用全控型功率器件组成的桥式变流器来实现动态无功调节的一种先进无功自动补…...

【漏洞复现】用友U8 CRM downloadfile 任意文件读取漏洞
0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 /pub/downloadfile.php接囗处存在任意文件读取漏洞,未经身份验证的远程攻击…...

计算机网络 | 期末复习
物理层: 奈氏准则:带宽(w Hz),在不考虑噪音的情况下,最大速率(2W)码元/秒 信噪比S/N:以分贝(dB)为度量单位。信噪比(dB)…...

动手实操微软开源的GraphRAG
微软在今年4月份的时候提出了GraphRAG的概念,然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前,已有6900Star。 安装教程 官方推荐使用Python3.10-3.12版本,我使用Python3.10版本安装时,在…...

【网络安全】实验七(ISA防火墙的规则设置)
一、实验目的 二、配置环境 打开两台虚拟机,并参照下图,搭建网络拓扑环境,要求两台虚拟机的IP地址要按照图中的标识进行设置,并根据搭建完成情况,勾选对应选项。注:此处的学号本人学号的最后两位数字&…...

实验代码结构介绍
提高模型复用性,让模型对应的配置更加清晰,代码书写条理 学习自https://zhuanlan.zhihu.com/p/409662511 Project ├── checkpoints # 存放模型 ├── data # 定义各种用于训练测试的数据集 ├── eval.py # 测试代码 ├── loss.py # 定义的…...

Java多线程不会?一文解决——
方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例: class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…...

Mac上pyenv的安装及使用
Mac上pyenv的安装及使用 安装 brew update brew install pyenv 报错 git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallowgit -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow那就执行这2句 还报错 git -C /…...

【SpringBoot】IDEA查看spring bean的依赖关系
前因:研究springcloud config组件时,我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求,这引起了我的注意,我的问题是:EnvironmentController是怎么被添加进bean工厂的。本章就…...

项目代码优化(1)——下单逻辑
给一个电商开发的系统排查,发现漏洞很多。很多经验不够的开发者很容易忽视的逻辑错误陷阱。在给一个项目做二次开发时候,检测到的相关经典案例。这里整理支付和产品相关的逻辑,方便后续查看。,这里进行一些简单的逻辑漏洞梳理与修…...

探索 WebKit 的缓存迷宫:深入理解其高效缓存机制
探索 WebKit 的缓存迷宫:深入理解其高效缓存机制 在当今快速变化的网络世界中,WebKit 作为领先的浏览器引擎之一,其缓存机制对于提升网页加载速度、减少服务器负载以及改善用户体验起着至关重要的作用。本文将深入探讨 WebKit 的缓存机制&am…...

JVM:介绍
文章目录 一、什么是JVM二、JVM的功能1、解释和运行2、内存管理3、即时编译 三、常见的JVM四、Java虚拟机规范五、HotSpot发展历程 一、什么是JVM JVM的全称为Java Virtual Machine,Java虚拟机。本质上是一个运行在计算机上的程序,职责是运行Java字节码…...

和鲸“101”计划领航!和鲸科技携手北中医,共话医学+AI 实验室建设及创新人才培养
为进一步加强医学院校大数据管理与应用、信息管理与信息系统,医学信息工程等专业建设,交流实验室建设、专业发展与人才培养经验,6 月 22 日,由北京中医药大学(简称“北中医”)主办,上海和今信息…...

Linux 网络抓包工具tcpdump编译
tcpdump 的编译步骤 1. 下载源代码 访问 tcpdump 的官方网站(如:http://www.tcpdump.org/)下载最新的源代码压缩包,如tcpdump-4.9.2.tar.gz(注意版本号可能会有所不同)。 2. 解压缩源代码 使用 tar 命令…...

『C++成长记』string模拟实现
🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…...

【c++】C++ IO流
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...

解密智慧校园基础数据的学年管理功能
在智慧校园平台中,学年管理模块构成了教育活动有序运行的基石,它精心设计来适应多样化的学术日程,确保学校的各项事务都能在清晰规划的学年框架内顺利推进。这一核心功能不仅关乎时间的界定,更深层次地融入了教育管理的每一个细微…...

Python酷库之旅-第三方库Pandas(009)
目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …...

VPN 的入门介绍
VPN(虚拟专用网络) 简介 虚拟专用网络,简称虚拟专网(VPN),其主要功能是在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…...

移动UI: 什么特征会被认为是简洁风格,用案例告诉你
什么是简洁风格,恐怕一百个人有一百个是理解,本文通过理论分析案例的方式进行探讨。 移动 UI 中的简洁风格通常具有以下几个特征: 1. 平面化设计: 简洁风格的移动 UI 善于运用平面化设计,即去除过多的阴影、渐变和立…...