Skip to content

MQTT 传感器信息上报

本节介绍在 arduino 中如何进行 MQTT 服务器的连接,具体包含以下步骤:WIFI 的连接MQTT 服务器的连接主题的订阅和发布

介绍在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 主题的发布

MQTT 消息是用JSON 数据格式进行通信的,所以在主题中发布新的消息前,需要先对信息用JSON 格式进行组合。

引入头文件:

c
#include <ArduinoJson.h>

定义变量,用于存储 JSON 格式的结果:

c
  StaticJsonBuffer<256> jsonBuffer;
  JsonObject& data = jsonBuffer.createObject();

列写 JSON 格式中的数据:类似于数组,如果需要添加新的传感器信息,在后面类似添加即可

c
data["TEMPERATURE"] = String(27.6,1);//℃
data["HUMIDITY"] = String(27.6,1);//℃
data["LIGHT_INTENSITY"] = String(27.6,1);//℃
data["SMOKE"] = String(27.6,1);//℃

将 JSON 格式的结果转换为 string 类型:

c
char payload[256];
data.printTo(payload, sizeof(payload));
String strPayload = String(payload);

在对应的主题中发布消息,注意要转换为 char*

c
client.publish(topic_publish, public_messages().c_str());

powered by 天人之际工作室