arduino代码
完整代码见主页
导入所需要的库
#include <Arduino.h>
#include <WiFi.h>
#include "PubSubClient.h"
#include <ArduinoJson.h>
进行WIFI配置和服务器配置
// WiFi 配置
const char *ssid = ""; // WiFi名称
const char *pwd = ""; // WiFi密码
// MQTT 服务器配置
const char *mqtt_server = ""; // MQTT服务器地址
const char *mqtt_username = ""; // MQTT用户名
const char *mqtt_userpwd = ""; // MQTT密码
const char *mqtt_clientid = ""; // MQTT客户端ID
const char *mqtt_pub_topic = ""; // MQTT发布主题
const char *mqtt_sub_topic = ""; // MQTT订阅主题
创建一个 JSON 文档对象,用于存储和解析数据
DynamicJsonDocument doc(1024);
定义变量
// 设备状态信息
bool power_switch; // 电源开关状态
上报数据包模板
#define REPORT_DATA_TEMPLATE "{\"method\":\"report\",\"clientToken\":\"00000001\",\"params\":{\"power_switch\":%d,}}"
创建对象,定时与缓存区
WiFiClient espClient; // 创建一个 WiFi 客户端对象
PubSubClient mqttclient(espClient); // 创建一个 MQTT 客户端对象
long lastMsg = 0; // 用于定时上报数据
char report_buf[1024]; // 存储上报数据的缓冲区
创建MQTT 消息回调函数,处理接收到的消息
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("--->Message arrived [");
Serial.print(topic);
Serial.print("] ");
Serial.println();
Serial.print("payload [");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
// 处理上位机的控制指令
DeserializationError error = deserializeJson(doc, payload);
// 检查解析是否成功
if (error)
{
Serial.print("deserializeJson() 失败: ");
Serial.println(error.f_str());
return;
}
else
{
if (doc["clientToken"] != "00000001")
{
if (doc["params"]["power_switch"] == 1)
{
Serial.print("开启电源 ");
power_switch = 1;
}
else
{
Serial.print("关闭电源 ");
power_switch = 0;
}
}
}
}
设置 WiFi 连接
void setup_wifi()
{
Serial.printf("连接到 %s ", ssid);
WiFi.begin(ssid, pwd);
while (WiFi.status() != WL_CONNECTED)
{
Serial.printf(".");
delay(500);
}
Serial.println("已连接!");
Serial.print("IP 地址: ");
Serial.println(WiFi.localIP());
}
主函数
void setup()
{
Serial.begin(115200);
setup_wifi();
// 设置 MQTT 客户端参数
mqttclient.setServer(mqtt_server, 1883);
mqttclient.setCallback(callback);
mqttclient.setKeepAlive(65535);
// 连接到 MQTT 服务器
while (!mqttclient.connect(mqtt_clientid, mqtt_username, mqtt_userpwd))
{
Serial.println("mqtt 连接失败,重新连接");
delay(2000);
}
Serial.println("mqtt 连接成功!");
// 订阅主题
boolean ret = mqttclient.subscribe(mqtt_sub_topic);
if (ret != true)
{
Serial.printf("mqtt 订阅主题 [%s] 失败\n", mqtt_sub_topic);
}
Serial.printf("mqtt 订阅主题 [%s] 成功\n", mqtt_sub_topic);
}
void loop()
{
// MQTT 客户端循环
mqttclient.loop();
// 发布主题
long now = millis();
if (now - lastMsg > 10000)
{
lastMsg = now;
// 构造上报数据的 JSON 字符串
memset(report_buf, 0, 1024);
sprintf(report_buf, REPORT_DATA_TEMPLATE, power_switch, power_percent, temperature);
Serial.println(report_buf);
// 发布数据到 MQTT 主题
if (mqttclient.publish(mqtt_pub_topic, report_buf))
{
Serial.printf("mqtt 发布主题 [%s] 成功\n", mqtt_pub_topic);
}
else
{
Serial.printf("mqtt 发布主题 [%s] 失败\n", mqtt_pub_topic);
}
}
}
连接成功
向esp发送讯息
arduino端收到信号
完整代码见主页