STM32与ESP8266结合使用MQTT协议连接华为云并实时上传数据

一、华为云添加账号获取相关参数

1、打开华为云链接,并注册账号

华为云官网:共建智能世界云底座-华为云华为云提供稳定可靠、安全可信、可持续发展的云服务,致力于让云无处不在,让智能无所不及,共建智能世界云底座。助力企业降本增效,全球300万客户的共同选择。7×24小时专业服务支持,5天内无理由退订,免费快速备案。https://www.huaweicloud.com/

2、打开设备接入ioTDA

3、创建产品

4、添加服务

记住服务ID

5、添加属性

6、添加设备

设备ID:67c2e6de24d77232552195be_stm32esp8266

设备密钥:xyy142837

7、获取华为云相关参数

二、软件实现

1.esp8266连接手机热点

void ESP8266_Init(void)
{
	
	GPIO_InitTypeDef GPIO_Initure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//ESP8266复位引脚
	GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Initure.GPIO_Pin = GPIO_Pin_14;					//GPIOC14-复位
	GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_Initure);
	
	GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
	delay_ms(250);
	GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
	delay_ms(500);
	
	ESP8266_Clear();
	
	UsartPrintf(USART_DEBUG, "00. AT\r\n");
	while(ESP8266_SendCmd("AT\r\n", "OK"))
		 delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "01. RST\r\n");
	ESP8266_SendCmd("AT+RST\r\n", "");
		delay_ms(500);
	ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "02. CWMODE\r\n");
	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "03. AT+CWDHCP\r\n");
	while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "04. CWJAP\r\n");
	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "05. ESP8266 Init OK\r\n");

}

2.接入华为云设备

#define ESP8266_WIFI_INFO		"AT+CWJAP=\"xyy\",\"XYY1234567890\"\r\n"//wifi 名字与密码

//华为云
#define HUAWEI_MQTT_USERNAME_PASSWORD   "AT+MQTTUSERCFG=0,1,\"NULL\",\"67c2e6de24d77232552195be_stm32esp8266\",\"01ed7fe2575be50d421d8f3d4f67b4b9d1cd927f100259fe8f693d3a2394652b\",0,0,\"\"\r\n"
#define HUAWEI_MQTT_ClientID			      "AT+MQTTCLIENTID=0,\"67c2e6de24d77232552195be_stm32esp8266_0_0_2025030209\"\r\n"
#define HUAWEI_MQTT_ADDRESS_PORT        "AT+MQTTCONN=0,\"8765215630.st1.iotda-device.cn-north-4.myhuaweicloud.com\",1883,1\r\n"
#define HUAWEI_MQTT_DeviceID            "AT+MQTTSUB=0,\"$oc/devices/67c2e6de24d77232552195be_stm32esp8266/sys/properties/report\",1\r\n"
#define HUAWEI_MQTT_DeviceID_VALUE      "67c2e6de24d77232552195be_stm32esp8266"
#define HUAWEI_MQTT_ServiceID           "stm32"
_Bool HuaWei_DevLink(void)
{
	_Bool status = 1;
	UsartPrintf(USART_DEBUG, "01. AT+MQTTUSERCFG\r\n");
	while(ESP8266_SendCmd(HUAWEI_MQTT_USERNAME_PASSWORD,"OK"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG,"02. AT+MQTTCLIENTID\r\n");
	while(ESP8266_SendCmd(HUAWEI_MQTT_ClientID,"OK"))
			delay_ms(500);

	UsartPrintf(USART_DEBUG,"03. AT+MQTTCONN\r\n");
	while(ESP8266_SendCmd(HUAWEI_MQTT_ADDRESS_PORT,"OK"))
			delay_ms(500);

	UsartPrintf(USART_DEBUG, "04. AT+MQTTSUB\r\n");
	while(ESP8266_SendCmd(HUAWEI_MQTT_DeviceID,"OK"))
			delay_ms(500);
	
	status = 0;
	
	UsartPrintf(USART_DEBUG, "05. HuaWei_DevLink OK\r\n");
	
	return status;
}

3.数据发布到华为云

void SendMQTTPubData(const char* properties, double value) 
{
    char cmd[256] = {0};

    sprintf(cmd, "AT+MQTTPUB=0,\"$oc/devices/%s/sys/properties/report\",\"		\
		{\\\"services\\\":[{\\\"service_id\\\":\\\"%s\\\"\\,\\\"properties\\\":		\
			{\\\"%s\\\": %f}}]}\",0,0\r\n", HUAWEI_MQTT_DeviceID_VALUE, HUAWEI_MQTT_ServiceID, properties, value);
		
    // 发送命令并等待"OK"响应
    while(ESP8266_SendCmd(cmd, "OK") == 1) {
        delay_ms(500);
    }
		UsartPrintf(USART_DEBUG, "发布数据成功\r\n");			
}

4.主函数调用相关上云和发布函数

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "stdio.h"
#include "string.h"
#include "onenet.h"
#include "esp8266.h"
#include "uart2_fun.h"
#include "time.h"



int main()
{
/*=======================================系统初始化======================================*/
	
	//时钟初始化
	SysTick_Init(72);
	
	//中断优先级分组 分2组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
	
	//串口初始化
    Usart1_Init(115200);
	Usart2_Init(115200);
	
	//定时1ms
	TIM4_Init ( 99, 719 ); 
	
	
/*=======================================传感器初始化======================================*/
	
	//初始化ESP8266
	ESP8266_Init();
		
    //接入华为云
	while(HuaWei_DevLink())			
		delay_ms(500);
	UsartPrintf(USART_DEBUG, "接入华为云成功\r\n");

	
	
/*=======================================while循环========================================*/
	while(1)
	{	
		//发布数据
		if(tim_v.esp8266_flag > 2000)
		{
			tim_v.esp8266_flag=0;
			SendMQTTPubData("temp",23.7);//Temp,PH,TDS
		}

		//延时
		
		delay_ms(10);
		ESP8266_Clear();
	}

}

三、华为云效果展示

1.esp8266接入成功显示

2.esp8266数据发布成功显示

四、注意事项

1.如果ESP8266执行到"AT+MQTTUSERCFG=0,1,\"NULL\",\"67c2e6de24d77232552195be_stm32esp8266\",\"01ed7fe2575be50d421d8f3d4f67b4b9d1cd927f100259fe8f693d3a2394652b\",0,0,\"\"\r\n"一直失败,并且指令和参数没问题,那就是ESP8266的固件没有升级。

作者:反派谢某

物联沃分享整理
物联沃-IOTWORD物联网 » STM32与ESP8266结合使用MQTT协议连接华为云并实时上传数据

发表回复