必看内容!STM32使用ESP8266通过串口与阿里云物联网平台通信_8266连阿里物联网

在这里插入图片描述

在这里插入图片描述

四、使用串口助手发送AT指令连接物联网平台

  1. AT //返回 OK
  2. AT+RST //复位
  3. AT+RESTORE //恢复出厂设置
  4. AT+CWMODE=1 //设置模式,可连接wifi热点
  5. AT+CWJAP="WIFI名字","WIFI密码" //连接热点
    例如:AT+CWJAP="qjl","11111111"

★坑3:wifi名字必须为英文!!频率为2.4G!如果是苹果手机,在个人热点处打开–最大兼容性。

  1. AT+CWJAP? //检测是否连接上热点
  2. AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" //连接阿里云的网站
  3. //配置MQTT
    (1)设置用户名、密码
    使用指令:AT+MQTTUSERCFG=0,1,"NULL",“下图的用户名",“下图的密码”,0,0,""
    例如:AT+MQTTUSERCFG=0,1,"NULL","LED1&a1n2p8YJOux","2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b",0,0,""
    在这里插入图片描述
    (2) 设置clientld
    使用指令:AT+MQTTCLIENTID=0,"下图的clientld"
    例如:AT+MQTTCLIENTID=0,"a1n2p8YJOux.LED1|securemode=2\,signmethod=hmacsha256\,timestamp=1709691140893|"

★坑4:下图的clientld复制完成后,要在“”里面的逗号前加上‘\’ 。如上述例子中一样!!

在这里插入图片描述

  1. //设置好信息后,连接MQTT。
    使用指令: AT+MQTTCONN=0,"下图的mqttHostUrl",1883,1
    例如:AT+MQTTCONN=0,"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
    在这里插入图片描述

★坑5:总显示连接失败。

解决:看一下之前的手机热点是不是长时间没连接给自动关闭了,我当时就是这个地方出问题,所以才一直显示ERROR。
//连接成功后,发现物联网平台设备在线。
在这里插入图片描述

  1. 使用相应的Topic进行通信。
    在这里插入图片描述
    (1)订阅内容。
    AT+MQTTSUB=0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",1
    ●测试:
    使用物联网平台发布调试。
    在这里插入图片描述
    串口助手接收到的内容:
    在这里插入图片描述

(2)发布内容,更改物联网平台数据,使用相应的Topic以及需要修改数据的参数名称。
AT+MQTTPUB=0,"/sys/a1n2p8YJOux/LED1/thing/event/property/post","{\"params\":{\"learningTime\":33}}",0,0
在这里插入图片描述

在这里插入图片描述

七、代码部分(完整工程代码私聊):

  1. usart.c
#include "usart1.h"
#include "delay.h" 
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h" 
#include "wifi.h"
#include "beep.h"

u32 UART1_read_count = 0;     //接收数据的个数
char ResultBuff[2] = {0};  //返回结果存放数组
#define MAX\_STRING\_LENGTH 250

char \*p;


// 在全局范围定义一个数组来存储接收到的字符串
char receivedString[MAX_STRING_LENGTH];


static void NVIC\_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /\* 嵌套向量中断控制器组选择 \*/
  NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /\* 配置USART为中断源 \*/
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /\* 抢断优先级\*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  /\* 子优先级 \*/
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  /\* 使能中断 \*/
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /\* 初始化配置NVIC \*/
  NVIC\_Init(&NVIC_InitStructure);
}

void USART\_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG\_USART\_GPIO\_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG\_USART\_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO\_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO\_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART\_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// 串口中断优先级配置
	NVIC\_Configuration();
	
	// 使能串口接收中断
	USART\_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART\_Cmd(DEBUG_USARTx, ENABLE);	    
}



//空闲中断
void USART1\_IRQHandler(void)//串口中断服务函数
{ 
	    u8 rxd = 0;//接收缓存
	if (USART\_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
			USART\_ClearITPendingBit(USART1, USART_IT_RXNE);
			rxd = USART\_ReceiveData(USART1);
			Recive\_Data(rxd);
	}
}


