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的固件没有升级。
作者:反派谢某