在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析ESP32運(yùn)行MQTT客戶端進(jìn)行主題的發(fā)布和訂閱的方法

jf_Ufm3lVrj ? 來源:凌順實(shí)驗(yàn)室 ? 2024-03-18 10:05 ? 次閱讀

ESP32 MQTT的庫(kù)有很多,凌順實(shí)驗(yàn)室(lingshunlab.com)這次主要使用AsyncMQTT_ESP32,以后有機(jī)會(huì)再更多的MQTT其他庫(kù)的使用方法。

前提條件

樹莓派部署本地的MQTT服務(wù)端,具體安裝請(qǐng)查看以下連接:

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

ESP32和樹莓派在同一WIFI網(wǎng)絡(luò)里面

效果實(shí)現(xiàn)

凌順實(shí)驗(yàn)室(lingshunlab.com)在本示例展示了使用兩個(gè)ESP32,分別實(shí)現(xiàn)發(fā)布MQTT的主題消息和訂閱并輸出MQTT的主題內(nèi)容。當(dāng)然,可能會(huì)問能不能一個(gè)ESP32同時(shí)又是發(fā)布者,又是訂閱者?答案是可以的,因?yàn)樽鳛榭蛻舳耍际菍?duì)中間商做信息交換。

BOM

需要準(zhǔn)備2個(gè)ESP32,
一個(gè)ESP32用于發(fā)布,
一個(gè)ESP32用于訂閱。

庫(kù)的安裝

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

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

下圖在我本地已經(jīng)安裝好了:

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

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

Github 地址:

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

程序提點(diǎn)

1, 首先,需要加載AsyncMQTT_ESP32的庫(kù)

#include 

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

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

3,設(shè)置主題,發(fā)布需要主題,訂閱也需要主題

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

4,創(chuàng)建MQTT客戶端的實(shí)例

// 創(chuàng)建MQTT客戶端的實(shí)例,名為mqttClient
AsyncMqttClient mqttClient;

5,認(rèn)識(shí)mqttClient的可用的回調(diào)函數(shù)

當(dāng)MQTT觸發(fā)特定事件的時(shí)候,可以配置自定義的函數(shù)

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

6, 連接MQTT服務(wù)器

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

7,發(fā)布主題

通過以下代碼,可以對(duì)配置好的主題發(fā)布消息

// 發(fā)布主題消息
  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設(shè)置為2
  uint16_t packetIdSub = mqttClient.subscribe(SubTopic, 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);

9,當(dāng)發(fā)生主題消息變化的時(shí)候的回調(diào)函數(shù)

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

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);   // 輸出消息內(nèi)容
}

10,請(qǐng)查看AsyncMQTT_ESP32的官方例子

可以學(xué)習(xí)到FreeRTOS的多線程如何應(yīng)用。

程序代碼

發(fā)布主題de完整代碼

#include 

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

// 加載AsyncMQTT_ESP32庫(kù)
#include  

// 配置MQTT服務(wù)器地址和端口
#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";               // 發(fā)布消息的主題

AsyncMqttClient mqttClient; // 創(chuàng)建 MQTT客戶端實(shí)例

void onMqttConnect(bool sessionPresent)   // 編寫對(duì)應(yīng)的回調(diào)函數(shù)
{
  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);   // 輸出消息內(nèi)容
}

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);  // 設(shè)置 當(dāng)MQTT連接時(shí)的回調(diào)函數(shù)
  mqttClient.onDisconnect(onMqttDisconnect); // 設(shè)置 當(dāng)MQTT斷開連接時(shí)的回調(diào)函數(shù)
  mqttClient.onMessage(onMqttMessage); // 設(shè)置 當(dāng)MQTT訂閱主題時(shí)的回調(diào)函數(shù)
  mqttClient.onPublish(onMqttPublish); // 設(shè)置 當(dāng)取消MQTT訂閱主題時(shí)的回調(diào)函數(shù)
  mqttClient.setServer(MQTT_HOST, MQTT_PORT); // 設(shè)置 MQTT服務(wù)器信息
  mqttClient.connect(); // 連接 MQTT

  delay(500);
}

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

上傳代碼后,程序?qū)?huì)先連接WIFI,然后連接MQTT服務(wù)器,再之后每隔2秒發(fā)布一個(gè)對(duì)應(yīng)主題的消息

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

訂閱主題de完整代碼

#include 

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

// 加載 AsyncMQTT_ESP32 庫(kù)
#include 

// 配置MQTT服務(wù)器地址和端口
#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設(shè)置為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); // 設(shè)置 當(dāng)MQTT連接時(shí)的回調(diào)函數(shù)
  mqttClient.onDisconnect(onMqttDisconnect);  // 設(shè)置 當(dāng)MQTT斷開連接時(shí)的回調(diào)函數(shù)
  mqttClient.onSubscribe(onMqttSubscribe); // 設(shè)置 當(dāng)MQTT訂閱主題時(shí)的回調(diào)函數(shù)
  mqttClient.onUnsubscribe(onMqttUnsubscribe); // 設(shè)置 當(dāng)取消MQTT訂閱主題時(shí)的回調(diào)函數(shù)
  mqttClient.onMessage(onMqttMessage); // 設(shè)置 當(dāng)MQTT收到主題消息時(shí)的回調(diào)函數(shù)
  mqttClient.setServer(MQTT_HOST, MQTT_PORT); // 設(shè)置 MQTT服務(wù)器信息
  mqttClient.connect(); // 連接 MQTT

  delay(500);
}