/\*
1.功能:将阿里云下发的数据 存到 字符串数组中。
2.接收数据格式例子:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.因为下发的数据格式第一个字符为'+',所以以'+'为开始接收标志的头。
\*/
void Recive\_Data(u8 rxd)
{
		static u8 Start_recive = 0;//开始接收标志
		static u8 stringIndex = 0;	

		if(rxd=='+')  //如果接收到 '+'
			{
				memset(receivedString,0,400); //清空接收数组
				stringIndex=0;                //字符串索引号,从0开始接收
				Start_recive=1;               //开始接收标志
			}
	  if(Start_recive == 1)      
		{
				receivedString[stringIndex++] = rxd;
				if(stringIndex == MAX_STRING_LENGTH)
				{
					stringIndex=0;
					Start_recive=0;
				 }
		}	
}


/\*
1.功能:输入模块名称,返回该模块的值。用于读取阿里云平台模块的值。
2.订阅消息后接收的数据格式如下,用于理解代码:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.如果输入模块名称不存在,则返回-1。
\*/
int Get\_Module\_Val(char \*Module_name)   
{
	 int Module_Val=-1;
   if( (p=strstr(receivedString,Module_name) )!=NULL ) //判断receivedString中是否包含模块名。执行完此行代码后,指针p指向模块名的第一个字符!!!
 	 {
					p=p+strlen(Module_name)+strlen("\":");                   //将指针后移至第一位值的位置。具体需要后移多少位到该位置,请分析开头注释2中数据格式。
					Module_Val= \*p -'0';                                      //解析出该值。 
			 
				 while( (\*(p+1)-'0') >=0 && (\*(p+1)-'0')<=9 )               //用于判断模块的值,是一位数,还是两位数,还是更多位。直到不为0~9的值为止。
				 {
						Module_Val=Module_Val\*10+(\*(p+1)-'0');                  //计算模块的值。
						p++;                                                    //后移指针。
				 } 
	 }
	 return Module_Val;
}



/\*
 发送字符串,用于发送AT指令
\*/
void SendChar(char \*buff){   
	unsigned char i=0;
	while(buff[i]!='\0'){
			while(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //等待接收完成标志
			USART\_SendData(USART1,buff[i]);
			USART\_ClearFlag(USART1,USART_FLAG_TC);  //清除完成标志
			i++;	
	}	
}




//---------------------------------------------下面没用用到/ 备用----------------------

/\*
 串口1发送一个字节
\*/
void usart1\_send\_byte(u8 data)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==SET)); //获取发送完成标志位
	USART\_SendData(USART1,data);  //传输数据
}


/\*
 串口1接收一个字节
\*/
char usart1\_read\_byte(void)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)); //获取发送完成标志位
	return USART\_ReceiveData(USART1);    //返回数据 
}



/\*
 发送命令字符串,参数:命令、预期返回结果
\*/
bool USRT\_Send\_ATCmd(char \*cmd,char \*result)
{
	unsigned char i = 0;
	unsigned char ret = 0;
	while(1)
	{	
			USART1\_Clear\_Buf();
			SendChar(cmd);
			delay\_ms(100);
			if(NULL != strstr(ResultBuff,result))
			{
				ret = SUCCESS;
				break;
			}
			else if(i++ >=10)
			{
				ret = ERROR;
				break;
			}
  } 
	return ret;
}


/\*
 清空数组
\*/
void USART1\_Clear\_Buf(void)  
{
	  memset(ResultBuff, 0, strlen(ResultBuff));
    UART1_read_count = 0;
}




  1. usart.h
#ifndef \_\_USART1\_H
#define \_\_USART1\_H
#include "stm32f10x.h" 
#include "stdio.h"



#define DEBUG\_USART1 1

#if DEBUG\_USART1

// 串口1-USART1
#define DEBUG\_USARTx USART1
#define DEBUG\_USART\_CLK RCC\_APB2Periph\_USART1
#define DEBUG\_USART\_APBxClkCmd RCC\_APB2PeriphClockCmd
#define DEBUG\_USART\_BAUDRATE 115200

