阿里云 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

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发