前言

之前钻研了一段时间的 COAP 协定后果爱智那边没有测试工具,而后 arduino 也没有找到适合的库,我懒癌发生也懒得修这库,就只能十分难堪先临时放一放了。不过我在 爱智APP -> 设施 -> 设置 中发现爱智中做了一个 MQTT Broker ,也就是说我能利用精灵一号,在两块ESP32 之间进行通信了,而且 arduino 也有现成的库,而后我就突击了一下MQTT ,把这玩意给弄起来了,这里就给大家分享一下。

配置 MQTT Broker

在爱智APP的设施中有个设置按钮:


在外面能够启用精灵一号的 MQTT Broker 性能并且进行设置:

在 MQTT 的设置中能够配置相干参数:

这些参数和与上面 ESP32 中的配置无关

代码获取

我应用的 MQTT 库间接在 IDE 的库管理器里就能下载到:

或者去GitHub下载:

https://github.com/adafruit/A...

而示例代码,老样子在灵感桌面的机密宝库 下载代码。
或者间接 git clone:

https://gitee.com/inspiration...


外面有两个文件夹,别离是发布者和订阅者发的示例。

代码解析

为了不便解说逻辑,我会打乱代码的程序可能还会进行裁剪。本 demo 基于 MQTT 库自带的 DEMO 批改而来。

创立 MQTT 客户端

#include <WiFi.h>//#include "WiFiClientSecure.h"#include "WiFiClient.h"#include "Adafruit_MQTT.h"#include "Adafruit_MQTT_Client.h"/************************* WiFi Access Point *********************************/#define WLAN_SSID "EOS-Tenda"#define WLAN_PASS "1234567890"/************************* Adafruit.io Setup *********************************/#define AIO_SERVER      "192.168.128.1"// 在爱智APP->设施->MQTT Broker 设置,能够看到并且设置#define AIO_SERVERPORT  1883// 在爱智APP->设施->MQTT Broker 设置,能够看到并且设置#define AIO_USERNAME "user"#define AIO_KEY      "passwd"/************ Global State (you don't need to change this!) ******************/// 爱智仿佛没有这个平安模式,于是应用了 WiFiClient //WiFiClientSecure client;WiFiClient client;// 通过传入WiFi客户端和MQTT服务端以及登录详细信息来设置MQTT客户端类,留神连入爱智必须设置 cid,可能和爱智那边设置有关系。Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, "Publish_cid", AIO_USERNAME, AIO_KEY);

须要留神的是尽管 Adafruit_MQTT_Client 有能够不带 cid 的实现

/*** * 函数1:创立MQTT客户端 * @param client 起源客户端,比方Wificlient eth以太网 * @param server  mqtt服务器地址 * @param port    mqtt服务器端口 * @param cid     客户端id,如果是8266,能够设置为芯片id之类的,每个端都是举世无双 * @param user    mqtt服务器账号 * @param pass    mqtt服务器明码 */Adafruit_MQTT_Client(Client *client, const char *server, uint16_t port,                       const char *cid, const char *user, const char *pass):    Adafruit_MQTT(server, port, cid, user, pass),    client(client){}/*** * 函数2:创立MQTT客户端 * @param client 起源客户端,比方Wificlient eth以太网 * @param server  mqtt服务器地址 * @param port    mqtt服务器端口 * @param user    mqtt服务器账号 * @param pass    mqtt服务器明码 */Adafruit_MQTT_Client(Client *client, const char *server, uint16_t port,                       const char *user="", const char *pass=""):    Adafruit_MQTT(server, port, user, pass),    client(client)————————————————版权申明:本文为CSDN博主「单片机菜鸟哥」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/dpjcn1990/article/details/103376117

然而连贯爱智时 Adafruit_MQTT_Client 函数必须设置 cid 而且 cid 必须是举世无双的,否则:

cid 反复会导致这两个设施收到同样的,反复的连贯胜利音讯,使设施不停的去连贯精灵一号

创立 MQTT 公布主题

// 设置一个名为“test”的提要用于公布。// 留神AIO的MQTT门路遵循: <username>/feeds/<feedname>Adafruit_MQTT_Publish test = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/test");

创立 MQTT 订阅主题

// 设置订阅的主题。Adafruit_MQTT_Subscribe test = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/test");

初始化流程

void setup() {  Serial.begin(115200);  delay(10);  Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));  // Connect to WiFi access point.  Serial.println(); Serial.println();  Serial.print("Connecting to ");  Serial.println(WLAN_SSID);  delay(1000);  WiFi.begin(WLAN_SSID, WLAN_PASS);  delay(2000);  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }  Serial.println();  Serial.println("WiFi connected");  Serial.println("IP address: "); Serial.println(WiFi.localIP());  // 设置测试须要的 MQTT 订阅。发布者把这一行正文掉  mqtt.subscribe(&test);}

MQTT 连贯

// 函数用于依据须要连贯并从新连贯到MQTT服务器// 应该在循环函数中调用,它将留神是否连贯。void MQTT_connect() {  int8_t ret;  // 如果曾经进行连贯。  if (mqtt.connected()) {    return;  }  Serial.print("Connecting to MQTT... ");  uint8_t retries = 3;  // 连贯mqtt服务器  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected       Serial.println(mqtt.connectErrorString(ret));       Serial.println("Retrying MQTT connection in 5 seconds...");       mqtt.disconnect();       delay(5000);  // wait 5 seconds       retries--;       if (retries == 0) {         // basically die and wait for WDT to reset me         while (1);       }  }  Serial.println("MQTT Connected!");}

发布者协定主循环

void loop() {  // 确保到MQTT服务器的连贯是流动的(这将创立第一个连贯,  // 并在断开连接时主动从新连贯)。请参阅下面的MQTT_connect函数定义。  MQTT_connect();  // 当初咱们能够公布货色了!  Serial.print(F("\nSending val "));  Serial.print(x);  Serial.print(F(" to test feed..."));  if (! test.publish(x++)) {    Serial.println(F("Failed"));  } else {    Serial.println(F("OK!"));  }  // wait a couple seconds to avoid rate limit  delay(2000);}

订阅者协定主循环

void loop() {  // 确保到MQTT服务器的连贯是流动的(这将创立第一个连贯,  // 并在断开连接时主动从新连贯)。请参阅下面的MQTT_connect函数定义。  MQTT_connect();    // 期待订阅音讯循环  Adafruit_MQTT_Subscribe *subscription;  // 在5s内判断是否有订阅音讯进来  while ((subscription = mqtt.readSubscription(5000)))   {    Serial.println("subscription");    // 判断是否是咱们对应的主题    if (subscription == &test)    {      Serial.print(F("Got: "));      // 打印主题信息内容      Serial.println((char *)test.lastread);    }  // wait a couple seconds to avoid rate limit  delay(2000);  }}

总结


精灵一号的 MQTT Broker 还是好用的,两个 ESP32 板子完满的通信了。