使用Arduino访问EMQX的服务器链接不上的问题

我写了一段Arduino程序,但是我链接不上的EMQX服务器,代码如下

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "MI175";             //在此输入WIFI的名称
const char* password = "12345678";      //在此输入WIFI的密码
const char* mqtt_server = "127.0.0.1";  //这个是MQTT服务器的IP地址,以实际为准
#define publish_topic "testtopic/#"     //发布消息主题
#define subscribe_topic "testtopic/1"   //订阅消息的主题

WiFiClient espClient;            //WiFi客户端创建
PubSubClient client(espClient);  //传入客户端对象

String msg;


void setup_wifi() {

  delay(10);
  Serial.println();
  Serial.print("链接至: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);         //WiFi工作在STA模式
  WiFi.begin(ssid, password);  //STA模式初始化

  //判断是否链接上WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi 已连接");
  Serial.println("IP 地址为: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("消息的主题为: [");
  Serial.print(topic);
  Serial.print("] ");
  //逐一打印消息的内容
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("尝试MQTT连接…");

    if (client.connect("ESP32-1")) {
      Serial.println("已链接服务器");
      // 一旦连接上了,就发布一个主题,这个主题是自定义的,您可以在自己的MQTT服务器进行查看
      client.publish(subscribe_topic, "hello world");
      // subscribe是订阅的意思,MQTT通信的核心就是“订阅+发布”
    } else {
      Serial.print("错误");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  setup_wifi();                         //链接WiFi
  client.setServer(mqtt_server, 1883);  //设置客户端(链接MQTT服务器的IP,端口号)
  client.setCallback(callback);         //设置回调函数
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();  //MQTT心跳

  msg = "1234";
  char msg_charArray[msg.length() + 1];              //创建一个中转Char[]
  msg.toCharArray(msg_charArray, msg.length() + 1);  // 将String转换为char[](末尾有\0)

  Serial.print("发布信息:");
  Serial.println(msg_charArray);
  client.publish(publish_topic, msg_charArray);  //发布这个随机数
}

我的配置信息如图:

你的代码的连接部分没看出什么问题。
是不是你的arduino机器上的IP写错了,怎么他连接的是127.0.0.1的1883.
看现象极有可能应该是你arduino到emqx的1883端口不通。

测试时不用要dashboard上的websocket 来测,推荐下载一个MQTTX 来做原生的mqtt连接,连到1883端口。

代码的其它部分也可以优化一下:

  1. setup() 函数中,您没有调用 client.subscribe() 函数来订阅主题 subscribe_topic

  2. loop() 函数中,您在调用 client.publish() 函数之前没有检查 client.connected() 是否为 true。

  3. 您在 msg_charArray 中没有为字符串结尾的空字符预留空间。这会导致 client.publish() 函数在字符串结尾处写入内存,从而导致程序崩溃。

你电脑上的模拟开发环境跑的时候可以这样写,因为你的EMQX可能就装在那台电脑上。但实际上Arduino板的时候,ip得改成安装emqx的服务器ip