ESP8266 - Exception Handling

Hallo zusammen,

ich möchte den ESP8266 als MQTT Client benutzen, der auch mit schwierigen Netzwerksituationen zurecht kommt. Dazu benutze ich den Async MQTT Client von hier https://github.com/marvinroger/async-mqtt-client . Ich benutze den Sketch weiter unten und unter guten Netzwerkbedingungen funktioniert der auch einwandfrei. Jetzt möchte ich aber, dass der Sketch auch in schlechten Netzwerkbedingungen funktioniert. Dementsprechend stelle ich beim Broker einen Packet Loss ein um schlechte Netzwerkbedingungen zu simulieren. Dann erhalte ich manchmal aber die Exception weiter unten, wenn der ESP8266 probiert sich mit dem Broker zu verbinden. Ich habe die Exception mal gekürzt, dass sie besser lesbar ist und hoffe habe die wichtigen Infos nicht abgeschnitten.

Die Exception tritt nicht bei jedem Verbindungsaufbau mit dem Broker auf, ich würde es aber dennoch gerne generell vermeiden wollen, dass der ESP8266 dadurch crasht. Daher hoffe ich, jemand kann mir hier weiter helfen. (Ich bin mir sicher, dass ich mit TLS alles richtig eingerichtet habe, da er bei keinem packet loss ja richtig arbeit. Ich hab auch probiert herauszufinden, wie man ESP8266 Exceptions mit try/catch abfangen könnte, aber keine wirklich Antwort gefunden, außer, dass es wohl default mäßig nicht vorgesehen ist).

Schon mal vielen Dank an alle Antwortenden :slight_smile:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>

#define WIFI_SSID "xxxxxx"
#define WIFI_PASSWORD "xxxxxxxxx"

#define MQTT_HOST IPAddress(xxx, xxx, x, xxx)

#if ASYNC_TCP_SSL_ENABLED
#define MQTT_SECURE true
#define MQTT_SERVER_FINGERPRINT {0x7e, 0x36, 0x22, 0x01, 0xf9, 0x7e, 0x99, 0x2f, 0xc5, 0xdb, 0x3d, 0xbe, 0xac, 0x48, 0x67, 0x5b, 0x5d, 0x47, 0x94, 0xd2}

#define MQTT_PORT 1883
#else
#define MQTT_PORT 1883
#endif

AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;


void connectToWifi() {
  Serial.println("Try Connecting to WiFi ...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  unsigned long startLoop = millis();
  while( ( 2000 > millis()-startLoop)  &&  (WiFi.status() != WL_CONNECTED) ){
    delay(200);
    Serial.print(".");
  }

}

unsigned long lastMQTTConnectionTry = 0;

void connectToMqtt() {
  Serial.println("Check if ready to Connect to MQTT");
  if(millis()-lastMQTTConnectionTry > 2000 ){
    Serial.println("Try Connecting with MQTT");
    lastMQTTConnectionTry = millis();
    mqttClient.connect();
  }
  else{
    mqttReconnectTimer.once(2, connectToMqtt);
  }
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi.");
  connectToMqtt();
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi.");
  mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
  wifiReconnectTimer.once(2, connectToWifi);
}

void onMqttConnect(bool sessionPresent) {
  Serial.println("Connected to MQTT.");
  Serial.print("Session present: ");
  Serial.println(sessionPresent);
  uint16_t packetIdSub = mqttClient.subscribe("test/lol", 2);
  Serial.print("Subscribing at QoS 2, packetId: ");
  Serial.println(packetIdSub);
  mqttClient.publish("test/lol", 0, true, "test 1");
  Serial.println("Publishing at QoS 0");
  uint16_t packetIdPub1 = mqttClient.publish("test/lol", 1, true, "test 2");
  Serial.print("Publishing at QoS 1, packetId: ");
  Serial.println(packetIdPub1);
  uint16_t packetIdPub2 = mqttClient.publish("test/lol", 2, true, "test 3");
  Serial.print("Publishing at QoS 2, packetId: ");
  Serial.println(packetIdPub2);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Disconnected from MQTT.");

  if (reason == AsyncMqttClientDisconnectReason::TLS_BAD_FINGERPRINT) {
    Serial.println("Bad server fingerprint.");
  }

  if (WiFi.isConnected()) {
    mqttReconnectTimer.once(2, connectToMqtt);
  }
}

void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
  Serial.println("Subscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
  Serial.print("  qos: ");
  Serial.println(qos);
}

void onMqttUnsubscribe(uint16_t packetId) {
  Serial.println("Unsubscribe acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
  Serial.println("Publish received.");
  Serial.print("  topic: ");
  Serial.println(topic);
  Serial.print("  qos: ");
  Serial.println(properties.qos);
  Serial.print("  dup: ");
  Serial.println(properties.dup);
  Serial.print("  retain: ");
  Serial.println(properties.retain);
  Serial.print("  len: ");
  Serial.println(len);
  Serial.print("  index: ");
  Serial.println(index);
  Serial.print("  total: ");
  Serial.println(total);
}

void onMqttPublish(uint16_t packetId) {
  Serial.println("Publish acknowledged.");
  Serial.print("  packetId: ");
  Serial.println(packetId);
}

unsigned long startSetup = 0;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();

  Serial.println("Start Set Up");

  startSetup = millis();

  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
  wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);

  mqttClient.onConnect(onMqttConnect);
  mqttClient.onDisconnect(onMqttDisconnect);
  mqttClient.onSubscribe(onMqttSubscribe);
  mqttClient.onUnsubscribe(onMqttUnsubscribe);
  mqttClient.onMessage(onMqttMessage);
  mqttClient.onPublish(onMqttPublish);
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);
#if ASYNC_TCP_SSL_ENABLED
  mqttClient.setSecure(MQTT_SECURE);
  if (MQTT_SECURE) {
    mqttClient.addServerFingerprint((const uint8_t[])MQTT_SERVER_FINGERPRINT);
  }
#endif

  connectToWifi();
}



void loop() {
  if( millis() - startSetup > 20000 ){
    
    ESP.deepSleep(500000);
  }
}
Exception (3):

....

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

Installiere Dir mal den ESP-Exception-Decoder.

Gruß Tommy

außer, dass es wohl default mäßig nicht vorgesehen ist).

Gegen willkürliche Behauptungen gibt es kein Gegenmittel.

Ich habe die Exception mal gekürzt, dass sie besser lesbar ist und hoffe habe die wichtigen Infos nicht abgeschnitten.

Interessante Sicht auf die Dinge!

Du solltest statt ignorieren/ausblenden vielleicht mal den ESP Exception Decoder anwerfen.