【玩轉ESP32】14、esp32 mqtt client

2021-12-26 物聯網思考

收錄於話題 #玩轉esp32 16個

點擊上方[物聯網思考],選擇置頂,第一時間查看物聯網分享!1、前言

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句柄。

2.3、啟動MQTT Client(客戶端)

esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client);

client:mqtt client句柄;
esp_err_t :返回值為ESP_OK標識啟動成功。

2.4、訂閱主題

int esp_mqtt_client_subscribe(esp_mqtt_client_handle_t client, const char *topic, int qos);

client:mqtt client句柄;
topic :主題;
qos:消息質量。

2.5、發布主題

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:保持標識。

2.6、MQTT Client重連

esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client);

client:mqtt client句柄;
esp_err_t :返回值為ESP_OK標識啟動成功。

2.7、設置MQTT Client配置,一般用於更新配置

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標識啟動成功。

2.8、MQTT Client回調

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消息,正是通過這個事件來回調的。

3、代碼實現3.1、定義並初始化MQTT Client配置結構體、MQTT Client句柄

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 需要根據實際情況替換。

3.2、創建客戶端並連接伺服器

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);
}

3.3、mqtt回調處理

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軟體定時器

相關焦點

  • MicroPython – MQTT 與 ESP32/ESP8266
    >準備boot.py導入必要的庫:import timefrom umqttsimple import MQTTClientimport ubinasciiimport machineimport micropythonimport networkimport esp
  • 【玩轉ESP32】7、ESP32連接wifi
    點擊上方[物聯網思考],選擇置頂,第一時間查看物聯網分享!
  • ESP32S2 與 ESP32 開發方式對比,帶你入門環境搭建
    ESP32S2 與 ESP32 開發方式對比    由於ESP32S2 為 ESP32 的閹割版,去掉了藍牙的單核版,所以此晶片是沒有藍牙協議棧的,但是二次開發與 ESP32 類似。esp-lwip.git[submodule "components/mqtt/esp-mqtt"] path = components/mqtt/esp-mqtt url = https://gitee.com/xuhongv/esp-mqtt.git[submodule "components/protobuf-c/protobuf-c"]
  • ESP32 設備運行 FreeRTOS IoT 作業系統
    /dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz解壓、設置環境變量:mkdir -p ~/espcd ~/esptar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
  • ESP32 入門教學,不入門,不教學
    我這次給大家介紹一個晶片,esp32,沒有收過任何費用,就是純技術分享,讓初學者少踩點坑吧,我也是最近用這個晶片,覺得爽得一X。然後在 esp-idf 上面右鍵,最下面有一個 properties 這個裡面有設置,其中就是設置你要編譯哪個項目
  • 用Arduino玩轉掌控板(ESP32):ESP32概述與Arduino軟體準備
    實際上,這些知識都是可以遷移的,因此在有時間的情況下,我準備給大家分享一系列用 Arduino 代碼對掌控板(ESP32)編程的教程:用 Arduino 玩轉掌控板(ESP32)系列,旨在更多地從 ESP32 晶片的角度出發,學習 ESP32 模塊的編程,然後應用到掌控板或其他基於 ESP32 的開發板上,讓大家可以觸類旁通。
  • ESP32晶片-LEDC外設(另附Arduino代碼)
    在文檔內,我們就看這裡就好在大量的說明舵機之前,不妨讓我們先來了解一些關於晶片本身的能力:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html有個神奇的地方
  • ESP32 coredump 分析
    上次寫了一個 ESP32 入門,我想有必要再寫這篇文章,這次主要是分析 coredump 的,這就像 Android 和 Linux 系統的死機分析,有意思,也有難度。我覺得 ESP32 還有一個好處是,對於初學者真的太方便了,買個 Linux 開發板可能要幾百塊,但是買一個 ESP32 模塊的話,也就 40 塊錢,而且也是跑 Freertos 系統的,還有還有就是非常方便攜帶,調試燒錄供電都可以用一個 usb 線搞定,說真的,我沒有收錢宣傳,是真的適合沒有錢又喜歡入門嵌入式的同學們,但是這個只是起點,嵌入式後期我覺得一定是要學習Linux 的。
  • ESP32 For Arduino雜記
    ESP32 使用MicroPython 控制Gopro Hero Black4ESP32晶片-LEDC外設(另附Arduino代碼)Dji TT無人機擴展件ESP32晶片(D2WDQ5)Thonny燒錄ESP32 mpy固件ESP32+Thonny+固件燒錄+編寫建議ESP32
  • 智能硬體晶片---------ESP32 介紹
    參考連結:https://docs.micropython.org/en/latest/esp32/tutorial/intro.htmlhttps://github.com/easytarget/esp32-cam-webserverhttps://www.espressif.com/sites/default/files/documentation/esp32_wrover_datasheet_cn.pdfhttp://m5edu.com/Product/m5stack-core-fire/https://flow.m5stack.com
  • ESP32-IDF環境搭建
    隨後ESP32發布,600MIPS運算能力、WIFI+BLE+ETH、QFN封裝、不到10元的價格。現在ESP32的生態可謂相當成熟,樂鑫ESP-IDF的教程遍天是,數款模組和開發板任君選擇,Arduino、PlatformIO、NodeMCU 都對ESP32提供了支持。
  • ESP32平臺開發LVGL圖形界面
    ,LVGL相關的源碼和例程,是以組件的形式提供的,因此,LVGL的源碼保存在lv_port_esp32/components文件夾裡面,並且LVGL相關的源碼和例程,是使用git submodule的方式進行管理的,因此,我們需要更新submodule。
  • ESP-NOW無線通信 | ESP32學習之旅-Arduino版
    開發板之間的通信,所有支持 ESP-NOW 的設備之間都可以進行通信,比如 ESP32 與 ESP32 之間、ESP8266 與 ESP8266 之間、甚至 ESP32 與 ESP8266 之間,都可以進行 ESP-NOW 無線通信。
  • VsCode設置ESP32工具鏈+刨根問底點燈
    esp32/get-started/index.htmlSDK配置編輯器,用於配置ESP-IDF項目(esp-idf menuconfig)。輕鬆為ESP-32和ESP32 S2晶片構建,快閃記憶體和監視代碼。KConfig和ESP-IDF的語法突出顯示Kconfig樣式語法驗證(如果啟用)。命令的本地化(英語,中文,西班牙語),您也可以添加語言貢獻。
  • 啟明雲端WT-ESP32-DevKitC V4開發板直連天貓精靈IOT開放平臺
    開發環境使用樂鑫官方的ESP-IDF作為開發環境,通過對樂鑫的esp-ali-samartlving框架進行了二次開發。,天貓精靈識別到語音後會發送到生活物聯網平臺,平臺通過mqtt協議發送數據到ESP32開發板,開發板接收到數據後就可以對創建的產品進行控制了。
  • ESP32+Thonny+固件燒錄+編寫建議
    https://micropython.org/download/esp32/
  • 國內linux和macos搭建esp32的開發環境
    背景esp32開發方式有許多如在Arduino軟體中Arduino框架開發方式,網上有許多教程在platformIO中進行Arduino或者idf方式開發,platformIO封裝不錯使用官方idf在linux、macos、windows開發最近想了解一下官方SDK的開發方式,在搭建esp32
  • ESP8266/ESP32入門之聯網功能整合和下載
    if (client.connect("api.seniverse.com", 80) == 1){ client.print("GET /v3/weather/now.json?key=***&location=guangzhou&language=zh-Hans&unit=c HTTP/1.1\r\n"); client.print("Host:api.seniverse.com\r\n"); client.print("Accept-Language:zh-cn\r\n"); client.print("Connection:close\r
  • 啟明雲端分享|盤點Esp32-C3與Esp8266 的區別
    ESP32-c3 :mkdir espcd ./esp git clone --recursive https://github.com/espressif/esp-idf.git克隆文件到當面路徑下,也就是剛剛創建的文件夾esp
  • Arduino1.8.13+ESP32初體驗
    這個地方,可能得fq.後面下載很快得https://www.arduino.cc/en/donate/https://medium.com/@elisabethlevana/introduction-to-esp32