MQTT 传感器信息上报
本节介绍在 arduino 中如何进行 MQTT 服务器的连接,具体包含以下步骤:WIFI 的连接、MQTT 服务器的连接、主题的订阅和发布。
介绍在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 主题的发布
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());