MQTT с Arduino ESP8266, не может опубликовать брокеру после нескольких публикаций

Я пытаюсь реализовать MQTT с Arduino и ESP8266. Предполагается, что настройка будет опубликована брокеру, переведена в спящий режим на некоторый промежуток времени, а затем сброшена сама по себе, чтобы цикл продолжился.

Эскиз:

#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <WiFiEspUdp.h>
#include "SoftwareSerial.h"
#include <PubSubClient.h>
#include "LowPower.h"

IPAddress server(10, 8, 17, 14);
char ssid[] = "myssid";       
char pass[] = "pass";           
int status = WL_IDLE_STATUS;   

WiFiEspClient espClient;
PubSubClient client(espClient);
SoftwareSerial soft(2,3); 

void setup() {
  Serial.begin(9600);
  soft.begin(9600);
  WiFi.init(&soft);
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);
  }
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
  }
  Serial.println("You're connected to the network");
  client.setServer(server, 1883);
}

void(* resetFunc)(void)=0;

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  Serial.println("going to sleep");
  delay(500);
  for(int i=0;i<8;i++)
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
  delay(500);
  Serial.println("resetting");
  delay(500);
  resetFunc();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("arduinoClient")) {
      Serial.println("connected");
      client.publish("IITMandi","testing mqtt powersaver...");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

После нескольких публикаций (наибольшее количество последовательных публикаций, которые я видел, составляет около 20), он не может публиковать больше. Nano не нагревается, но ESP нагревается.

Кто-нибудь может сказать мне, в чем может быть причина?

снимок экрана монитора последовательного порта


person Pratik Kumar    schedule 04.07.2017    source источник
comment
возможно, ваш сервер mqtt не отказывается от ваших старых подключений достаточно быстро   -  person dandavis    schedule 04.07.2017
comment
Можете ли вы отследить строку failed, rc = -2 в коде библиотеки и выяснить, что это за код возврата ошибки?   -  person Maximilian Gerhardt    schedule 04.07.2017
comment
поскольку код ошибки говорит об ошибке при подключении к брокеру, вам также следует просмотреть журнал брокера. Я тоже подозреваю что-то вроде @dandavis   -  person BMelis    schedule 04.07.2017
comment
для расширения: если вы сбрасываете быстрее, чем ваша жизнь, вы увеличиваете количество подключений. отправьте mqtt на короткий срок службы при подключении   -  person dandavis    schedule 04.07.2017
comment
@MaximilianGerhardt, rc = -2 означает, что не удалось установить соединение с брокером.   -  person Pratik Kumar    schedule 05.07.2017
comment
@dandavis, мне следует уменьшить время активности или начать постоянный сеанс?   -  person Pratik Kumar    schedule 05.07.2017
comment
Лучше правильно отключиться перед сном и настроить сеанс на сохранение.   -  person BMelis    schedule 05.07.2017
comment
@BMelis, я заменил resetFunc() внутри основного цикла на client.loop(), тестировал около 8 часов, вроде работает нормально.   -  person Pratik Kumar    schedule 05.07.2017
comment
@BMelis, требуется ли постоянное соединение для публикации данных? Постоянный сеанс должен быть там для подписчиков, которые хотят, чтобы их сообщения помещались в очередь в брокере, когда они находятся в автономном режиме, и доставлялись им при восстановлении соединения.   -  person Pratik Kumar    schedule 06.07.2017


Ответы (1)


Я борюсь с ESP8266 около недели, так что мне кажется, что я знаю, в чем ваша проблема. Ваш ESP8266, вероятно, поджарен, вы не виноваты. Причиной неисправности, скорее всего, является внутренний диод, который вышел из строя, что привело к текущим проблемам на вашем устройстве. В зависимости от производителя, диод не имеет должных номиналов и замыкается после небольшого периода использования. Если это был более мгновенный сбой, то, возможно, ваш модуль не может обрабатывать DIO 5 В от Arduino. Удачи с этой штукой. Это может быть довольно привередливо.

person Isaiah    schedule 27.06.2018