void loop()
{

}

上傳代碼后,程序?qū)?huì)先連接WIFI,然后連接MQTT服務(wù)器,當(dāng)連接MQTT時(shí),則會(huì)訂閱主題,之后每隔2秒就會(huì)收到主題發(fā)布的消息

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




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11562
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6469

    瀏覽量

    187077
  • 樹莓派
    +關(guān)注

    關(guān)注

    116

    文章

    1707

    瀏覽量

    105633
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    651

    瀏覽量

    22506
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    971

    瀏覽量

    17261

原文標(biāo)題:ESP32 運(yùn)行MQTT客戶端進(jìn)行主題的發(fā)布和訂閱

文章出處:【微信號(hào):凌順實(shí)驗(yàn)室,微信公眾號(hào):凌順實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp32c3想把數(shù)據(jù)上傳到aws平臺(tái)上,怎么保存歷史記錄呢?

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

    MQTT協(xié)議介紹之三:發(fā)送和接收消息

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

    MQTT協(xié)議介紹之一:發(fā)布/訂閱

    MQTT協(xié)議的內(nèi)容。這里先介紹MQTT信息和協(xié)議背景。MQTT介紹MQTT客戶端服務(wù)器發(fā)布/
    發(fā)表于 08-25 19:58

    MQTT 協(xié)議開發(fā)入門

    者(Publish)、代理(Broker)(服務(wù)器)、訂閱者(Subscribe)。其中,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布
    發(fā)表于 11-05 09:38

    MQTT 協(xié)議 開發(fā)入門

    ,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布者可以同時(shí)是訂閱者。MQTT傳輸?shù)南?/div>
    發(fā)表于 11-07 15:51

    MQTT的通信模型及消息

    同時(shí)是訂閱者 。  MQTT 消息的發(fā)布者和訂閱者都是客戶端,服務(wù)器只是作為一個(gè)中轉(zhuǎn)的存在,將發(fā)布
    發(fā)表于 01-19 15:57

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

    之間,它可以:接受來自客戶的網(wǎng)絡(luò)連接接收客戶發(fā)布的應(yīng)用信息處理來自客戶端訂閱和退訂請(qǐng)求向訂閱
    發(fā)表于 08-04 16:28

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

    ,如果有訂閱的 Topic 沒有設(shè)置回調(diào)函數(shù),則使用該默認(rèn)回調(diào)函數(shù)啟動(dòng) MQTT 客戶端配置完成 MQTT 客戶端實(shí)例后,需要啟動(dòng)
    發(fā)表于 08-04 16:33

    esp32c3想把數(shù)據(jù)上傳到aws平臺(tái)上但怎么保存歷史記錄啊?

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

    esp32-c3 mqtt遺囑實(shí)驗(yàn)沒成功的原因?

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

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

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

    NodeMCU項(xiàng)目(三)MQTT客戶端

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

    盤點(diǎn)2023年值得嘗試的MQTT客戶端工具

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

    MQTT中服務(wù)客戶端

    服務(wù)器(broker),它是 MQTT 信息傳輸?shù)臉屑~,負(fù)責(zé)將 MQTT 客戶端發(fā)送來的信息傳遞給 MQTT 客戶端
    的頭像 發(fā)表于 07-30 14:55 ?2652次閱讀

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

    進(jìn)行管理。 比如上圖所示,假設(shè)我們需要利用手機(jī)和電腦獲取開發(fā)板在運(yùn)行過程中 SoC 芯片的溫度,那么首先電腦和手機(jī)這兩個(gè)客戶端需要向 MQTT服務(wù)器
    的頭像 發(fā)表于 07-30 15:10 ?816次閱讀
    服務(wù)<b class='flag-5'>端</b>如何控制<b class='flag-5'>客戶端</b>之間的信息通訊
    主站蜘蛛池模板: 欧美特黄视频在线观看| 国产在线观看色| 99久久免费精品高清特色大片| 毛片视频免费网站| 久久久久久免费播放一级毛片| 日本精品一卡二卡≡卡四卡| 永久免费看片| semm亚洲欧美在线高清| 可以在线看黄的网站| 日韩高清成人毛片不卡| 人人爱人人射| 天天躁日日躁狠狠躁一级毛片 | 国内精品久久久久久影院老狼| 手机看片免费福利| 久久精品国产免费中文| 老逼影院| 黄色综合网站| 亚洲电影天堂网| 欧美一区二区三区四区在线观看 | 天天干天天添| 男女一进一出无遮挡黄| 特黄特色视频| 4hu影院最新地址www| 91大神精品视频| 欧洲一级鲁丝片免费| 天天操天天谢| 一区二区三区高清在线| 激情婷婷在线| 狠狠做深爱婷婷久久一区| 波多野结衣福利| 在线久综合色手机在线播放| 狠狠88综合久久久久综合网| а8天堂资源在线官网| 色免费网站| 成人精品亚洲| 国产三片高清在线观看| 特毛片| 天天弄天天模| 亚洲最大成人网色| 夜夜操夜夜骑| japan日韩xxxx69hd|