Ein paar Gedanken zu meinen Erfahrungen mit TCP, UDP und MQTT sowie einige zusätzliche Ressourcen, die überprüft werden müssen.
Mit UDP bin ich auf das Problem des stillen Fehlers gestoßen, bei dem eine Anwendung auf einem Netzwerkknoten, dem Client, nur einige der gesendeten UDP-Nachrichten sieht. Es gibt zu viele Gründe, warum der Netzwerkverkehr schief gehen kann. Das Problem mit UDP besteht darin, dass Pakete so gut wie immer verworfen werden können, wenn einer der Knoten im Netzwerkpfad zwischen dem Hersteller von Paketen und dem Verbraucher von Paketen dies rechtfertigt. Siehe Wikipedia-Thema Paketverlust .
Die Frage ist, wie hoch Ihre Verlustrate im aktuellen Netzwerkkontext ist. Wenn es sich also um Kommunikation innerhalb eines LANs oder Subnetzwerks handelt, ist Ihre Verlustrate möglicherweise niedrig. In einem WAN oder über das Internet kann Ihre Verlustrate recht hoch sein. UDP-Pakete werden aus einer Reihe von Gründen verworfen und weitergeleitet, jedoch ermöglichen die Netzwerkbedingungen, dass die Anzahl der Hops verringert wird. Das Versenden von Paketen in die große Leere ohne Verantwortlichkeit lässt die Möglichkeit stiller Fehler offen.
Es klingt so, als würde in Ihrem Fall nur eine einfache Bestätigung mit erneuter Übertragung nach einer Zeitüberschreitung ohne Bestätigung ausreichen.
Ich habe XML-Nachrichten über eine gepflegte TCP-Verbindung erstellt und es hat großartig funktioniert. Ich hatte eine Schicht, die vollständige Nachrichten in einem Puffer an die Anwendungsschicht lieferte, um sie zu verarbeiten. Ich habe XML verwendet, um die Nachricht mit einem XML-Start-Tag für den Anfang der Nachricht und einem XML-End-Tag zu verpacken, um zu wissen, wann die gesamte Nachricht empfangen wurde.
TCP verfügt über einige Funktionen wie die sequentielle Reihenfolge der Pakete, keine Wiederholungen und als verbundener Transportmechanismus wissen Sie, ob das andere Ende verschwindet oder nicht, obwohl es eine Weile dauern kann, bis Sie es herausfinden. Das Verbinden und Trennen kann zu Verzögerungen führen, ist jedoch unter normalen Bedingungen nicht belastend, obwohl die Netzwerkbedingungen dazu führen können, dass der TCP-Durchsatz langsamer wird.
MQTT ist ein Protokoll, das von einer Netzwerk-Transportschicht, normalerweise TCP, transportiert wird. MQTT verwendet ein Publish / Subscribe-Modell, sodass keine Nachricht gespeichert wird. Wenn ein Herausgeber eine Nachricht veröffentlicht, wenn der Abonnent zu diesem Zeitpunkt nicht verbunden ist, wird die Nachricht beim Herstellen der Verbindung nicht angezeigt. MQTT ist so ziemlich in Echtzeit, ich nehme an, darum geht es im Telemetrieteil des Akronyms. Ich mag MQTT für kleine Nachrichten und habe einige Experimente mit JSON-Nutzdaten über MQTT mit Mosquitto durchgeführt. Siehe diesen Artikel Zuverlässige Nachrichtenübermittlung mit Mosquitto (MQTT) mit einem Überblick über MQTT und die Servicequalität. In diesem kurzen Artikel finden Sie Links zu Ressourcen, einschließlich einer Beispielanwendung IoT - MQTT Publish und Subscriber C Code .
Meine Experimente mit MQTT unter Verwendung von JSON-Text und einer SQLite3-Datenbank im Abonnenten zum Speichern von Nachrichten finden Sie unter https://github.com/RichardChambers/raspberrypi/tree/master/mqtt, obwohl sich die Quelle in C befindet und ziemlich chaotisch ist.
Hier ist ein 13-minütiges Video # 144 Internet Protocols: CoAP vs MQTT, Network Sniffing und Vorbereitung auf IKEA Tradfri Hacking . Dies ist ein interessanter Artikel über CoAP, Constrained Application Protocol: CoAP ist das 'moderne' Protokoll von IoT . Es gibt diese Zusammenfassung von CoAP:
Early Adopters sind sich einig, dass das Constrained Application Protocol für eingeschränkte Netzwerke und Geräte sehr gut funktioniert. Etwas nicht so Bekanntes: "In einem sehr überlasteten drahtlosen Netzwerk - Wi-Fi oder Mobilfunk - kann CoAP weiterhin funktionieren, wenn ein auf Transmission Control Protocol basierendes (TCP) Protokoll wie MQTT nicht einmal einen Handshake ausführen kann. "Sagte Vermillard.
Dies liegt daran, dass CoAP im Gegensatz zu den meisten anderen IoT-Protokollen auf UDP basiert. Mit anderen Worten bedeutet dies, dass bei TCP keine Protokoll-Handshakes oder Fehlerkorrekturen auftreten. "CoAP ist möglicherweise nicht so zuverlässig wie HTTP oder garantiert die Zustellung von Nachrichten wie MQTT, aber es ist extrem schnell", bemerkte Matthieu. "Wenn Sie damit einverstanden sind, dass einige Nachrichten nicht empfangen werden, können Sie innerhalb desselben Zeitraums viele weitere Nachrichten senden."
Es gibt einige andere wie AMQP, STOMP und CBOR, die Sie möglicherweise ebenfalls betrachten. Siehe die CBOR-Standardwebsite sowie diese Arbeit, Implementierung und Bewertung des CBOR-Protokolls . Weitere Informationen finden Sie in diesem Artikel, Auswählen Ihres Messaging-Protokolls: AMQP, MQTT oder STOMP , in dem AMQP, MQTT und STOMP verglichen und gegenübergestellt werden und der mit einem Hinweis zum RabitMQ-Broker endet:
Hoffentlich kann dies vielen helfen, die Protokollsuppe für jeden Ihrer Anwendungsfälle zu navigieren. Da Unternehmen häufig viele Anwendungen mit unterschiedlichen Anforderungen haben, ist es durchaus möglich, dass Sie alle drei Broker für unterschiedliche Anwendungen benötigen. Hier kommt ein solider Multiprotokoll-Polyglot-Broker wie RabbitMQ ins Spiel - da er STOMP, MQTT oder AMQP einsenden und einen der anderen herausholen kann. Sie müssen nicht an eines dieser Protokolle gebunden sein - alle drei werden vom RabbitMQ-Broker unterstützt, sodass es eine ideale Wahl für die Interoperabilität zwischen Anwendungen ist. Die Plugin-Architektur ermöglicht es RabbitMQ auch, sich weiterzuentwickeln, um in Zukunft zusätzliche oder aktualisierte Versionen dieser Protokolle zu unterstützen.
Dieses Folienfreigabepaket mit rund 60 Folien bietet einen Vergleich und Kontrast zwischen vier verschiedenen IoT-Protokollen, wobei die Anforderungen von zwei verschiedenen IoT-Gruppen, Consumers und Industrial, berücksichtigt werden, die unterschiedliche Anforderungen an Zuverlässigkeit und Robustheit stellen. Was ist der richtige Messaging-Standard für das IoT? .
Ack
ist nicht erforderlich. Ich denke, dass es nicht allzu viel Sinn macht, neben UDP an Zuverlässigkeit zu arbeiten. Dafür ist TCP gedacht.