Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client

Я хочу использовать публичный брокер HiveMQ в своем проекте, который является тем же брокером, что и в примерах PubSubClient esp8266, но когда я меняю SSID WiFi и пароль в примере и загружаю его, я получаю следующий вывод:

Connecting to <SSID NAME>
........
WiFi connected
IP address: 
192.168.1.14
Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
Attempting MQTT connection...failed, rc=-2 try again in 5 seconds
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...

Я попробовал это с клиентом pubsub v2.8/v2.6/v2.4 и последней версией esp32 и последней версией esp8266 и 2.3

в ответ на комментарий, как я уже сказал, мой код - пример esp8266_basic в примерах клиентов PubSub, и вот мой код:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Обновите их значениями, подходящими для вашей сети.

const char* ssid = "<SSID>";
const char* password = "<PASS>";
const char* mqtt_server = "broker.mqtt-dashboard.com"; //проверено с broker.mqttdashboard.com

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Инициализировать вывод BUILTIN_LED в качестве вывода
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883); //8000 и 1883 протестированы
  client.setCallback(callback);
}

void setup_wifi() {

  delay(10);
  // Мы начинаем с подключения к сети Wi-Fi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Включите светодиод, если 1 был получен в качестве первого символа
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Включите светодиод (обратите внимание, что LOW-это уровень напряжения
    // но на самом деле светодиод горит; это потому, что
    // это acive low на ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Выключите светодиод, сделав напряжение ВЫСОКИМ
  }

}

void reconnect() {
  // Цикл до тех пор, пока мы не будем повторно подключены
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Попытка подключения
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // После подключения опубликуйте объявление...
      client.publish("outTopic", "hello world");
      // ... и отписаться
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Подождите 5 секунд, прежде чем повторить попытку
      delay(5000);
    }
  }
}
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, 75, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }
}

в esp32 я удаляю pinMode(BUILTIN_LED, OUTPUT); // Инициализирую BUILTIN_LED pin в качестве выхода и

  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Включите светодиод (обратите внимание, что LOW-это уровень напряжения
    // но на самом деле светодиод горит; это потому, что
    // это acive low на ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Выключите светодиод, сделав напряжение ВЫСОКИМ
  }

разделы и включает в себя

и иногда вывод выглядит так:

Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...connected
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...failed, rc=-4 try again in 5 seconds
Attempting MQTT connection...connected

, 👍0

Обсуждение

Очевидно, что есть проблема, но помимо этого кто знает? Все, что вы сказали, это то, что это ESP8266, и вы получаете ошибку подключения MQTT. Пожалуйста, добавьте некоторые дополнительные детали., @jwh20

Совершенно не ясно, о чем вы спрашиваете. Делает ли ваш код успешное соединение MQTT, не подключается ли он, иногда подключается или иногда отключается? Работает ли он, когда подключен? Почему вы удалили "pinMode ()" на ESP32? Кстати, почему вы используете устаревший " BUILTIN_LED вместо LED_BUILTIN` ?, @StarCat

@StarCat спасибо за комментарий, об удалении pinMode, я делаю это, потому что мне просто нужно проверить его на MQTT, и BUILTIN_LED делает ошибку компилятора, которая говорит, что это не объявлено, и это о светодиоде и не важно для подключения , и абсолютно плата не подключается к брокеру (несколько раз в моих тестах на другая версия Arduino IDE на более старой системе Я получил сообщение об успешном подключении, но ничего не опубликовал и не подписался), @radinParsaei

rc=-4 означает MQTT_CONNECTION_TIMEOUT, rc=-2 означает MQTT_CONNECT_FAILED, учитывая, что вы обращаетесь к общедоступному сайту веб-службы MQTT, скорее всего, вам нужно будет подключить его с именем пользователя и паролем в дополнение к ClinetID, поэтому вам может потребоваться изменить client.connect("ESP8266Client") to (MqttClient.connect(ClientID,mqttUserName,mqttPass))., @hcheung


2 ответа


1

все в порядке, и проблема в моей сети, я думаю, что там заблокирован MQTT (потому что я не мог подключить никакого брокера, а не только HiveMQ) или другие связанные с этим вещи, потому что также мой ноутбук не подключается, я сменил своего ISP, и проблема исправлена

если вы столкнулись с той же проблемой, проверьте другие вещи и, наконец, проверьте с помощью компьютера в вашей сети (не используйте такие вещи, как http://www.hivemq.com/demos/websocket-client/)

,

2

Я нашел это видео как средство решения проблем, это может вам помочь. Все ошибки MQTT объясняются очень хорошо и предлагают различные методы устранения неполадок https://youtu.be/CbodTTk-D18

,

Большое спасибо за ваш ответ, но, как я уже упоминал, этот вопрос был сделан, потому что я живу в стране с сетевой цензурой. Когда я сменил поставщика услуг связи, все работало нормально. Наконец через неделю первый сетевой провайдер с которым я тестировал исправил эту проблему и теперь все работает, @radinParsaei