STM32与ESP8266(ESP32)通过MQTT连接阿里云物联网平台的实现方法

1、阿里云物联网平台

– 阿里云物联网平台配置

产品-设备-编辑物模型-设备端开发-查看上报数据

在产品上添加物模型,然后设备是继承自产品的,因此也具有物模型

添加产品、添加设备、产品上添加物模型

– 使用IOT Studio 绘制界面显示温度、湿度、灯开关


绘制图形化界面,添加数据来源

2、mqtt.fx模拟MQTT客户端发布与订阅消息

在直接使用单片机与阿里云通信前,先利用mqtt.fx工具模拟客户端确认阿里云这边配置无问题。

(1)、获取连接阿里云的三要素

(2)、利用MQTT_Password生成连接标准MQTT协议需要的参数,填在MQTT.fx中,连接阿里云物联网平台

  • 1.Broker Address
  • Client ID
  • User Name
  • Password

    在MQTT.fx填写参数

    连接成功

  • 可以看到设备状态变化

    (3)、在产品中获取设备的发布和订阅主题,写入MQTT.fx


    填写主题

    (4)、发送数据、接收数据

    设置发布主题后,客户端发送数据,阿里云平台收到数据,温度表和湿度表显示,点击开关,客户端mqtt.fx收到数据

    3、通过at命令控制esp8266发布与订阅消息

    (1) 给esp8266烧录mqtt固件

    (2) 控制esp8266通过at指令发送消息和订阅消息

  • 1.AT+CWMODE=1 热点模式
  • 2.AT+CWJAP=“decadeylp”,“qweasdzxc” 连接Wifi wifi名 密码 2.4G热点
  • 3.AT+MQTTUSERCFG=0,1,“MQTT连接的client ID”,“用户名”,“密码”,0,0,“” 配置阿里云连接,根据阿里云三元素生成的
  • 4.AT+MQTTCONN=0,“ProductKey.iot-as-mqtt.cn-shanghai.aliyuncs.com”,1883,0
  • 5.AT+MQTTSUB=0,“/sys/ProductKey/device name/thing/service/property/set”,0 订阅MQTT主题
  • 6.AT+MQTTPUB=0,“/sys/ProductKey/device name/thing/event/property/post”,“{“params”: {“temp”:30,“humi”:20},“version”:“1.0.0”}”,0,0 发布数据
  • 利用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之路

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32与ESP8266(ESP32)通过MQTT连接阿里云物联网平台的实现方法

    发表回复