MQTT 控制命令解析
本节介绍在 arduino 中如何进行 MQTT 数据的解析,具体包含以下步骤:WIFI 的连接、MQTT 服务器的连接、主题的订阅和 JSON 格式数据解析。
介绍在ARDUINO中编程实现的关键步骤:需要安装一些相应的库,可以参照之前的文档
WIFI 的连接
MQTT 通信需要硬件能够连接到外网的 MQTT 服务器,所以首先需要让ESP32板子连接网络,这里选择 WIFI 的方式。
包含头文件:
c
#include <WiFi.h>
设定 WIFI 热点的账号和密码:
c
const char *ssid = "TEST"; // Wifi 账号
const char *password = "12345678"; // wifi 密码
在初始化中连接网络,一直尝试,直到连接成功:
c
// connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(2000);
Serial.println("Connecting to WiFi...");
}
MQTT 服务器的连接
可以参考环境搭建中,教你如何在云服务器上搭建 MQTT 服务器,文章链接如下:
我们已经搭建好了一台 MQTT 服务器,可以供大家免费测试使用。
赠送 MQTT 服务器测试端口:关注公众号天人之际工作室,回复”MQTT“即可获得测试服务器地址账号密码。
引入头文件:
c
#include <PubSubClient.h>
定义连接信息和客户端变量:注意用于 MQTT 的硬件的端口是 1883
cpp
// MQTT Broker 服务端连接
const char *mqtt_broker = "XXX";//mqtt服务器地址
const char *topic_subscribe = "XXX";//主题
const char *topic_publish = "XXX";//主题
const char *mqtt_username = "XXX";
const char *mqtt_password = "XXX";
const int mqtt_port = 1883;//端口
//客户端变量
WiFiClient espClient;
PubSubClient client(espClient);
在初始化中连接 MQTT 服务端:一直连接直到连接成功
cpp
//connecting to a mqtt broker 连接服务端
client.setServer(mqtt_broker, mqtt_port);
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public emqx mqtt broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());//返回连接状态
delay(2000);
}
}
MQTT 主题的订阅
设置回调函数,即订阅的主题中发布新的消息时,ESP32 会收到并触发执行callback 函数
c
client.setCallback(callback);//回调
设置订阅的主题:
c
client.subscribe(topic_subscribe);
MQTT 数据的解析
MQTT 消息是用JSON 数据格式进行通信的,所以在接收到订阅消息中新发布的消息后,需要对信息用JSON 格式进行解析。
在callback函数中进行数据的解析:
c
void callback(const char* topic, byte* payload, unsigned int length) {
Serial.println("On message....");
char json[length + 1];
strncpy (json, (char*)payload, length);
json[length] = '\0';
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Message: ");
Serial.println(json);
StaticJsonBuffer<200> jsonBuffer;
JsonObject& data = jsonBuffer.parseObject((char*)json);
if (!data.success())
{
Serial.println("parseObject() failed");
return;
}
// Check request method,
//----如果有新的数据内容解析,类似添加即可----
String state_light= String((const char*)data["LIGHT"]);
String state_fan=String((const char*)data["FAN"]);
String state_curtain=String((const char*)data["CURTAIN"]);
Serial.println(state_light);
if(state_light=="ON"){
Serial.println("light on");
digitalWrite(LIGHTPIN,LOW);
}
else if(state_light=="OFF"){
Serial.println("light off");
digitalWrite(LIGHTPIN,HIGH);
}
if(state_fan=="ON"){
Serial.println("fan on");
digitalWrite(FANPIN,LOW);
}
else if(state_fan=="OFF"){
Serial.println("fan off");
digitalWrite(FANPIN,HIGH);
}
if(state_curtain=="ON"){
Serial.println("curtain on");
curtain_state=1;
}
else if(state_curtain=="OFF"){
Serial.println("curtain off");
curtain_state=0;
}
}