女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析ESP32運行MQTT客戶端進行主題的發布和訂閱的方法

jf_Ufm3lVrj ? 來源:凌順實驗室 ? 2024-03-18 10:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ESP32 MQTT的庫有很多,凌順實驗室(lingshunlab.com)這次主要使用AsyncMQTT_ESP32,以后有機會再更多的MQTT其他庫的使用方法。

前提條件

樹莓派部署本地的MQTT服務端,具體安裝請查看以下連接:

https://lingshunlab.com/book/raspberry-pi/raspberry-pi-install-mosquitto-mqtt-server-and-test-mqtt

ESP32和樹莓派在同一WIFI網絡里面

效果實現

凌順實驗室(lingshunlab.com)在本示例展示了使用兩個ESP32,分別實現發布MQTT的主題消息和訂閱并輸出MQTT的主題內容。當然,可能會問能不能一個ESP32同時又是發布者,又是訂閱者?答案是可以的,因為作為客戶端,都是對中間商做信息交換。

BOM

需要準備2個ESP32,
一個ESP32用于發布,
一個ESP32用于訂閱。

庫的安裝

可以在Arduino IDE的庫管理里搜索并安裝:

點擊菜單欄的「工具」---> 「庫管理」,然后在搜索框中輸入“AsyncMQTT_ESP32”,點擊安裝即可

下圖在我本地已經安裝好了:

cf8d37e4-e402-11ee-a297-92fbcf53809c.png

又或者在Github中下載,并安裝到Arduino的 "libraries"文件夾里

Github 地址:

https://github.com/khoih-prog/AsyncMQTT_ESP32

程序提點

1, 首先,需要加載AsyncMQTT_ESP32的庫

#include 

2,配置MQTT的服務器信息,可以是IP或者域名的方式

//#define MQTT_HOST         IPAddress(192, 168, 100, 100)
#define MQTT_HOST         "broker.emqx.io"        // Broker address
#define MQTT_PORT         1883

3,設置主題,發布需要主題,訂閱也需要主題

const char *Topic  = "lingshunlab/ESP32";               // 主題

4,創建MQTT客戶端的實例

// 創建MQTT客戶端的實例,名為mqttClient
AsyncMqttClient mqttClient;

5,認識mqttClient的可用的回調函數

當MQTT觸發特定事件的時候,可以配置自定義的函數

  mqttClient.onConnect(onMqttConnect);  // 設置 當MQTT連接時的回調函數
  mqttClient.onDisconnect(onMqttDisconnect); // 設置 當MQTT斷開連接時的回調函數
  mqttClient.onSubscribe(onMqttSubscribe); // 設置 當MQTT訂閱主題時的回調函數
  mqttClient.onUnsubscribe(onMqttUnsubscribe); // 設置 當MQTT取消訂閱主題時的回調函數
  mqttClient.onMessage(onMqttMessage); // 設置 當MQTT訂閱主題時的回調函數
  mqttClient.onPublish(onMqttPublish); // 設置 當取消MQTT訂閱主題時的回調函數
  mqttClient.setServer(MQTT_HOST, MQTT_PORT); // 設置 MQTT服務器信息

6, 連接MQTT服務器

  mqttClient.setServer(MQTT_HOST, MQTT_PORT); //連接MQTT服務器

7,發布主題

通過以下代碼,可以對配置好的主題發布消息

// 發布主題消息
  uint16_t packetIdPub = mqttClient.publish(PubTopic, 2, true, "welcome to Lingshunlab.com");
  Serial.print("Publisshing at QoS 2, packetId: ");
  Serial.println(packetIdPub);
  delay(2000);

8,訂閱主題

通過以下代碼,可以訂閱配置好的主題

// 訂閱MQTT主題,并QoS設置為2
  uint16_t packetIdSub = mqttClient.subscribe(SubTopic, 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);

9,當發生主題消息變化的時候的回調函數

mqttClient的回調函數有很多種,請仔細學習查看例子中其他的回調函數。在這里,特別說明一下onMessage的回調函數onMqttMessage(這個函數名稱你可以自己定義,隨喜),里面有不少參數,例如topic,payload等,其中payload即是消息的內容,可以通過輸出顯示。

