我使用Arduino IDE配合Arduino UnoR3+WS5100链接EMQX服务器,链接不上EMQX的服务器。代码如下
// 库加载
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h> //MQTT库
#include <ArduinoJson.h> //JOSN库
// 服务器基本信息
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; // Ethernet模块的MAC地址
const char *mqtt_server = "192.168.31.203"; // MQTT服务器的IP地址(实际设备IP,如笔记本)
EthernetClient EClient; // WiFi客户端创建
PubSubClient Client(EClient); // 传入客户端对象
// 订阅信息
#define Topic_Publish_0 "testtopic/0" // 发布消息主题
#define Topic_Subscribe_0 "testtopic/1" // 订阅消息的主题
String Send_Data; // 发送数据
String Receive_Data; // 接收数据
// JOSN解析
int Receive_DOC_Int;
float Receive_DOC_Float;
const char *Receive_DOC_Char;
int Receive_Data_0;
int Receive_Data_1;
void MQTT_Callback(char *topic, byte *payload, unsigned int length);
void setup() {
// 初始化串口
Serial.begin(115200);
// 初始化Ethernet模块
Ethernet.init(10); // SPI(CS)选择
Serial.print("尝试Ethernet连接");
while (Ethernet.begin(mac) == 0) // Ethernet初始化(MAC),IP自动获取
{
Serial.print(".");
delay(500);
}
Serial.println(".");
delay(500);
Serial.print("链接Ethernet成功,本机的IP地址为:");
Serial.println(Ethernet.localIP()); // 本机IP地址
// MQTT服务器设置
Client.setServer(mqtt_server, 1883); // 设置客户端(链接MQTT服务器的IP,端口号)
// 链接MQTT服务器
while (!Client.connected()) {
Serial.print("尝试MQTT连接…");
if (Client.connect("ESP32-1")) {
// 接收回调函数设置
Client.setCallback(MQTT_Callback); // 设置回调函数
Client.subscribe(Topic_Subscribe_0); // 设置订阅的主题
Serial.println("已链接服务器");
} else {
Serial.print("错误");
Serial.println(Client.state());
delay(5000);
}
}
delay(1000);
Serial.println("MQTT初始化完成");
}
void loop() {
Client.loop(); // MQTT心跳
// 信息准备
Send_Data = ""; // 消息清空
DynamicJsonDocument DOC_Seed(102400); // JOSN内存大小
// jOSN内容准备1
DOC_Seed["DOC_Int"] = 32;
DOC_Seed["DOC_Float"] = (float)analogRead(37) / 5;
DOC_Seed["DOC_Char"] = "@";
DOC_Seed["data"][0] = analogRead(38);
DOC_Seed["data"][1] = analogRead(39);
serializeJson(DOC_Seed, Send_Data); // 序列化
// jOSN内容准备1
char Send_CharArray[Send_Data.length() + 3]; // 创建一个中转Char[],预留3
Send_Data.toCharArray(Send_CharArray, Send_Data.length() + 1); // 将String转换为char[](末尾有\0)
// 信息发布
if (Client.connected()) // 连接性检测
{
Client.publish(Topic_Publish_0, Send_CharArray); // 在订阅的主题发布消息
Serial.print("发布信息:");
Serial.println(Send_CharArray);
}
delay(1000);
}
// 收到消息的中断函数
void MQTT_Callback(char *topic, byte *payload, unsigned int length) {
Serial.print("消息为: [");
Serial.print(topic);
Serial.print("] ");
// 消息重组
Receive_Data = ""; // 清空消息池
for (int i = 0; i < length; i++) {
Receive_Data = Receive_Data + (char)payload[i];
}
Serial.println(Receive_Data); // 打印信息内容
DynamicJsonDocument DOC_Receive(102400); // 声明一个JsonDocument对象
deserializeJson(DOC_Receive, Receive_Data); // 反序列化
Receive_DOC_Int = DOC_Receive["DOC_Int"];
Receive_DOC_Float = DOC_Receive["DOC_Float"];
Receive_DOC_Char = DOC_Receive["DOC_Char"];
Receive_Data_0 = DOC_Receive["data"][0];
Receive_Data_1 = DOC_Receive["data"][1];
Serial.print("解析消息为:DOC_Int=");
Serial.print(Receive_DOC_Int);
Serial.print(";DOC_Float=");
Serial.print(Receive_DOC_Float);
Serial.print(";DOC_Char=");
Serial.print(Receive_DOC_Char);
Serial.print(";Data_0=");
Serial.print(Receive_Data_0);
Serial.print(";Data_1=");
Serial.println(Receive_Data_1);
}
其中串口监视器的状态为
请问错误在哪里呀?