共计 4286 个字符,预计需要花费 11 分钟才能阅读完成。
前言
之前钻研了一段时间的 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 板子完满的通信了。