void onMqttMessage(char* topic, char* payload, const AsyncMqttClientMessageProperties& properties,
                   const size_t& len, const size_t& index, const size_t& total)
{
  (void) payload;
  Serial.println("=====On MQTT Message=====");
  Serial.println("Publish received.");
  Serial.print("  topic: ");
  Serial.println(topic);
  Serial.print("  qos: ");
  Serial.println(properties.qos);
  Serial.print("  dup: ");
  Serial.println(properties.dup);
  Serial.print("  retain: ");
  Serial.println(properties.retain);
  Serial.print("  len: ");
  Serial.println(len);
  Serial.print("  index: ");
  Serial.println(index);
  Serial.print("  total: ");
  Serial.println(total);
  Serial.print("payload: ");
  Serial.println(payload);   // 輸出消息內容
}

10,請查看AsyncMQTT_ESP32的官方例子

可以學習到FreeRTOS的多線程如何應用。

程序代碼

發布主題de完整代碼

#include 

// 配置 WIFI 
#define WIFI_SSID         "***your wifi***"
#define WIFI_PASSWORD     "***your wifi password***"

// 加載AsyncMQTT_ESP32庫
#include  

// 配置MQTT服務器地址和端口
#define MQTT_HOST         IPAddress(192,168,100,100)    // Broker IP
// #define MQTT_HOST         "broker.emqx.io"        // Broker address
#define MQTT_PORT         1883

const char *PubTopic  = "lingshunlab/ESP32";               // 發布消息的主題

AsyncMqttClient mqttClient; // 創建 MQTT客戶端實例

void onMqttConnect(bool sessionPresent)   // 編寫對應的回調函數
{
  Serial.println("=====On MQTT Connect=====");
  Serial.print("Connected to MQTT broker: ");
  Serial.print(MQTT_HOST);
  Serial.print(", port: ");
  Serial.println(MQTT_PORT);
  Serial.print("PubTopic: ");
  Serial.println(PubTopic);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason)
{
  (void) reason;

  Serial.println("Disconnected from MQTT.");
}

