關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹

目標:
async-mqtt-client是一款基于Arduino的mqtt客戶端連接庫
服務(wù)于ESP32/8266,對于其他設(shè)備不兼容(可能)
本文會介紹async-mqtt-client的基本使用方法,解釋一些接口的用途

參考資料:
marvinroger/async-mqtt-client
關(guān)鍵詞:
async-mqtt-client
Arduino
MQTT
ESP32,ESP8266

目錄

  1. 前期準備
  2. 使用介紹
  3. 其他事項

1. 前期準備

因為async-mqtt-client使用異步,會額外依賴異步庫
對于ESP32核心的,依賴me-no-dev/AsyncTCP (ESP32)
8266的芯片依賴me-no-dev/ESPAsyncTCP (ESP8266)
需要額外下載對應(yīng)的庫,并放入依賴路徑下

另外,本文主要闡述如何在ESP32中的使用
8266用法基本類似,僅在WiFi連接和計時器TimerHandle有接口區(qū)別,所以不會進行詳細敘述

2. 使用介紹

先打開async-mqtt-client庫中的文件夾examples,找到案例
這里選擇ESP32的案例FullyFeatured-ESP32.ino
案例的前面一段都是具體的方法,直接拉到setup(),可以看到一共執(zhí)行了4步

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  
  // 1.創(chuàng)建了2個計時器,用于重連
  mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
  wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));
 
  // 2.掛載WiFi的回調(diào)函數(shù),處理進行WiFi連接后的事件(成功連接和連接失敗)
  WiFi.onEvent(WiFiEvent);

  // 3.配置mqtt服務(wù)器,重要(都是掛載回調(diào)函數(shù))
  mqttClient.onConnect(onMqttConnect);              // 當mqtt連接時
  mqttClient.onDisconnect(onMqttDisconnect);        // 失去連接時
  mqttClient.onSubscribe(onMqttSubscribe);          // 訂閱連接時
  mqttClient.onUnsubscribe(onMqttUnsubscribe);      // 取消訂閱時
  mqttClient.onMessage(onMqttMessage);              // 獲取消息時
  mqttClient.onPublish(onMqttPublish);              // 發(fā)送消息時
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);       // 設(shè)置mqtt服務(wù)器地址,端口

  // 4.進行WiFi連接
  connectToWifi();
}

在配置mqtt時主要關(guān)心設(shè)置訂閱地址獲取消息
在本案例中,訂閱地址在onMqttConnect()方法中
而獲取消息在onMqttMessage()
分別介紹2個方法中的代碼

2.1 onMqttConnect()
void onMqttConnect(bool sessionPresent) {
  // sessionPresent: 返回bool,顯示會話session連接成功與否
  Serial.println("Connected to MQTT.");
  Serial.print("Session present: ");
  Serial.println(sessionPresent);

  // 訂閱地址: mqttClient.subscribe(addr,qos)
  // addr: 訂閱的地址
  // QoS: 會話質(zhì)量,簡單來說,不重要的選擇QoS0,重要的選2
  uint16_t packetIdSub = mqttClient.subscribe("test/lol", 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);

  // 發(fā)布消息: mqttClient.publish(addr, qos, retain, payload);
  // addr,qos,和subscribe相同
  // retain: 標識是否保留消息.如果標識true則在被覆蓋前都會保留內(nèi)容
  // payload: 需要發(fā)布的消息
  // ↓案例發(fā)布了三種QoS
  mqttClient.publish("test/lol", 0, true, "test 1");
  Serial.println("Publishing at QoS 0");
  uint16_t packetIdPub1 = mqttClient.publish("test/lol", 1, true, "test 2");
  Serial.print("Publishing at QoS 1, packetId: ");
  Serial.println(packetIdPub1);
  uint16_t packetIdPub2 = mqttClient.publish("test/lol", 2, true, "test 3");
  Serial.print("Publishing at QoS 2, packetId: ");
  Serial.println(packetIdPub2);
}
2.2 onMqttMessage()

