阿里云 MQTT协议 AT指令 ESP8266-01S 数据上下传输

2023-10-24 14:40

本文主要是介绍阿里云 MQTT协议 AT指令 ESP8266-01S 数据上下传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

printf重定义资料来自江科大自动化协---<<stm32入门教程>>---<<串口发送+接收>>一节视频讲解

1、调试ESP8266

细节请看b站这个up主的视频阿里云+ESP8266+STM32远程点灯(流程讲解)

阿里云平台配置细节请看10分钟玩转阿里云物联网平台设备接入、管理、运维

这里只记录一下大概内容,方便日后调试。

1、用USB转串口工具连接ESP8266,先调通esp8266到阿里云端的线路(此步在后续调试esp8266时也尤为重要,因为这样不需要反复修改代码反复烧写,只需几个AT指令)

接线方式
ESP8266USB转串口工具
3.33.3
GNDGND
TXRX
RXTX

 注意:有时会出现接线正确发送不出指令的情况,网上查到的原因是,USB转串口工具输出的3.3V电压驱动能力不行,带不动ESP8266,可以更换其他稳定的供电设备,我手边没有万用表,没法测量验证,但是更换电源可以解决此问题;另外官方文件说ESP8266供电电压范围是3.0V-3.6V,我器件尝试接过5V电压,ESP8266没有烧坏,但发热明显,保守期间不要尝试此接法。

AT指令
AT
AT+RST重启模块
AT+RESTORE恢复出厂设置--擦除所有保存在flash中的参数
AT+CWMODE=1设置wifi模式-----AP模式
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"设置时域和SNTP服务器 
AT+CWJAP="wifiname","password" 连接AP
AT+MQTTUSERCFG=0,1,"NULL","username","passwd",0,0,""
AT+MQTTCLIENTID=0,"ClientId"
AT+MQTTCONN=0,"mqttHostUrl",1883,1
AT+MQTTSUB=0,"/{ProductKey}/{DeviceName}/user/get",1订阅自定义topic
AT+MQTTPUB=0,"/{ProductKey}/{DeviceName}/user/update","{\"temp\":50.5}",1,0发布自定义Topic
AT+MQTTSUB=0,"/sys/{ProductKey}/{DeviceName}/thing/service/property/set",1订阅物模型
AT+MQTTPUB=0,"/sys/{ProductKey}/{DeviceName}/thing/event/property/post","{\"params\":{\"EnvironmentTemperature\":35}}",1,0上报设备属性

Clientld需要在‘,’之前加转义字符 '\'

例:

指令中topic:

2、用stm32调试esp8266

接线方式
STM32ESP8266USB转串口工具
3.33.3
GNDGNDGND
RXTXRX
TXRX

可以使用面包板,对线路进行拓展,将ESP8266的TX同时接到STM32和串口工具的RX引脚,方便使用电脑的串口调试软件观察ESP8266的配置状态,方便调试。

ESP8266的初始化函数(用STM32的串口发送AT指令给ESP8266)

