STM32CubeMX ESP8266 AT指令实现MQTT协议并接入阿里云IOT平台源码解析【附Github源码地址】

本教程详细介绍了如何使用ESP8266模块和MQTT协议连接阿里云物联网平台,包括从ESP8266的初始化、连接Wi-Fi热点、建立与阿里云服务器的连接,到实现MQTT协议的全过程。同时,提供了完整的代码示例,涵盖AT指令驱动、MQTT协议实现等核心环节,帮助读者快速掌握单片机接入阿里云IoT平台的方法。

课程大纲

【第一章】:物联网简介(什么是物联网)
【第二章】:物联网十大应用场景
【第三章】:什么是MCU?
【第四章】:MCU的应用范围
【第五章】:我们要怎么入门MCU开发?
【第六章】:如何使用STM32Cube MX进行STM32的快速开发
【第七章】:ESP8266+MQTT上阿里云物联网平台实践(附源码)

STM32CubeMX AT指令实现MQTT协议并接入阿里云IOT平台 源码解析
优快云源代码下载
Github源代码下载

效果展示

在这里插入图片描述
关于阿里云IOT平台如何配置请参考这篇博客,本篇只讲ESP8266 驱动和实现MQTT协议的核心代码:
ESP8266+MQTT上阿里云物联网平台实践(附源码)

1.单片机接入阿里云平台步骤解析

1.1 接入阿里云物联网平台步骤

//MQTT初始化函数
void ES8266_MQTT_Init(void)
{
   
   
	uint8_t status=0;

	//1.ESP8266初始化
	if(ESP8266_Init())
	{
   
   
		user_main_info("ESP8266初始化成功!\r\n");
		status++;
	}
	else Enter_ErrorMode(0);

	//2.连接热点
	if(status==1)
	{
   
   
		if(ESP8266_ConnectAP(WIFI_NAME,WIFI_PASSWD))
		{
   
   
			user_main_info("ESP8266连接热点成功!\r\n");
			status++;
		}
		else Enter_ErrorMode(1);
	}
	
	//3.连接阿里云IOT服务器
	if(status==2)
	{
   
   
		if(ESP8266_ConnectServer("TCP",MQTT_BROKERADDRESS,1883)!=0)
		{
   
   
			user_main_info("ESP8266连接阿里云服务器成功!\r\n");
			status++;
		}
		else Enter_ErrorMode(2);
	}
	
	//4.登陆MQTT
	if(status==3)
	{
   
   
		if(MQTT_Connect(MQTT_CLIENTID, MQTT_USARNAME, MQTT_PASSWD) != 0)
		{
   
   
			user_main_info("ESP8266阿里云MQTT登陆成功!\r\n");
			status++;
		}
		else Enter_ErrorMode(3);
	}

	//5.订阅主题
	if(status==4)
	{
   
   
		if(MQTT_SubscribeTopic(MQTT_SUBSCRIBE_TOPIC,0,1) != 0)
		{
   
   
			user_main_info("ESP8266阿里云MQTT订阅主题成功!\r\n");
		}
		else Enter_ErrorMode(4);
	}
}

1.2 阿里云IOT平台订阅消息处理

订阅成功后,平台下发消息会通过串口透传出来,对消息进行处即可

//处理MQTT下发的消息
void deal_MQTT_message(uint8_t* buf,uint16_t len)
{
   
   
	uint8_t data[512];
	uint16_t data_len = len;
	for(int i=0;i<data_len;i++)
	{
   
   
		data[i] = buf[i];
		HAL_UART_Transmit(&huart2,&data[i],1,100);
	}
	memset(usart1_rxbuf,0,sizeof(usart1_rxbuf)); //清空接收缓冲  
	usart1_rxcounter=0;
	//user_main_info("MQTT收到消息,数据长度=%d \n",data_len);
	
	//查找是否是设置红灯
	int i = GetSubStrPos((char*)data,"LEDR");
	if( i>0 )
	{
   
   
		uint8_t ledr_status = data[i+6]-'0';
		HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
		if(ledr_status)
			HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET);
		else
			HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET);
	}
	
	//查找是否是设置绿灯
	i = GetSubStrPos((char*)data,"LEDG");
	if( i>0 )
	{
   
   
		uint8_t ledr_status = data[i+6]-'0';
		HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
		if(ledr_status)
			HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET);
		else
			HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
	}
	
	//查找是否是设置蓝灯
	i = GetSubStrPos((char*)data,"LEDB");
	if( i>0 )
	{
   
   
		uint8_t ledr_status = data[i+6]-'0';
		HAL_GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
		if(ledr_status)
			HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET);
		else
			HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
	}

}

1.3 本地消息发布

调用MQTT发布消息驱动接口即可

//单片机状态上报
void STM32DHT11_StatusReport(void)
{
   
   
	//获取温湿度信息
	uint8_t temperature;
	uint8_t humidity;
	uint8_t get_times;
	
	// 获取温湿度信息并用串口打印,获取十次,直到成功跳出
	for(get_times=0;get_times<10;get_times++)
	{
   
   
		if(!dht11Read(&temperature, &humidity))//Read DHT11 Value
		{
   
   
			user_main_info("temperature=%d,humidity=%d \n",temperature,humidity);
			break;
		}
	}
	
	//上报一次数据
	uint8_t led_r_status = HAL_GPIO_ReadPin(LED_R_GPIO_Port,LED_R_Pin) ? 0:1;
	uint8_t led_g_status = HAL_GPIO_ReadPin(LED_G_GPIO_Port,LED_G_Pin) ? 0:1;
	uint8_t led_b_status = HAL_GPIO_ReadPin(LED_B_GPIO_Port,LED_B_Pin) ? 0:1;</
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值