ESP-IDF提供了mqtt組件,在components/mqtt,相關的API位於components/mqtt/esp-mqtt目錄下,這個組件是基於https://github.com/tuanpmt/esp_mqtt的 。組件支持MQTT over TCP、SSL with mbedtls、MQTT over Websocket、 MQTT over Websocket Secure;支持訂閱、發布、身份驗證、遺囑消息、心跳、以及3個消息等級。
2、API說明2.1、MQTT客戶端配置結構體esp_mqtt_client_config_t
通過這個結構體,可以設置回調函數、伺服器地址、用戶名、client id、密碼、證書等,基本上與mqtt相關的參數都可以設置。
2.2、基於配置創建MQTT Client句柄esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config);
config:配置結構體變量指針;
esp_mqtt_client_handle_t :創建成功返回的mqtt client句柄。
esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client);
client:mqtt client句柄;
esp_err_t :返回值為ESP_OK標識啟動成功。
int esp_mqtt_client_subscribe(esp_mqtt_client_handle_t client, const char *topic, int qos);
client:mqtt client句柄;
topic :主題;
qos:消息質量。
int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, const char *data, int len, int qos, int retain);
client:mqtt client句柄;
topic :主題;
data:數據;
len:長度;
qos:消息質量;
retain:保持標識。
esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client);
client:mqtt client句柄;
esp_err_t :返回值為ESP_OK標識啟動成功。
esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_client_config_t *config);
client:mqtt client句柄;
config:配置結構體變量指針;
esp_err_t :返回值為ESP_OK標識啟動成功。
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
event:事件結構體變量;
在這個函數中可以通過event_id來處理各種MQTT事件,比如:MQTT_EVENT_CONNECTED(MQTT連結)、MQTT_EVENT_SUBSCRIBED(訂閱)、MQTT_EVENT_DATA(MQTT數據)等;訂閱主題後,接受MQTT消息,正是通過這個事件來回調的。
static esp_mqtt_client_handle_t mqtt_client;
//MQTT Client句柄
static char mqtt_msg[512];
//mqtt接收消息緩衝區
static esp_mqtt_client_config_t mqtt_cfg = {
.host= IOT_CORE_MQTT_BROKER_URL,
.event_handle = mqtt_event_handler,//註冊回調函數
.port = 1883,
.username = mqtt_token,
.client_id = my_clinet_id
};
//定義並初始化MQTT Client配置結構體
client_id 默認使用的是ESP32_%CHIPID%的形式;
這裡要注意,如果mqtt連接斷開了,重連的時候最好變換一個client_id,或者在client_id中加入時間戳,保證每次都不一樣;
client_id 、host和username 需要根據實際情況替換。
static void mqtt_app_start(void)
{
mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
//創建客戶端
ESP_ERROR_CHECK(esp_mqtt_client_start(mqtt_client));
//啟動客戶端,連接伺服器
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
assert(event != NULL);
switch (event->event_id)
{
case MQTT_EVENT_CONNECTED: //mqtt連接事件
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
break;
case MQTT_EVENT_DISCONNECTED: //mqtt斷開事件
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED: //mqtt訂閱事件
ESP_LOGD(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED: //mqtt取消訂閱事件
ESP_LOGD(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_PUBLISHED: //mqtt發布事件
ESP_LOGD(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA: //mqtt接收數據事件
ESP_LOGD(TAG, "MQTT_EVENT_DATA, msg_id=%d, %s", event->msg_id, event->topic);
if (event->data_len >= (sizeof(mqtt_msg) - 1))
{
ESP_LOGE(TAG, "Received MQTT message size [%d] more than expected [%d]", event->data_len, (sizeof(mqtt_msg) - 1));
return ESP_FAIL;
}
break;
case MQTT_EVENT_ERROR: //mqtt錯誤事件
ESP_LOGD(TAG, "MQTT_EVENT_ERROR");
break;
case MQTT_EVENT_BEFORE_CONNECT: //mqtt連接之前,已發生的事件
ESP_LOGD(TAG, "MQTT_EVENT_BEFORE_CONNECT");
break;
default:
break;
}
return ESP_OK;
}
經過以上幾個步驟,esp32就可以通過mqtt連接到伺服器了。
——————END——————
相關推薦:
【玩轉ESP32】13、esp32 mqtt基礎
【玩轉ESP32】12、esp32串口使用
【玩轉ESP32】11、esp32軟體定時器