//初始化ESP8266连接到阿里云函数
void ESP8266_Init(void)
{OLED_ShowString(1,1,"loading...");//1Serial_String("AT+RST\r\n");ESP_FeedBack(1);Delay_ms(2000);//2Serial_String("AT+RESTORE\r\n");ESP_FeedBack(2);Delay_ms(2000);//3Serial_String("AT+CWMODE=1\r\n");ESP_FeedBack(3);Delay_ms(2000);//4Serial_String("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n");//加转义字符ESP_FeedBack(4);Delay_ms(3000);//5Serial_String("AT+CWJAP=\"LAPTOP\",\"asdfghjkl\"\r\n");//加转义字符ESP_FeedBack(5);Delay_ms(3000);//6Serial_String("AT+MQTTUSERCFG=0,1,\"NULL\",\"ESP8266-01&ibln7d8PcHp\",\"e0ae924e8007d0259c7a7d31bd3f01fd1bfdc270b8e689fa757e4f23de4cccb4\",0,0,\"\"\r\n");ESP_FeedBack(6);Delay_ms(5000);//7Serial_String("AT+MQTTCLIENTID=0,\"ibln7d8PcHp.ESP8266-01|securemode=2\\,signmethod=hmacsha256\\,timestamp=1679206129784|\"\r\n");ESP_FeedBack(7);Delay_ms(5000);//8Serial_String("AT+MQTTCONN=0,\"iot-06z00ehfqvp2bgm.mqtt.iothub.aliyuncs.com\",1883,1\r\n");ESP_FeedBack(8);Delay_ms(5000);//9
//	Serial_String("/ibln7d8PcHp/ESP8266-01/user/get\",1\r\n");
//	ESP_FeedBack(9);
//	Delay_ms(5000);//10订阅物模型Serial_String("AT+MQTTSUB=0,\"/sys/ibln7d8PcHp/ESP8266-01/thing/service/property/set\",1\r\n");ESP_FeedBack(9);Delay_ms(5000);}

ESP8266日志接收函数(STM32接收ESP8266发送回来的日志数据,分析数据做出初始化反馈)

//查看错误反馈函数
void ESP_FeedBack(uint8_t t)
{Delay_ms(1000);if( strstr((const char *)ESP8266_To_Serial,"ERROR") ){Refresh_DMA();//刷新DMA缓冲区以及计数器memset(ESP8266_To_Serial,0,100);//将数组清零OLED_ShowString(2,1,"ERR:");OLED_ShowNum(2,4+t,t,1);}
}

main.c

int main(void)
{	OLED_Init();Serial_Init();//初始化串口2配置USART_DMA_Init();//初始化DMA转运USART2_RX配置ESP8266_Init();//ESP8266连接服务器while(1){i++;//一次发送多个物模型数据printf("AT+MQTTPUB=0,\"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post\",\"{\\\"params\\\":{\\\"EnvironmentTemperature\\\":%d},\\\"LightLux\\\":%d,\\\"AirSpeed\\\":%d}}\",1,0\r\n",i,i+1,i+2);//一次发送一个物模型数据printf("AT+MQTTPUB=0,\"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post\",\"{\\\"params\\\":{\\\"LightLux\\\":%d}}\",1,0\r\n",i);
//		printf("AT+MQTTPUB=0,\"/sys/ibln7d8PcHp/ESP8266-01/thing/event/property/post\",\"{\\\"params\\\":{\\\"LightLux\\\":%d}}\",1,0\r\n",i);Delay_ms(10000);//延时10秒}
}

请求数据格式要求:

 

发送数据时需要使用变量,若直接使用串口发送函数,则不能存在变量,因此解决此问题需要重定义printf函数实现。步骤如下:

1、在keil中使用printf之前需要线设置一下

2、 打印函数

方法一:重定向printf

将printf打印的东西输出到串口

重写fputc()函数,因为printf函数使用时也是调用fputc函数一个个的打印。fputc函数发送到串口,printf函数自然也就打印输出到了串口

重写fputc函数:

#include <stdio.h>int fputc(int ch,FILE *f)
{Serial_SendByte(ch);//这里调用自己写的串口发送字节函数return ch;
}//主函数
void main(void)
{printf("NUm=%d\n",666);while(1){}}

方法二:用sprintf函数(此处是实现打印到串口的第二种方法)

sprintf函数不需要重定义,因为此函数第一个参数是指定打印位置

sprintf函数作用是把格式化字符输出到一个字符串里

#include <stdio.h>char string[100];//定义一个足够大的缓存空间sprintf(string,"NUM=5d\n",666);//输出到string中

方法三:封装sprintf函数(此方法用到了可变参数列表,记录下来只是学习一下)

void Serial_printf(char *format,...)
{char string[100];va_list arg;//存放可变参数列表的变量va_start(arg,format)//从format开始存放参数列表到arg中vsprintf(string,format,arg);//打印格式   这里up解释是sprintf只能接收直接写的参数va_end(arg);//释放arg空间Serial_SendByte(string);//调用自己写的串口发送字节函数
}

keil修改一下配置

这篇关于阿里云 MQTT协议 AT指令 ESP8266-01S 数据上下传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275888

相关文章

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU