Verlust sensibler Daten beim Versuch, sie über GSM zu senden

Ich arbeite an einem System, das Daten von einer Reihe von Ultraschallsensoren sammelt. Diese Sensoren arbeiten mit einer Frequenz von 40 Hz, und alle Daten, die sie senden, sind für mich wertvoll. Ich muss diese Daten mithilfe des mqtt-Protokolls an einen mqtt-Broker senden. Ich verwende die TCP/UDP-Verbindung von SIM900, um Daten zu senden. Es gibt zwei Szenarien, um mein System zum Laufen zu bringen:

1- Ich sende die Daten, sobald ich sie von Sensoren lese. Es bedeutet, dass ich mich in weniger als 1/40 Sekunden mit einem Server verbinden, Daten senden und trennen sollte. Ich weiß es nicht, aber mit AT-Befehlen mit SIM900; es scheint mir ziemlich unmöglich.

2- Ich sammle die Daten für eine Weile (sagen wir für eine Minute), dann sende ich die Daten als Bulk an den Server. Aber da tritt ein anderes Problem auf: Ich bin mit dem Verlust sensibler Daten konfrontiert, die ich vom Sensor sammle, während ich eine TCP/UDP-Verbindung herstelle.

Meine Hardware besteht aus SIM900, einem Arduino und einer Reihe von Ultraschallsensoren, die mit 40 Hz arbeiten (HR-SC04)

Gibt es eine Möglichkeit, alle Daten, die ich von Sensoren lese, zu speichern und sie verlustfrei an den Mqtt-Server zu senden?

Es gibt verschiedene Handshake-Methoden und -Protokolle, die bei richtiger Implementierung sicherstellen, dass Sie keine Daten verlieren. Das klingt eher nach einem Fehler in Ihrer Firmware.
Das hört sich so an, als ob Sie eine Single-Threaded-Programmstruktur ohne Interrupts verwenden und Ihre TCP/UDP-Software Blockierungsverzögerungen aufweist? In diesem Fall ist das keine geeignete Programmstruktur. Verwenden Sie separate Threads oder Interrupts oder sogar separate Controller.
@WoutervanOoijen Ich wusste nicht, dass ich separate Threads in Arduino verwenden könnte. Das werde ich auf jeden Fall nachschauen.
Warum die knappe Abstimmung? M2M (Machine to Machine) GSM ist definitiv ein Embedded-Thema.
Hallo @EkremDoğan, wie nutzt man die TCP/UDP-Verbindung von SIM900 zum Senden von Daten an einen MQTT-Broker? Gibt es einen Code, den Sie teilen können?
@NK2020 sicher! Was ist Ihre E-Mail-Adresse?

Antworten (1)

Es gibt wahrscheinlich eine Möglichkeit, dies mit "kooperativem Multitasking" zu tun - einer Hauptschleife, die nicht blockierende Funktionen aufruft (möglicherweise unter Verwendung von Zustandsmaschinen). Blink Without Delay zeigt erste Schritte in diese Richtung.

Leider wurde viel Code mit Blockierungsfunktionen geschrieben, also anstatt diesen Code so umzuschreiben, dass er nicht blockierend ist, oft Leute:

  • Erledigen Sie die zeitkritischsten Dinge in einer Interrupt-Routine (der "Vordergrundaufgabe").
  • Behandeln Sie die weniger zeitkritischen Dinge in der Hauptschleife () (die "Hintergrundaufgabe").

Oft hat der Code 2 separate Puffer, damit er doppelt puffern kann : Der Writer-Prozess füllt langsam einen Puffer. Wenn er voll ist, verarbeitet der Leseprozess die Daten in diesem Puffer – währenddessen füllt der Schreibprozess langsam den anderen Puffer. Hoffentlich wird der Lesevorgang mit diesem Puffer abgeschlossen sein, lange bevor der andere Puffer vollständig voll ist, obwohl wir erwarten, dass der Schreiber etwas in diesen anderen Puffer schreibt, bevor der Lesevorgang abgeschlossen ist. In Ihrem Fall kann der Prozessor gelegentlich unterbrochen werden, während Sie die TCP-Verbindung herstellen und die Daten in einem Puffer senden, damit die Interrupt-Routine dem anderen Puffer ein weiteres Datenelement hinzufügt.