SIM5320 MQTT TCP-Verbindung wird nach einiger Zeit unerwartet geschlossen

7

Ich habe mit dem SIM5320 an einem MQTT-Protokoll gearbeitet. Ich bin mit der AT-Befehlsdokumentation vertraut und habe eine funktionierende Implementierung mit einem Arduino.

Zuerst öffne ich einen Netzwerk-Socket mit AT + NETOPEN, dann öffne ich eine TCP-Verbindung mit AT + CIPOPEN = 0, "TCP", "IP-Adresse", Port. Ich übertrage dann Daten für das MQTT-Protokoll mit AT + CIPSEND, das erfolgreich ausgeführt wird. Wenn ich Daten über MQTT an das SIM-Modul sende, werden diese ebenfalls empfangen und die Nachricht erkannt.

Bei MQTT gibt es ein Keep-Alive-Intervall, das angibt, wie lange der Server eine Verbindung zwischen der Kommunikation offen hält, im Grunde genommen, wie lange der Client inaktiv sein kann, bevor er zwangsweise vom Server getrennt wird. Ich habe diesen Wert jedoch auf maximal 18 Stunden eingestellt, was weitaus länger ist als die ~ 15-minütigen Unterbrechungen.

Mein Problem tritt nach ca. 15 Minuten auf, wenn ich versuche, einen Befehl an den Server zu senden, und keine Antwort erfolgt. Die SIM-Karte hat kein "+ IPCLOSE: 0,4" ausgegeben, das normalerweise auftritt, wenn der Server den Client oder eine andere Art von Anzeige zwangsweise vom Computer trennt.

Außerdem kann ich weiterhin Daten senden und es scheint, dass die CIP-Verbindung noch offen ist, wie durch "AT + CIPOPEN?" Angezeigt. Wenn ich versuche, die Verbindung mit "AT + CIPCLOSE = 0" zu schließen, erhalte ich "+ CIPCLOSE: 0,4" und "ERROR". In der Dokumentation wird nicht erwähnt, was "+ CIPCLOSE: 0,4" bedeutet. Die Verbindung scheint jedoch nicht geschlossen zu werden, da sie nicht geöffnet oder verwendet werden kann.

Ich würde wirklich gerne wissen, was in diesen 15 Minuten zwischen dem Herstellen einer Verbindung und dem Senden von Daten und dem erneuten Senden von Daten passiert. Es gibt keine Warnung oder Anzeichen dafür, dass etwas schief geht, daher bin ich ernsthaft verwirrt.

Ich habe diese Frage zunächst beim Austausch von Elektrotechnik-Stapeln gestellt, aber es wurde empfohlen, sie auch hier zu stellen.

Ich habe den Code, den ich hier geschrieben habe, für alle angehängt , die einen Blick darauf werfen möchten, und es gibt keine Bibliotheken, die Sie zum Ausführen benötigen.

Boris Deletic
quelle
2
Betrachtet man MQTT Keep Alive Interval Explained Es scheint, dass die wahrscheinlichste Ursache darin besteht, dass die Transportverbindung irgendwann innerhalb des Kommunikationsstapels unterbrochen wird. Das Senden von Daten sollte die MQTT-Kommunikation aufrechterhalten und der Broker sollte Pings zurücksenden, wenn er nichts anderes sendet. Könnte das Modem also in den Ruhezustand gehen, wenn keine Aktivität stattfindet? Eine Frage wäre, ob Sie alle 10 Minuten eine Ping-Nachricht senden könnten, wenn kein anderer Verkehr vorhanden ist, und wie dies geschieht.
Richard Chambers
1
Wenn ich eine Ping-Anfrage sende, bevor die Verbindung unterbrochen wird, bleibt die Verbindung aktiv. Das Senden von Ping-Anfragen alle 10 Minuten ist jedoch problematischer als das Senden alle 18 Stunden. Wenn möglich, möchte ich nur stündlich oder so Anfragen senden.
Boris Deletic
2
Welche Sprach- und MQTT-Bibliotheken verwenden Sie für Ihren Client? Bitte aktualisieren Sie Ihre gestellte Frage mit diesen Informationen.
Richard Chambers
1
Das OP verwendet ein 3G-Modul, das TCP / IP-Pakete basierend auf AT-Befehlen sendet, die über eine UART-Verbindung an das Modul gesendet werden. Hier ist überhaupt kein Linux beteiligt. Das OP schreibt im Grunde seinen eigenen MQTT-Client.
Hardillb
1
@hardillb ok das klärt die dinge ein bisschen. Wenn das OP also seinen eigenen MQTT-Client von Grund auf neu schreibt, sollte die Arbeit anscheinend der MQTT-Spezifikation folgen, die die erforderlichen MQTT-Keep-Alive-Pings enthält.
Richard Chambers

Antworten:

7

Das Standard-TCP / IP-Zeitlimit beträgt 15 Minuten. Sie müssen innerhalb dieses Intervalls etwas senden, um die zugrunde liegende TCP-Verbindung aufrechtzuerhalten, auch wenn es sich nur um ein Synchronisierungs- / Bestätigungspaar handelt.

Das MQTT-Keepalive hängt davon ab, wann die Last Will- und Testement-Nachrichten ausgelöst werden sollen.

hardillb
quelle
1
Das MQTT-Keepalive hängt davon ab, wann entschieden werden soll, eine möglicherweise tote Verbindung oder eine Live-Verbindung zu einem toten Agenten (Client oder Broker) zu schließen. Dies wiederum löst den letzten Willen und das Testament aus. Keepalive bedeutet nicht, den letzten Willen und das Testament auszulösen, sondern zu entscheiden, ob eine Verbindung tot ist, sie zu schließen und die Verbindung zu schließen, um den letzten Willen und das Testament auszulösen.
Richard Chambers
1
Können Sie weitere Details zum TCP / IP-Zeitlimit angeben, auf das Sie sich beziehen? Ich gehe davon aus, dass Sie über das unbestätigte Übertragungszeitlimit sprechen, das für die gestellte Frage nicht zu gelten scheint, aber nicht sicher ist. Und laut man7.org/linux/man-pages/man7/tcp.7.html gibt es tcp_keepalive_time()einen Standardwert von 7200 Sekunden, nach dem Keep Alives gesendet werden, wenn die SO_KEEPALIVESocket-Option gesetzt ist. Andernfalls wird die Verbindung beendet.
Richard Chambers
1
Dies scheint die Ursache des Problems zu sein. Können Sie bitte ein Zitat hinzufügen und eine mögliche Methode vorschlagen, um dieses Intervall für das SIM5320 zu verlängern?
Boris Deletic
Bei unserem MQTT-Setup sehen wir etwas sehr Ähnliches - TCP scheint die Verbindung zu trennen, aber der MQTT-Client / Broker weiß es nicht. Wenn wir nach ~ 30 Minuten Inaktivität veröffentlichen, wird kein PUBACK vom Broker empfangen, aber für den Broker ist auch keine Trennung aufgetreten.
Steve Magness