// USART GPIO 引脚宏定义
#define DEBUG\_USART\_GPIO\_CLK (RCC\_APB2Periph\_GPIOA)
#define DEBUG\_USART\_GPIO\_APBxClkCmd RCC\_APB2PeriphClockCmd
	
#define DEBUG\_USART\_TX\_GPIO\_PORT GPIOA 
#define DEBUG\_USART\_TX\_GPIO\_PIN GPIO\_Pin\_9
#define DEBUG\_USART\_RX\_GPIO\_PORT GPIOA
#define DEBUG\_USART\_RX\_GPIO\_PIN GPIO\_Pin\_10

#define DEBUG\_USART\_IRQ USART1\_IRQn
#define DEBUG\_USART\_IRQHandler USART1\_IRQHandler


#endif
void Recive\_Data(u8 rxd);  //接收数据,将字符串数据存到数组中。
int Get\_Module\_Val(char \*Module_name);       //获得模块的值
void USART\_Config(void);  
static void NVIC\_Configuration(void); 
char usart1\_read\_byte(void);    //读取字节
void SendChar(char \*buff);    //发送字符串
void usart1\_send\_byte(u8 data); //发送字节
void USART1\_Clear\_Buf(void);   //清除buff
#endif 


  1. wifi.c
#include "wifi.h"
#include "usart1.h"


//需要修改的内容: 在物联网平台查看MQTT参数
#define Device\_name "LED1" //设备名称
#define ProductKey "a1n2p8YJOux" //产品密钥
#define User\_Password "2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b" //用户密码
#define ClientId "a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|"
#define MqttHostUrl "a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com" //MQTT代理地址

#define Wifi\_Account "JL" //手机热点的账号 一定要是2.4Ghz频段
#define Wifi\_Password "88888888" //手机热点的密码


//不需要修改的内容:
#define User\_Name ""Device\_name"&"ProductKey"" //用户账号
#define Publish\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/event/property/post" //发布Topic
#define Subscribe\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/service/property/set" //订阅Topic

/\* ESP8266连接阿里云的AT指令--连接方法一: (可用)
void Esp8266\_ALiyun\_Init() //初始化wifi连接
{ 
 USRT\_Send\_ATCmd("AT\r\n","OK"); //测试
 USRT\_Send\_ATCmd("AT+RST\r\n","OK"); //重启
 // USRT\_Send\_ATCmd("AT+RESTORE\r\n","OK"); //回复出厂设置
 USRT\_Send\_ATCmd("AT+CWMODE=1\r\n","OK"); //使用wifi
 USRT\_Send\_ATCmd("AT+CWJAP=\"JL\",\"88888888\"\r\n","WIFI CONNECTED"); //连接热点
 USRT\_Send\_ATCmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n","OK"); //连接阿里云
 USRT\_Send\_ATCmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"LED1&a1n2p8YJOux\",\"2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b\",0,0,\"\"\r\n","OK");//设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCLIENTID=0,\"a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|\"\r\n","OK"); //设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCONN=0,\"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1\r\n","OK");//开始连接阿里云的MQTT
} 
\*/

//ESP8266连接阿里云的AT指令---连接方法二:
void Esp8266\_ALiyun\_Init()   
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/5dab60ba274fafdb1e97baf522486c54.png)

