Go Down

Topic: Adafruit MQTT: dopo un po' non si connette più (Read 91 times) previous topic - next topic

massimodileo

Apr 18, 2019, 09:58 am Last Edit: Apr 18, 2019, 10:05 am by massimodileo
Ho un problema con MQTT. Sto usando Adafruit IO ed un ESP8266 (ma il problema è software non HW)
Apparentemente tutto funziona perfettamente per alcuni minuti dal boot. Lo scambio (bilaterale) funziona.
Dopo un po' però l'ESP8266 apparentemente non si connette più al server MQTT per ricevere comandi.
Tutto il resto sembra funzionare (anche il WebServer che riceve comandi via HTML). L'unica cosa è farlo ripartire.

Purtroppo il codice intero è troppo lungo per essere postato qui di seguito, provo a mettere le parti rilevanti:

Il codice è questo:

Code: [Select]

/*------ codice MQTT inizio ----*/
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME  "..."
#define AIO_KEY       "..."
bool MQTTSERVER = false;
String MQTTModo;
WiFiClient client;
#include "adafruitMQTT.h";
/*------ codice MQTT fine ------*/


/*----- inizio MQTT stuff ------*/
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish MQTTcontrolli = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/controlli");
Adafruit_MQTT_Subscribe MQTTcommand = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/main");
void MQTT_connect();


// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.


void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  } else  {
    Serial.print("Connecting to MQTT... ");
    uint8_t retries = 3;
    while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
         Serial.println(mqtt.connectErrorString(ret));
         Serial.println("Retrying MQTT connection in 5 seconds...");
         mqtt.disconnect();
         delay(5000);  // wait 5 seconds
         retries--;
         if (retries == 0) {
          MQTTSERVER = false;
          Serial.print("Non si connette");
           // basically die and wait for WDT to reset me
           return;
         }
    }
    Serial.println("MQTT Connected!");
  }
 MQTTcontrolli.publish("connesso");
}
/*----- fine MQTT stuff ------*/



void handlerMQTT()
{
    MQTT_connect();
    EVERY_N_MILLISECONDS(200) {
      Adafruit_MQTT_Subscribe *subscription;
      while ((subscription = mqtt.readSubscription(5))) {
        MQTTcontrolli.publish("in ascolto...");
        if (subscription == &MQTTcommand) {
          unsigned long currentMillis = millis();
          MQTTModo = (char *)MQTTcommand.lastread;
          MQTTModo.toLowerCase();
          Serial.print(F("MQTTmodo Got: "));
          Serial.println((char *)MQTTcommand.lastread);
          if ((MQTTModo == "comando") || (MQTTModo == "command")) {
            Serial.print("comando ricevuto");
            comando1();
            }
          MQTTcontrolli.publish("MQTT ricevuto!");
        }         
      }
    }
}

//SETUP
void setup() {

[...]
 WiFi.mode(WIFI_STA);
    Serial.printf("Connecting to %s\n", ssid);
    if (String(WiFi.SSID()) != String(ssid)) {
      WiFi.begin(ssid, password);
    }   
    /*----- inizio MQTT stuff ----*/
       mqtt.subscribe(&MQTTcommand);
    /*----- fine MQTT stuff ------*/
[...]

}

//LOOP
void loop() {

[...]

   //----- MQTT STUFF ------
   handlerMQTT();
   //----- MQTT STUFF ------

[...]

}



L'unica "stranezza" è che ho dovuto aggiungere quell WifiClient.client a questa riga:
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

La connessione al server avviene tramite: #include <ESP8266WiFi.h>

Il funzionamento è assolutamente normale per diversi minuti, ad un certo punto (senza una ragione apparente o un errore di qualche tipo) l'ESP semplicemente non si connette più al server MQTT.

Non so bene neanche come procedere con il troubleshooting...

Help!!


Go Up