1 实验目的

学习ESP32连接阿里云物联网平台并实现相互通信;

2 在阿里云物联网平台添加实验设备

  1. 在阿里云物联网平台添加本次实验设备,详细步骤请参考:阿里云物联网平台创建产品与设备

3 ESP32连接阿里云物联网平台

3.1 准备ESP32工程

  1. 选择 app-wifi-station 作为基础工程,并更改工程名为 app-MqttToAliyun
  2. 参考官方例程 examples\protocols\mqtt\tcp
  3. examples\protocols\mqtt\tcp例程相关文件复制到 app-MqttToAliyun 工程中,在此基础上修改。

3.2 准备ESP32所需的MQTT相关参数

ESP32使用MQTT协议连接阿里云物联网平台需要用到如下参数:

#define   host       xxx       //或称mqttHostUrl、Broker Address
#define   port       xxx
#define   client_id  xxx
#define   username   xxx
#define   password   xxx

获取上述参数有两种方法:
方法1:直接在阿里云物联网平台查看(旧版本中不能直接查看)
在这里插入图片描述
方法2:根据阿里云物联网提供的数据自行计算

  1. 在阿里云物联网平台查找如下参数
    ProductKey、DeviceName、DeviceSecret、Region

  2. 打开阿里云物联网平台新建的ESP32设备页面
    在这里插入图片描述从上图中我们可以得到如下数据:

    /*由阿里网平台可得如下数据*/
    // ProductKey:"a1tUbQR2faQ"; 
    // DeviceName:"dev-esp32"; 
    // DeviceSecret:"e624520f1xxxxxxe0d02cd0ca99c94c1";
    // Region:"cn-shanghai";     
      
    
  3. 根据上诉查找数据按格式转换为程序中mqtt配置参数(注意client_id中的112233可自己随意设定)

    /*Broker Address(host):${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com*/
    #define   host       "a1tUbQR2faQ.iot-as-mqtt.cn-shanghai.aliyuncs.com"
    #define   port       1883  /*固定*/
    /*Client ID:     ${ClientID}|securemode=${Mode},signmethod=${SignMethod}|*/
    #define   client_id  "112233|securemode=2,signmethod=hmacsha1|"
    /*User Name:     ${DeviceName}&${ProductKey}*/
    #define   username   "dev-esp32&a1tUbQR2faQ"
    /*使用官网 MQTT_Password 工具生成*/
    #define   password   "9ABE732ED28xxxxxxE7336FA824C26E744413360"
    

    Address(host)、port、client_id详细配置过程请参考官方说明:使用MQTT.fx接入物联网平台
    在这里插入图片描述 username、password详细配置过程请参考官方说明:使用MQTT.fx接入物联网平台
    在这里插入图片描述

3.4 ESP32工程主要代码分析

mqtt相关函数详细操作请参考:乐鑫官方说明

/*!!!!!!如下信息请替换成自己在阿里云的信息!!!!!!*/
/*由阿里网平台可得如下信息*/
// ProductKey:"a1tUbQR2faQ"; 
// DeviceName:"dev-esp32"; 
// DeviceSecret:"e624520f169c755e0d02cd0ca99c94c1";
// Region:"cn-shanghai";     

/*下面一参数为自定义*/
// ClientID:="112233";       

/*Broker Address:${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com*/
#define   Aliyun_host       "a1tUbQR2faQ.iot-as-mqtt.cn-shanghai.aliyuncs.com"
#define   Aliyun_port       1883
/*Client ID:     ${ClientID}|securemode=${Mode},signmethod=${SignMethod}|*/
#define   Aliyun_client_id  "112233|securemode=2,signmethod=hmacsha1|"
/*User Name:     ${DeviceName}&${ProductKey}*/
#define   Aliyun_username   "dev-esp32&a1tUbQR2faQ"
/*使用官网 MQTT_Password 工具生成*/
#define   Aliyun_password   "9ABE732ED28xxxxxxE7336FA824C26E744413360"

#define   AliyunSubscribeTopic_user_get     "/a1tUbQR2faQ/dev-esp32/user/get"
#define   AliyunPublishTopic_user_update    "/a1tUbQR2faQ/dev-esp32/user/update"

void user_mqtt_app_start(void)
{
    esp_mqtt_client_config_t mqtt_cfg = {
		.host = Aliyun_host,
		.port = Aliyun_port,
		.client_id = Aliyun_client_id,
		.username = Aliyun_username,
		.password = Aliyun_password,

    };

    client = esp_mqtt_client_init(&mqtt_cfg);
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client);
    esp_mqtt_client_start(client);
}

3.5 ESP32连接阿里云物联网验证

  1. 通过上诉初始化等操作,给esp32烧录程序复位后,esp32串口数据显示连接成功
    在这里插入图片描述
  2. 阿里云物联网平台也显示设备在线
    在这里插入图片描述

3.5.1 ESP32发布数据到阿里云物联网平台

  1. 想要通过ESP32发布消息到阿里云物联网平台,除了上诉初始化以外,还需要获取阿里云物联网平台具有发布权限的Topic。
    在这里插入图片描述

  2. 在程序中添加该Topic路径

    ///a1Buwr73pUI/${deviceName}/user/update    //注意把deviceName换成测试的设备名
    #define   AliyunPublishTopic_user_update    "/a1Buwr73pUI/dev-esp32/user/update"
    
  3. 间隔2秒,一共发布6次数据

    char mqtt_publish_data3[] = "mqtt i am esp32";
    
    static void mqtt_test_task(void *pvParameters)
    {
        uint8_t num = 0;
    
        while(1)
        {
           esp_mqtt_client_publish(client, AliyunPublishTopic_user_update, mqtt_publish_data3, strlen(mqtt_publish_data3), 1, 0);
           vTaskDelay(2000 / portTICK_PERIOD_MS);
    	   if(num++ > 5) break;
    	}
        vTaskDelete(NULL);
    }
    

    阿里云物联网平台数据如下在这里插入图片描述在这里插入图片描述

3.5.2 阿里云物联网平台发布数据给ESP32

  1. 想要通过阿里云物联网平台发布数据给ESP32,除了上诉初始化以外,还需要获取阿里云物联网平台具有订阅权限的Topic。
    在这里插入图片描述

  2. 在程序中添加该Topic路径

    #define   AliyunSubscribeTopic_user_get     "/a1Buwr73pUI/dev-esp32/user/get"
    
    static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
    {
        // your_context_t *context = event->context;
        switch (event->event_id) {
            case MQTT_EVENT_CONNECTED:
                ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
                msg_id = esp_mqtt_client_subscribe(client, AliyunSubscribeTopic_user_get, 0);
                ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
    
  3. 在阿里云上发布消息在这里插入图片描述

  4. 查看ESP32串口数据
    在这里插入图片描述

4 工程链接

Gitee平台链接:点击我

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