Alcuni pensieri sulla mia esperienza con TCP, UDP e MQTT e alcune risorse aggiuntive da rivedere.
Con UDP ho riscontrato il problema del fallimento silenzioso in cui un'applicazione su un nodo di rete, il client, vede solo alcuni dei messaggi UDP che sono stati inviati. Ci sono troppi motivi per cui il traffico di rete può andare storto. Il problema con UDP è che i pacchetti possono essere scartati praticamente ogni volta che uno qualsiasi dei nodi nel percorso di rete tra produttore di pacchetti e consumatore di pacchetti garantisce. Vedi argomento Wikipedia Perdita di pacchetti .
La domanda è qual è il tuo tasso di perdita in qualunque contesto di rete attuale. Quindi, se si tratta di comunicazione all'interno di una LAN o sottorete, il tasso di perdita potrebbe essere basso. Su una WAN o su Internet il tasso di perdita potrebbe essere piuttosto elevato. I pacchetti UDP vengono scartati per una serie di motivi e instradati, tuttavia le condizioni della rete consentono tale decremento del conteggio dei hop. L'invio di pacchetti nel grande vuoto senza responsabilità lascia aperta la possibilità di guasti silenziosi.
Sembra che nel tuo caso basterebbe solo un semplice riconoscimento con ritrasmissione dopo un timeout senza ricevere un riconoscimento.
Ho fatto messaggi XML su una connessione TCP mantenuta e ha funzionato benissimo. Avevo un livello che consegnava messaggi completi ciascuno in un buffer al livello applicazione da gestire. Ho usato XML per impacchettare il messaggio con un tag iniziale XML per l'inizio del messaggio e un tag finale XML per sapere quando era stato ricevuto l'intero messaggio.
TCP ha alcune caratteristiche come l'ordine sequenziale dei pacchetti, nessuna ripetizione, ed essendo un meccanismo di trasporto connesso significa che sai se l'altra estremità scompare o no, anche se potrebbe volerci un po 'di tempo per scoprirlo. La connessione e la disconnessione possono comportare ritardi ma non onerosi in condizioni normali sebbene le condizioni di rete possano rallentare il throughput TCP.
MQTT è un protocollo che viene trasportato da un livello di trasporto di rete, normalmente TCP. MQTT utilizza un modello di pubblicazione / sottoscrizione, quindi non è presente alcun archivio di messaggi. Pertanto, quando un editore pubblica un messaggio se l'utente non è collegato al momento, quando si connette, non vedrà il messaggio. MQTT è praticamente in tempo reale, suppongo che sia la parte della telemetria dell'acronimo. Mi piace MQTT per piccoli messaggi e ho fatto alcuni esperimenti con il payload JSON tramite MQTT usando Mosquitto. Vedi questo articolo Consegna affidabile dei messaggi con Mosquitto (MQTT) con una panoramica di MQTT e della qualità del servizio. E vedere questo breve articolo con i link a risorse tra cui un'applicazione di esempio degli oggetti - MQTT Pubblica e Subscriber codice C .
I miei esperimenti con MQTT utilizzando il testo JSON e un database SQLite3 nell'abbonato per archiviare i messaggi sono su https://github.com/RichardChambers/raspberrypi/tree/master/mqtt sebbene l'origine sia in C ed è piuttosto disordinata.
Ecco un protocollo Internet n. 144 di 13 minuti : CoAP vs MQTT, Network Sniffing e preparazione per IKEA Tradfri Hacking . Questo è un articolo interessante su CoAP, Constrained Application Protocol: CoAP è il protocollo "moderno" di IoT . C'è questa sintesi di CoAP:
I primi utenti concordano sul fatto che il protocollo di applicazione vincolata funziona molto bene per reti e dispositivi vincolati. Qualcosa di non molto noto: "Su una rete wireless molto congestionata - Wi-Fi o cellulare - CoAP può continuare a funzionare laddove un protocollo TCP (Transmission Control Protocol) come MQTT non riesce nemmeno a completare un handshake, "Disse Vermillard.
Questo perché a differenza della maggior parte degli altri protocolli IoT, CoAP è basato su UDP. In altre parole, significa che nessun handshake di protocollo o correzione degli errori riscontrati con TCP. "CoAP potrebbe non essere affidabile come HTTP o garantire la consegna di messaggi come MQTT, ma è estremamente veloce", ha osservato Matthieu. "Se stai bene con alcuni messaggi non ricevuti, puoi inviare molti più messaggi nello stesso lasso di tempo."
Ce ne sono anche alcuni altri come AMQP, STOMP e CBOR. Consulta il sito Web standard CBOR , nonché questa tesi, implementazione e valutazione del protocollo CBOR . Vedi questo articolo, Scelta del protocollo di messaggistica: AMQP, MQTT o STOMP che confronta e contrappone AMQP, MQTT e STOMP e termina con una nota sul broker RabitMQ:
Si spera che questo possa aiutare molti a iniziare a esplorare la minestra del protocollo là fuori per ciascuno dei casi d'uso. Poiché è comune per le aziende avere molte applicazioni con esigenze diverse, è certamente possibile che tu abbia bisogno di tutti e tre i broker in diverse applicazioni. È qui che entra in gioco un solido broker multiprotocollo, poliglotta come RabbitMQ, poiché può inviare STOMP, MQTT o AMQP e ottenere uno degli altri. Non è necessario essere bloccati da uno di questi protocolli: tutti e tre sono supportati dal broker RabbitMQ, rendendolo la scelta ideale per l'interoperabilità tra le applicazioni. L'architettura del plug-in consente inoltre a RabbitMQ di evolversi per supportare versioni aggiuntive o aggiornate di questi protocolli in futuro.
Questo pacchetto di condivisione di diapositive di circa 60 diapositive fa un confronto e un contrasto tra quattro diversi protocolli IoT, esaminando le esigenze di due diversi gruppi IoT, i consumatori e l'industria, che hanno esigenze diverse di affidabilità e robustezza. Qual è lo standard di messaggistica giusto per l'IoT? .
Ack
ing non è necessario. Penso che lavorare sull'affidabilità su UDP non abbia molto senso, ecco a cosa serve TCP.