STM32与ESP8266(ESP32)通过MQTT连接阿里云物联网平台的实现方法
1、阿里云物联网平台
– 阿里云物联网平台配置
产品-设备-编辑物模型-设备端开发-查看上报数据
在产品上添加物模型,然后设备是继承自产品的,因此也具有物模型
添加产品、添加设备、产品上添加物模型
– 使用IOT Studio 绘制界面显示温度、湿度、灯开关
绘制图形化界面,添加数据来源
2、mqtt.fx模拟MQTT客户端发布与订阅消息
在直接使用单片机与阿里云通信前,先利用mqtt.fx工具模拟客户端确认阿里云这边配置无问题。
(1)、获取连接阿里云的三要素
(2)、利用MQTT_Password生成连接标准MQTT协议需要的参数,填在MQTT.fx中,连接阿里云物联网平台

在MQTT.fx填写参数

连接成功

可以看到设备状态变化
(3)、在产品中获取设备的发布和订阅主题,写入MQTT.fx
填写主题
(4)、发送数据、接收数据
设置发布主题后,客户端发送数据,阿里云平台收到数据,温度表和湿度表显示,点击开关,客户端mqtt.fx收到数据
3、通过at命令控制esp8266发布与订阅消息
(1) 给esp8266烧录mqtt固件
(2) 控制esp8266通过at指令发送消息和订阅消息
利用sscom串口工具,测试esp8266通过at指令发布订阅消息
4、编写stm32程序通过at命令控制esp8266发布与订阅消息
(1)、stm32程序通过控制esp8266发送at命令完成8266初始化,配置wifi网络
stm32与esp8266通过串口连接,通过串口发送at命令完成8266初始化,和上述通过串口工具直接向esp8266发送at命令一样,确保了stm32单片机和esp8266的成功通信。
(2)、发送温度湿度到阿里云物联网平台(发布消息)
利用定时器定时每5s,esp8266发送一次DHT11的数据
void esp8266_init(void)
{
__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE); //打开串口2接收中断
printf("1.SETTING STATION MODE\r\n");
OLED_printf(0,0,"1.SETTING STATION MODE ");
while(esp8266_send_cmd((uint8_t *)"AT+CWMODE=1\r\n",strlen("AT+CWMODE=1\r\n"),"OK")!=0)
{
HAL_Delay(1000);
}
printf("2.CLOSE ESP8266 ECHO\r\n");
OLED_printf(0,0,"2.CLOSE ESP8266 ECHO ");
while(esp8266_send_cmd((uint8_t *)"ATE0\r\n",strlen("ATE0\r\n"),"OK")!=0)
{
HAL_Delay(1000);
}
printf("3.NO AUTO CONNECT WIFI\r\n");
OLED_printf(0,0,"3.NO AUTO CONNECT WIFI ");
while(esp8266_send_cmd((uint8_t *)"AT+CWAUTOCONN=0\r\n",strlen("AT+CWAUTOCONN=0\r\n"),"OK")!=0)
{
HAL_Delay(1000);
}
printf("4.RESET ESP8266\r\n");
OLED_printf(0,0,"4.RESET ESP8266 ");
while(esp8266_reset() != 0)
{
HAL_Delay(5000);
}
printf("5.CONFIG WIFI NETWORK\r\n");
OLED_printf(0,0,"5.CONFIG WIFI NETWORK ");
while(esp8266_config_network() != 0)
{
HAL_Delay(8000);
}
//发送消息到阿里云
printf("6.MQTT USER CONFIG\r\n");
OLED_printf(0,0,"6.MQTT USER CONFIG ");
while(esp8266_send_cmd((uint8_t *)"AT+MQTTUSERCFG=0,1,\""MQTT_CLIENT_ID"\",\""MQTT_USER_NAME"\",\""MQTT_PASSWD"\",0,0,\"\"\r\n",
strlen("AT+MQTTUSERCFG=0,1,\""MQTT_CLIENT_ID"\",\""MQTT_USER_NAME"\",\""MQTT_PASSWD"\",0,0,\"\"\r\n"),"OK")!=0)
{
HAL_Delay(2000);
}
printf("7.CONNECT MQTT BROKER\r\n");
OLED_printf(0,0,"7.CONNECT MQTT BROKER ");
while(esp8266_connect_server() != 0)
{
HAL_Delay(8000);
}
printf("8.SUBSCRIBE TOPIC\r\n");
OLED_printf(0,0,"8.SUBSCRIBE TOPIC ");
while(esp8266_send_cmd((uint8_t *)"AT+MQTTSUB=0,\""SUB_TOPIC"\",0\r\n",strlen("AT+MQTTSUB=0,\""SUB_TOPIC"\",0\r\n"),"OK")!=0)
{
HAL_Delay(2000);
}
printf("9.ESP8266 INIT OK!!!\r\n");
OLED_printf(0,0,"9.ESP8266 INIT OK!!! ");
}
(3)、接收阿里云物联网平台的命令控制LED灯亮灭(订阅消息)
/**
* @brief 解析json数据
* @param[in] json_msg:json数据,json_len:json数据长度
* @retval 返回0找到指定json数据,否则返回1
*/
uint8_t parse_json_msg(uint8_t *json_msg,uint8_t json_len)
{
uint8_t retval =0;
JSONStatus_t result;
char query[] = "params.light";
size_t queryLength = sizeof( query ) - 1;
char * value;
size_t valueLength;
result = JSON_Validate((const char *)json_msg, json_len);
if( result == JSONSuccess)
{
result = JSON_Search((char *)json_msg, json_len, query, queryLength,&value, &valueLength );
if( result == JSONSuccess)
{
char save = value[valueLength];
value[valueLength] = '\0';
printf("Found: %s %d-> %s\n", query, valueLength,value);
value[valueLength] = save;
retval = 0;
}
else
{
retval = 1;
}
}
else
{
retval = 1;
}
return retval;
}
作者:Geek之路