我正在使用ArduinoUnoR3+WS5100链接MQTT服务器,代码如下:
// 库加载
#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.3"; // MQTT服务器的IP地址(实际设备IP)
int mqtt_Port = 1883; //端口号
EthernetClient EClient; // WiFi客户端创建
PubSubClient Client(EClient); // 传入客户端对象
// 订阅信息
#define Topic_Publish_0 "testtopic/F" // 发布消息主题
#define Topic_Subscribe_0 "testtopic/T" // 订阅消息的主题
String Send_Data; // 发送数据
String Receive_Data; // 接收数据
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, mqtt_Port); // 设置客户端(链接MQTT服务器的IP,端口号)
// 链接MQTT服务器
while (!Client.connected()) {
Serial.print("尝试MQTT连接…");
if (Client.connect("ESP32-1", "ESP32", "ESP32")) {
// 接收回调函数设置
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内容重组(char->string)
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);
} else {
Serial.print("尝试再次MQTT连接…");
if (Client.connect("ESP32-1", "ESP32", "ESP32")) // 名称,用户名,密码
{
// 接收回调函数设置
Client.setCallback(MQTT_Callback); // 设置回调函数
Client.subscribe(Topic_Subscribe_0); // 设置订阅的主题
Serial.println("已再次链接服务器");
} else {
Serial.print("再次链接错误");
Serial.println(Client.state());
delay(5000);
}
}
delay(100);
}
// 收到消息的中断函数
void MQTT_Callback(char *topic, byte *payload, unsigned int length) {
Serial.print("消息为: [");
Serial.print(topic);
Serial.print("] ");
// 消息重组(char->string)
Receive_Data = ""; // 清空消息池
for (int i = 0; i < length; i++) {
Receive_Data = Receive_Data + (char)payload[i];
}
Serial.println(Receive_Data); // 打印信息内容
}
代码试验后,发现可以连接网络,但是就是无法访问EMQX的服务器,这个地址和端口我测试了,可以连接。是不是WS5100芯片不支持链接MQTT服务器呀
故障报送如下:
返回-2的含义