Skip to content

MQTT 控制命令解析

本节介绍在 arduino 中如何进行 MQTT 数据的解析,具体包含以下步骤:WIFI 的连接MQTT 服务器的连接主题的订阅和 JSON 格式数据解析

介绍在ARDUINO中编程实现的关键步骤:需要安装一些相应的库,可以参照之前的文档

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 服务器,文章链接如下:

EMQX 安装配置

我们已经搭建好了一台 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;
  }

}

powered by 天人之际工作室