void onMqttSubscribe(const uint16_t& packetId, const uint8_t& qos)
{
  Serial.println("Subscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
  Serial.print("  qos: ");
  Serial.println(qos);
}

void onMqttUnsubscribe(const uint16_t& packetId)
{
  Serial.println("Unsubscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void onMqttMessage(char* topic, char* payload, const AsyncMqttClientMessageProperties& properties,
                   const size_t& len, const size_t& index, const size_t& total)
{
  (void) payload;
  Serial.println("=====On MQTT Message=====");
  Serial.println("Publish received.");
  Serial.print("  topic: ");
  Serial.println(topic);
  Serial.print("  qos: ");
  Serial.println(properties.qos);
  Serial.print("  dup: ");
  Serial.println(properties.dup);
  Serial.print("  retain: ");
  Serial.println(properties.retain);
  Serial.print("  len: ");
  Serial.println(len);
  Serial.print("  index: ");
  Serial.println(index);
  Serial.print("  total: ");
  Serial.println(total);
  Serial.print("payload: ");
  Serial.println(payload);   // 輸出消息內容
}

void onMqttPublish(const uint16_t& packetId)
{
  Serial.println("Publish acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void setup()
{
  Serial.begin(115200);
  while (!Serial && millis() < 5000);
  delay(500);

  // 連接WIFI
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Connection Failed! Rebooting...");
        delay(5000);
        ESP.restart(); // 重啟esp32
      }
  delay(500);

  mqttClient.onConnect(onMqttConnect);  // 設置 當MQTT連接時的回調函數
  mqttClient.onDisconnect(onMqttDisconnect); // 設置 當MQTT斷開連接時的回調函數
  mqttClient.onMessage(onMqttMessage); // 設置 當MQTT訂閱主題時的回調函數
  mqttClient.onPublish(onMqttPublish); // 設置 當取消MQTT訂閱主題時的回調函數
  mqttClient.setServer(MQTT_HOST, MQTT_PORT); // 設置 MQTT服務器信息
  mqttClient.connect(); // 連接 MQTT

  delay(500);
}

void loop()
{
  // 發布主題消息
  uint16_t packetIdPub = mqttClient.publish(PubTopic, 2, true, "welcome to Lingshunlab.com");
  Serial.print("Publisshing at QoS 2, packetId: ");
  Serial.println(packetIdPub);
  delay(2000);
}

上傳代碼后,程序將會先連接WIFI,然后連接MQTT服務器,再之后每隔2秒發布一個對應主題的消息

cfa87fe0-e402-11ee-a297-92fbcf53809c.png

訂閱主題de完整代碼

#include 

// 配置 WIFI 
#define WIFI_SSID         "***your wifi***"
#define WIFI_PASSWORD     "***your wifi password***"

// 加載 AsyncMQTT_ESP32 庫
#include 

// 配置MQTT服務器地址和端口
#define MQTT_HOST         IPAddress(192,168,1,55)    // Broker IP
// #define MQTT_HOST         "broker.emqx.io"        // Broker address
#define MQTT_PORT         1883

const char *SubTopic  = "lingshunlab/ESP32";        // 訂閱的主題

AsyncMqttClient mqttClient;

void onMqttConnect(bool sessionPresent)
{
  Serial.println("=====On MQTT Connect=====");
  Serial.print("Connected to MQTT broker: ");
  Serial.print(MQTT_HOST);
  Serial.print(", port: ");
  Serial.println(MQTT_PORT);
  Serial.print("PubTopic: ");
  Serial.println(SubTopic);

  // 訂閱MQTT主題,并QoS設置為2
  uint16_t packetIdSub = mqttClient.subscribe(SubTopic, 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason)
{
  (void) reason;

  Serial.println("Disconnected from MQTT.");
}

void onMqttSubscribe(const uint16_t& packetId, const uint8_t& qos)
{
  Serial.println("=====On MQTT Subscribe=====");
  Serial.println("Subscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
  Serial.print("  qos: ");
  Serial.println(qos);
}

void onMqttUnsubscribe(const uint16_t& packetId)
{
  Serial.println("Unsubscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void onMqttMessage(char* topic, char* payload, const AsyncMqttClientMessageProperties& properties,
                   const size_t& len, const size_t& index, const size_t& total)
{
  (void) payload;
  Serial.println("=====On MQTT Message=====");
  Serial.println("Publish received.");
  Serial.print("  topic: ");
  Serial.println(topic);
  Serial.print("  qos: ");
  Serial.println(properties.qos);
  Serial.print("  dup: ");
  Serial.println(properties.dup);
  Serial.print("  retain: ");
  Serial.println(properties.retain);
  Serial.print("  len: ");
  Serial.println(len);
  Serial.print("  index: ");
  Serial.println(index);
  Serial.print("  total: ");
  Serial.println(total);
  Serial.print("payload: ");
  Serial.println(payload);  
}

void setup()
{
  Serial.begin(115200);
  while (!Serial && millis() < 5000);
  delay(500);

  // 連接WIFI
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Connection Failed! Rebooting...");
        delay(5000);
        ESP.restart();
      }
  delay(500);

  mqttClient.onConnect(onMqttConnect); // 設置 當MQTT連接時的回調函數
  mqttClient.onDisconnect(onMqttDisconnect);  // 設置 當MQTT斷開連接時的回調函數
  mqttClient.onSubscribe(onMqttSubscribe); // 設置 當MQTT訂閱主題時的回調函數
  mqttClient.onUnsubscribe(onMqttUnsubscribe); // 設置 當取消MQTT訂閱主題時的回調函數
  mqttClient.onMessage(onMqttMessage); // 設置 當MQTT收到主題消息時的回調函數
  mqttClient.setServer(MQTT_HOST, MQTT_PORT); // 設置 MQTT服務器信息
  mqttClient.connect(); // 連接 MQTT

  delay(500);
}

void loop()
{

}

上傳代碼后,程序將會先連接WIFI,然后連接MQTT服務器,當連接MQTT時,則會訂閱主題,之后每隔2秒就會收到主題發布的消息

cfc415ac-e402-11ee-a297-92fbcf53809c.png




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 回調函數
    +關注

    關注

    0

    文章

    88

    瀏覽量

    11887
  • Arduino
    +關注

    關注

    190

    文章

    6498

    瀏覽量

    192056
  • 樹莓派
    +關注

    關注

    121

    文章

    2001

    瀏覽量

    107419
  • MQTT
    +關注

    關注

    5

    文章

    681

    瀏覽量

    23704
  • ESP32
    +關注

    關注

    21

    文章

    1017

    瀏覽量

    19234

原文標題:ESP32 運行MQTT客戶端進行主題的發布和訂閱

文章出處:【微信號:凌順實驗室,微信公眾號:凌順實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    esp32c3想把數據上傳到aws平臺上,怎么保存歷史記錄呢?

    現在只能在mqtt測試客戶端發布訂閱消息,但一刷新界面,又得重新訂閱主題,并且之前的消息記錄都
    發表于 06-20 06:04

    《DNESP32S3使用指南-IDF版_V1.6》第五十五章 基于MQTT協議連接阿里云服務器

    (Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是
    發表于 03-18 09:22

    MQTT協議介紹之三:發送和接收消息

    強烈建議您先閱讀。上一節我們研究了建立MQTT客戶端和代理之間的連接,所以本周我們將討論發送和接收消息。發布MQTT客戶端連接到代理后,可以
    發表于 08-25 19:54

    MQTT協議介紹之一:發布/訂閱

    MQTT協議的內容。這里先介紹MQTT信息和協議背景。MQTT介紹MQTT客戶端服務器發布/
    發表于 08-25 19:58

    MQTT的通信模型及消息

    同時是訂閱者 。  MQTT 消息的發布者和訂閱者都是客戶端,服務器只是作為一個中轉的存在,將發布
    發表于 01-19 15:57

    基于Eclipse paho-mqtt源碼包的MQTT客戶端設計(上)

    之間,它可以:接受來自客戶的網絡連接接收客戶發布的應用信息處理來自客戶端訂閱和退訂請求向訂閱
    發表于 08-04 16:28

    基于Eclipse paho-mqtt源碼包的MQTT客戶端設計(下)

    ,如果有訂閱的 Topic 沒有設置回調函數,則使用該默認回調函數啟動 MQTT 客戶端配置完成 MQTT 客戶端實例后,需要啟動
    發表于 08-04 16:33

    esp32c3想把數據上傳到aws平臺上但怎么保存歷史記錄啊?

    現在只能在mqtt測試客戶端發布訂閱消息,但一刷新界面,又得重新訂閱主題,并且之前的消息記錄都
    發表于 02-17 08:19

    esp32-c3 mqtt遺囑實驗沒成功的原因?

    ;/test" topic 的消息 消息內容cono 好像去掉了后面一部分。后來改變esp32-c3(發布者)的內容都還是訂閱客戶端這個topic出現。
    發表于 03-07 09:00

    如何在rtos mqtt示例中獲取客戶端句柄?

    中,我調用 代碼:全選esp_mqtt_client_publish() 但我沒有客戶端句柄,它只在回調中設置。我嘗試使用客戶端句柄的全局副本,但它沒有用,除了是個壞主意: 代碼:全選
    發表于 05-15 08:13

    NodeMCU項目(三)MQTT客戶端

    的限制。NodeMCU讀取連接的溫濕度傳感器的信息,手機客戶端訂閱該信息,可以實現遠程監控;NodeMCU訂閱手機發布的命令主題,可以實現遠
    發表于 11-05 17:05 ?1次下載
    NodeMCU項目(三)<b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>

    盤點2023年值得嘗試的MQTT客戶端工具

    隨著物聯網(IoT)的快速發展,MQTT協議被許多公司和開發人員廣泛使用。在學習和使用 MQTT 的過程中,MQTT 客戶端工具用于連接 MQTT
    的頭像 發表于 07-13 10:11 ?6080次閱讀
    盤點2023年值得嘗試的<b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>工具

    MQTT中服務客戶端

    服務器(broker),它是 MQTT 信息傳輸的樞紐,負責將 MQTT 客戶端發送來的信息傳遞給 MQTT 客戶端
    的頭像 發表于 07-30 14:55 ?3195次閱讀

    服務如何控制客戶端之間的信息通訊

    進行管理。 比如上圖所示,假設我們需要利用手機和電腦獲取開發板在運行過程中 SoC 芯片的溫度,那么首先電腦和手機這兩個客戶端需要向 MQTT服務器
    的頭像 發表于 07-30 15:10 ?1125次閱讀
    服務<b class='flag-5'>端</b>如何控制<b class='flag-5'>客戶端</b>之間的信息通訊

    如何在MQTT發布訂閱實體

    MQTT發布訂閱實體(主題)是MQTT通信的核心操作,下面將詳細介紹其原理、步驟以及示例代碼,幫助你全面理解這一過程。 一、
    的頭像 發表于 05-20 17:21 ?321次閱讀