实现ESP32 MQTT网关
这个部分中,esp32将作为一个MQTT客户端订阅LED控制TOPIC,接收MQTT消息。 在解析JSON数据后,esp32将输出对应的LED控制信号。同时,ESP32也将在LED状态TOPIC上发送状态信息。
MQTT简介
在MQTT协议中,当一个用户在一个频道发送消息时,这个频道的所有订阅用户都会收到这个消息,
前提时这些用户都连接到同一个MQTT中间件。
MQTT中间件及硬件
笔者在这个项目中使用常见的开源MQTT中间件:mosquitto。
中间件可以在路由器NAT之后的本地运行,也可以在云端运行。笔者使用了一个树莓派3作为MQTT中间件的运行平台。 云端的中间件可以选择CloudMQTT,其他云服务商(比如阿里云等)也最近推出了廉价的MQTT中间件服务。
ESP32的MQTT客户端配置
笔者使用的是arduino-ide的开发环境(关于如何在arduino-ide或类似环境中开发esp32)。
arduino的MQTT库有pubsubclient,Adafruit_MQTT_Library和ArduinoMqtt等。由于arduino平台的各个硬件(arduino WIFI,ESP32,ESP8266)都有各自WifiClient的实现,MQTT库基本可以通用,很少出现不兼容问题。
笔者使用的是ArduinoMqtt库。ESP32的程序可以参考示例程序:ConnectEsp8266WiFiClient.ino。
只需要做出下列更改:
#include <ESP8266WiFi.h>
换成#include <WiFi.h>
。
#define MQTT_ID "TEST-ID"
换成自己的MQTT客户端ID,
WiFi.begin("ssid", "passphrase");
设置自己的WIFI名称和密码,
network.connect("test.mosquitto.org", 1883);
里设置MQTT中间件的地址,
如果MQTT中间件访问需要用户名和密码的话,MQTTPacket_connectData options = MQTTPacket_connectData_initializer;
后添加
options.username.cstring = CloudMQTTUsername; options.password.cstring = CloudMQTTPassword;
ESP32订阅话题
订阅TOPIC:
MqttClient::Error::type rc = mqtt->subscribe(
MQTT_TOPIC_LED, MqttClient::QOS0, processMQTTMessage
);
if (rc != MqttClient::Error::SUCCESS) {
LOG_PRINTFLN("Subscribe error: %i", rc<