![img](https://img-blog.csdnimg.cn/img_convert/07c3db3561bc6e7d4aeb45052f7421e3.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/192ef50b0428e9d5479e0b38e28da4b7.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/451713bd9a74df0fb15cfbbb1433892d.png)

![img](https://img-blog.csdnimg.cn/img_convert/6536c4cfeb8fc7eeefd3b7de8d3a6c24.png)

![img](https://img-blog.csdnimg.cn/img_convert/2b87fe262328684054c5c21271dd01ca.png)

![](https://img-blog.csdnimg.cn/img_convert/790db0657bbf20f03f1e5a7efdf962bf.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


18866906)]

 [外链图片转存中...(img-lWYjG6K2-1715718866907)]

[外链图片转存中...(img-rP5AVqz8-1715718866907)]

[外链图片转存中...(img-4k0r1be1-1715718866908)]

[外链图片转存中...(img-Hj32RUAu-1715718866908)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


### 回答1: 要让STM32ESP8266连接到阿里云,需要先了解阿里云物联网平台和相关的API接口。然后根据具体的应用场景需求,选择合适的协议和通信方式进行连接。具体可以采用MQTT或者HTTP协议进行连接,由此实现双向的数据传输。 首先,在STM32ESP8266中需要增加ESP8266的AT指令,将其作为WiFi模块使用,然后在此基础上进行网络配置和连接,获取SSID和密码信息等。然后基于MQTT或者HTTP协议进行连接,这两种协议都可以在阿里云IoT平台上实现。 使用MQTT协议进行连接,需要在STM32ESP8266中进行配置,包括服务器地址,端口号,客户端ID等信息。然后建立连接,发布或者订阅主题消息即可。 使用HTTP协议进行连接,需要在STM32ESP8266上进行HTTP请求,获取授权信息和TOKEN,然后调用阿里云提供的API接口来实现信息的发送和接收。 以上是STM32ESP8266连接阿里云的一些关键思路和步骤,具体还需要根据具体的需求进行详细的实现和调试。 ### 回答2: STM32是一款低功耗高性能的单片微控制器,而ESP8266是一款低成本的Wi-Fi模组,它们可以联合使用来连接到阿里云。 首先,你需要准备一台带有Wi-Fi模块供应商的STM32开发板,例如STMicroelectronics提供的Nucleo-F401RE,以及一台ESP8266 Wi-Fi模组。你还需要在阿里云上创建一个IoT Hub实例并为其生成证书。 接下来,你需要下载阿里云的SDK,该SDK支持C语言和STM32平台。将SDK包中的文件添加到您的工程中,并包含其头文件。 然后,在您的工程中设置Wi-Fi连接信息,包括SSID和密码。根据您的需求,您可以选择使用TCP或UDP协议,以及MQTT客户端进行连接和通信。 在向阿里云发送消息之前,您需要先使用证书验证自己的身份,并将证书和密钥文件添加到您的工程中。然后,您可以使用阿里云提供的API来发送和接收MQTT消息。 当您成功连接到阿里云IoT Hub并成功发送消息时,您可以在控制台中查看数据并将其用于您的应用程序。 在整个过程中,您需要确保您的代码按照阿里云SDK的指导进行编写,并且正确设置了Wi-Fi连接信息和证书。这将帮助您在不久的将来轻松地实现自己的IoT应用程序。 ### 回答3: STM32ESP8266作为微控制器和Wi-Fi模块组合,可以联合运作并连接到阿里云。概括地说,需要进行以下几步: 1. 准备硬件 网上购买STM32ESP8266开发板,将它们连接在一起。需要确保它们之间的连接是准确的,例如使用串行通信,确保引脚连接正确。 2. 搭建开发环境 需要安装ST-Link/V2驱动、Keil或者IAR等开发环境。ESP8266可以使用AT指令模式进行编程,也可以使用Lua语言进行编程。 3. 实现连接阿里云 (1)首先,注册阿里云账号并创建物联网实例。 (2)在阿里云后台创建设备,并获得设备的三元组信息(Device Name、ProductKey、Device Secret)。 (3)在STM32ESP8266中,添加连接阿里云云平台所需要的支持代码,例如接入SDK等。 (4)编写代码,将STM32ESP8266连接到Wi-Fi网络并连接到阿里云云平台。具体步骤包括: a. 将ESP8266设置为STA模式或AP模式,分别连接到Wi-Fi网络或者创建一个Wi-Fi热点。 b. 设置阿里云物联网平台的API密钥。 c. 在STM32中,编写代码将设备信息(Device Name、ProductKey、Device Secret)从芯片里读取出来。 d. 在ESP8266中编写代码将三元组信息加入MQTT连接参数,并连接到云端。 4. 通过阿里云平台进行消息传递 连接成功后,STM32ESP8266可以通过阿里云平台来进行双向数据传递。例如,STM32可以向阿里云发送传感器数据,阿里云会将数据转发给ESP8266ESP8266再将数据发送到远程设备或者APP上。 这就是STM32ESP8266连接到阿里云的主要流程。由于每个项目的要求不同,需要根据实际环境和需求来优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值