关于使用Arduino UnoR3+WS5100链接EMQX服务器的问题

我使用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);
}

其中串口监视器的状态为


请问错误在哪里呀?

建议先确保网络直接是连通的,然后按照客户端 SDK 查看对应报错码的意思。

首先网络是Ping通的,您可以在串口反馈的信息中看到Ethernet链接成功,并在接下来打印了被分配的IP地址。说明网络以连接成功,并且我在所连接的路由器那里也可以看到该设备。第二点您能再说明白些吗,没能听懂。

你这里打印了一个 21585,这个应该时 SDK 的错误码吧?
你的网卡获得了 IP 地址,和这个网卡可以连接到 EMQX 是两个不同的事情,建议先检查网络,也可以采用抓包的方式进行分析。

你说的没错21585是SDK的错误码,我估计这个芯片WS5100可能不支持链接EMQ的服务器