单片机和WS5100链接服务器,联网成功但无法访问MQTT服务器

我正在使用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的含义

先打开 emqx 的 debug 日志,然后再连接,看看有没有消息到 emqx。及断开的原因是什么。

如何打开emqx的DeBug日志?

您好,我无法打开debug数据,因为在客户端无法找到这台设备


其次同样的测试环境,今天他报故障-1

可以看一下我们的额 Arduino 教程:https://www.youtube.com/watch?v=S334qTpjPR4&t=2s

我看了这个教程,但是他的实现方式和我不一样,他是基于UNOR4的ESP32S3的wifi,这个我也能实现,但是现场需求是通过网线实现,所以我用了WS5100,但是从去年11月至今暂未成功。

日志的使用方式在这儿:https://www.emqx.io/docs/zh/latest/observability/log.html#日志

这里还有一些常见问题的调查方法:常见问题汇总

EMQX 相关的知识还是需要花时间了解一下,不然没有办法定位问题,只看客户端没办法知道系统的其他部分发生了什么。可能也就花几个小时或半天学习就够了。