关于ESP32/8266使用async-mqtt-client库的一些基本介绍

目标:
async-mqtt-client是一款基于Arduino的mqtt客户端连接库
服务于ESP32/8266,对于其他设备不兼容(可能)
本文会介绍async-mqtt-client的基本使用方法,解释一些接口的用途

参考资料:
marvinroger/async-mqtt-client
关键词:
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)
需要额外下载对应的库,并放入依赖路径下

另外,本文主要阐述如何在ESP32中的使用
8266用法基本类似,仅在WiFi连接和计时器TimerHandle有接口区别,所以不会进行详细叙述

2. 使用介绍

先打开async-mqtt-client库中的文件夹examples,找到案例
这里选择ESP32的案例FullyFeatured-ESP32.ino
案例的前面一段都是具体的方法,直接拉到setup(),可以看到一共执行了4步

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  
  // 1.创建了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的回调函数,处理进行WiFi连接后的事件(成功连接和连接失败)
  WiFi.onEvent(WiFiEvent);

  // 3.配置mqtt服务器,重要(都是挂载回调函数)
  mqttClient.onConnect(onMqttConnect);              // 当mqtt连接时
  mqttClient.onDisconnect(onMqttDisconnect);        // 失去连接时
  mqttClient.onSubscribe(onMqttSubscribe);          // 订阅连接时
  mqttClient.onUnsubscribe(onMqttUnsubscribe);      // 取消订阅时
  mqttClient.onMessage(onMqttMessage);              // 获取消息时
  mqttClient.onPublish(onMqttPublish);              // 发送消息时
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);       // 设置mqtt服务器地址,端口

  // 4.进行WiFi连接
  connectToWifi();
}

在配置mqtt时主要关心设置订阅地址获取消息
在本案例中,订阅地址在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: 会话质量,简单来说,不重要的选择QoS0,重要的选2
  uint16_t packetIdSub = mqttClient.subscribe("test/lol", 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);

  // 发布消息: mqttClient.publish(addr, qos, retain, payload);
  // addr,qos,和subscribe相同
  // retain: 标识是否保留消息.如果标识true则在被覆盖前都会保留内容
  // payload: 需要发布的消息
  // ↓案例发布了三种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()

接收到消息时会调用本方法(回调函数),可以在此处配置接收到消息后如何处理方式

void MQTTController::onMqttMessage(char *topic, char *payload, AsyncMqttClientMessageProperties properties, size_t len,
                                   size_t index, size_t total) {
    // 打印消息的每项参数或内容
    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本身不包含终止符,如果直接打印/处理内容会在文本最后获取到乱码
    // 可以通过函数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)  //回调函数
);

其中回调函数使用关键词reinterpret_cast来重定义函数connectToWifi的类型
否则需要根据TimerCallbackFunction_t的格式来创建回调函数

3.2 设置WiFi信息和MQTT服务器

在使用该库的时候还需要额外设定WiFi和MQTT的配置

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

#define MQTT_HOST IPAddress(192, 168, 1, 10)  // 设置MQTT的地址
// #define MQTT_HOST "your.domain"  // 如果你是域名,则可以替换为字符串
#define MQTT_PORT 1883  // 设置端口

然后会在setup()中建立连接

// WiFi
connectToWifi();

// mqtt
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// 补充,如果需要用户名认证
setCredentials(username, password);
3.3 其他

在库下的docs文件夹内有详细的说明文档,可以自行查阅

-- 完 --

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容