文章目录
1 实验目的
学习ESP32连接阿里云物联网平台并实现相互通信;
2 在阿里云物联网平台添加实验设备
- 在阿里云物联网平台添加本次实验设备,详细步骤请参考:阿里云物联网平台创建产品与设备
3 ESP32连接阿里云物联网平台
3.1 准备ESP32工程
- 复制官方例程 examples\protocols\mqtt\tcp
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
在阿里云物联网平台查看可查看上诉参数
3.4 ESP32工程主要代码分析
mqtt相关函数详细操作请参考:乐鑫官方说明
/*由阿里网平台可得如下信息*/
// "clientId":"xxxxxFwJvIO.light_02|securemode=2,signmethod=hmacsha256,timestamp=1718174871589|"
// "username":"light_02&xxxxxFwJvIO"
// "mqttHostUrl":"xxxxxFwJvIO.iot-as-mqtt.cn-shanghai.aliyuncs.com"
// "passwd":"xxxxxac7f1796e87ad43fd4dd0ead023d9b8c7e3050a9bae91ab58505dc8a514"
// "port":1883
#define Aliyun_hostname "xxxxxFwJvIO.iot-as-mqtt.cn-shanghai.aliyuncs.com" //或称mqttHostUrl、Broker Address
#define Aliyun_port 1883
#define Aliyun_client_id "xxxxxFwJvIO.light_02|securemode=2,signmethod=hmacsha256,timestamp=1718174871589|"
#define Aliyun_username "light_02&xxxxxFwJvIO"
#define Aliyun_password "xxxxxac7f1796e87ad43fd4dd0ead023d9b8c7e3050a9bae91ab58505dc8a514"
void mqtt_app_start(void)
{
// 官方例程原程序
// esp_mqtt_client_config_t mqtt_cfg = {
// .broker.address.uri = CONFIG_BROKER_URL,
// };
esp_mqtt_client_config_t mqtt_cfg = {
// idf 新版本(esp-idf-V5.2.1)参数配置如下
.broker.address.transport = MQTT_TRANSPORT_OVER_TCP,
.broker.address.hostname = Aliyun_hostname,
.broker.address.port = Aliyun_port,
.credentials.client_id = Aliyun_client_id,
.credentials.username = Aliyun_username,
.credentials.authentication.password = Aliyun_password,
// idf 旧版本参数配置如下
// .host = Aliyun_hostname,
// .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 配置并烧录工程
idf.py menuconfig
配置wifi- 烧录程序
3.6 ESP32连接阿里云物联网验证
- 通过上诉初始化等操作,给esp32烧录程序复位后,esp32串口数据显示连接成功
- 阿里云物联网平台也显示设备在线
4 ESP32与阿里云物联网平台通信
-
复制如下Topic,
-
在程序中修改如下
#define AliyunPublishTopic_user_update "/xxxxxFwJvIO/light_02/user/update"
#define AliyunSubscribeTopic_user_get "/xxxxxFwJvIO/light_02/user/get"
static const char mqtt_publish_data3[] = "hello aliyun, i am esp32.i and you connected ok";
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id);
esp_mqtt_event_handle_t event = event_data;
esp_mqtt_client_handle_t client = event->client;
int msg_id;
switch ((esp_mqtt_event_id_t)event_id) {
case MQTT_EVENT_CONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
//1. 连接成功后发消息到阿里云物联网平台
msg_id = esp_mqtt_client_publish(client, AliyunPublishTopic_user_update, mqtt_publish_data3, strlen(mqtt_publish_data3), 1, 0);
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
//2. 订阅阿里云物联网平台 user get topic
msg_id = esp_mqtt_client_subscribe(client, AliyunSubscribeTopic_user_get, 0);
ESP_LOGI(TAG, "execute subscribe event, msg_id=%d", msg_id);
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_PUBLISHED:
ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT_EVENT_DATA");
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
printf("DATA=%.*s\r\n", event->data_len, event->data);
break;
case MQTT_EVENT_ERROR:
break;
default:
ESP_LOGI(TAG, "Other event id:%d", event->event_id);
break;
}
}
- 编译并烧录程序后,阿里云物联网平台数据如下
- 阿里云发数据给esp32