接收到消息時會調(diào)用本方法(回調(diào)函數(shù)),可以在此處配置接收到消息后如何處理方式

void MQTTController::onMqttMessage(char *topic, char *payload, AsyncMqttClientMessageProperties properties, size_t len,
                                   size_t index, size_t total) {
    // 打印消息的每項參數(shù)或內(nèi)容
    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);
    
    // 重要,消息本體為payload.原代碼并沒有本段
    // payload本身不包含終止符,如果直接打印/處理內(nèi)容會在文本最后獲取到亂碼
    // 可以通過函數(shù)String.substring(start,end)來處理payload
    Serial.print("  payload: ");
    String fixedStr = ((String) payload).substring(0, len);       //char不會斷幀,在此處處理
    Serial.println(fixedStr);   // fixedStr,處理后的字符串
}

3. 其他注意事項

3.1 定時器xTimerCreate(...)

async-mqtt-client通過定時器來處理失去連接/連接失敗后的重連問題
這也是額外依賴了freeRTOS庫的原因
有2個定時器,格式都是類似的,這里介紹WiFi的

#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"

...

wifiReconnectTimer = xTimerCreate("wifiTimer",                              // 定時器名稱
                                  pdMS_TO_TICKS(2000),      //周期,tick為單位
                                  pdFALSE,  //tick到期后是否自動裝載,(pdTRUE)
                                  (void *) 0,     //定時器ID
                                  reinterpret_cast<TimerCallbackFunction_t>(connectToWifi)  //回調(diào)函數(shù)
);

其中回調(diào)函數(shù)使用關(guān)鍵詞reinterpret_cast來重定義函數(shù)connectToWifi的類型
否則需要根據(jù)TimerCallbackFunction_t的格式來創(chuàng)建回調(diào)函數(shù)

3.2 設(shè)置WiFi信息和MQTT服務(wù)器

在使用該庫的時候還需要額外設(shè)定WiFi和MQTT的配置

#define WIFI_SSID "yourSSID"
#define WIFI_PASSWORD "yourpass"

#define MQTT_HOST IPAddress(192, 168, 1, 10)  // 設(shè)置MQTT的地址
// #define MQTT_HOST "your.domain"  // 如果你是域名,則可以替換為字符串
#define MQTT_PORT 1883  // 設(shè)置端口

然后會在setup()中建立連接

// WiFi
connectToWifi();

// mqtt
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// 補充,如果需要用戶名認證
setCredentials(username, password);
3.3 其他

在庫下的docs文件夾內(nèi)有詳細的說明文檔,可以自行查閱

-- 完 --

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羹应,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丐膝,更是在濱河造成了極大的恐慌量愧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帅矗,死亡現(xiàn)場離奇詭異偎肃,居然都是意外死亡,警方通過查閱死者的電腦和手機浑此,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門累颂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凛俱,你說我怎么就攤上這事紊馏。” “怎么了蒲犬?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵朱监,是天一觀的道長。 經(jīng)常有香客問我原叮,道長赫编,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任奋隶,我火速辦了婚禮擂送,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯欣。我一直安慰自己嘹吨,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布境氢。 她就那樣靜靜地躺著蟀拷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萍聊。 梳的紋絲不亂的頭發(fā)上匹厘,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音脐区,去河邊找鬼愈诚。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炕柔。 我是一名探鬼主播酌泰,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匕累!你這毒婦竟也來了陵刹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤欢嘿,失蹤者是張志新(化名)和其女友劉穎衰琐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炼蹦,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡羡宙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掐隐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狗热。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虑省,靈堂內(nèi)的尸體忽然破棺而出匿刮,到底是詐尸還是另有隱情,我是刑警寧澤探颈,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布熟丸,位于F島的核電站,受9級特大地震影響伪节,放射性物質(zhì)發(fā)生泄漏光羞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一架馋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧全闷,春花似錦叉寂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至局服,卻和暖如春钓瞭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淫奔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工山涡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓鸭丛,卻偏偏與公主長得像竞穷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳞溉,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容