Заведомо нестабильный ESP8266 MQTT-клиент

Я делаю проект, в котором ESP8266 получает данные от Arduino Uno и публикует их через MQTT. Через случайное время он перестанет отправлять данные моему MQTT-брокеру. Это может быть час, это может быть день или два.

Он настроен на отправку данных каждую секунду, и я сделал отладочный вывод, сообщающий мне также о качестве сигнала WiFi. Похоже, это не то.

Я пытался сделать проверки, которые будут повторно подключаться к MQTT, если он потеряет соединение, и сбросить себя, если он потеряет соединение WiFi. У меня нет идей прямо сейчас, любая помощь приветствуется!

Вот моя функция повторного подключения MQTT

void reconnect() {
  // Цикл, пока мы снова не подключимся
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Создаем случайный идентификатор клиента
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Попытка подключения
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // После подключения публикуем объявление...
      client.publish("pressure/debug", "ESP8266: reconnected!");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Подождите 5 секунд перед повторной попыткой
      delay(5000);
    }
  }
}

и вот где он проверяет наличие Wi-Fi

void checkWifiConnection() {
  if (WiFi.status() != WL_CONNECTED)
  {
    int countdown = millis() + 15000;
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      if (countdown > millis()) {
      delay(500);
      Serial.println("Connecting to WiFi..");
      } else {
        Serial.println("Timed out! Restarting...");
        ESP.reset();
      }
  }
  }
}

Оба выполняются в каждом цикле.

Arduino отправляет данные, как и предполагалось, и я снизил скорость соединения до 19200 бит/с, чтобы обеспечить более стабильное соединение, используя SoftwareSerial. Есть ли еще вещи, которые я мог бы контролировать? Я попробовал это с двумя разными платами ESP8266MOD/"ESP07" с тем же результатом.

Вот результат отладки:

09:13:05.039 -> unpub data 0/ AP:Akvasafe/ RSSI:-69 dB / Vcc:3519mV / free heap:49440 / fragmentation:1%

, 👍1

Обсуждение

используйте ядро arduino esp8266 2.4.2, @Juraj

Пробовали ли вы более стабильную библиотеку MQTT? Вы не сказали, какой из них вы используете сейчас., @Jaromanda X

@Juraj Я использую 2.5.0, разве это не рекомендуется?, @Vincent Vega

@JaromandaX Я использую PubSubClient, мне показалось, что он самый популярный., @Vincent Vega

2.5.0 имеет много проблем, @Juraj

Популярный не значит стабильный :p но этот, когда я его использовал, был в порядке, @Jaromanda X


1 ответ


1

Я использую библиотеку adafruit mqtt. После нескольких исправлений он работает очень стабильно.

Советы:

1) Убедитесь, что вы добавили строку подписки ДО подключения к mqtt (вы можете добавить ее в настройки и подключиться к mqtt в цикле)

Нравится:

Настройка: mqtt.subscribe(&motor);

Цикл: MQTT_connect();

Да, вы можете публиковать и подписываться одновременно.

2) В ЛИНИИ: Adafruit_MQTT_Client(сервер,порт,пользователь,пароль)

ИЗМЕНИТЬ ЭТО: Adafruit_MQTT(сервер,порт,clientid,пользователь,пароль)

Используйте это с идентификатором клиента (ДОЛЖЕН БЫТЬ УНИКАЛЬНЫМ (например, разным для всех клиентов)) или ваш клиент будет отключен при подключении другого клиента с таким же идентификатором.

3) Преобразовать value.lastread из char* в int : int val = atoi((char *)sensor.lastread);

Подробнее о ESP8266 и amp; ESP32: http://github.com/ajaybnl

,