Non è difficile da fare in realtà.
Prima di tutto è necessario definire il protocollo da utilizzare. Può essere molto semplice; come solo un campo del tipo di messaggio, un campo di dimensioni del carico utile e il carico utile effettivo. I tipi di messaggi necessari sono SUBSCRIBE
, UNSUBSCRIBE
e PUBLISH
. Il carico utile per i messaggi SUBSCRIBE
e UNSUBSCRIBE
è il nome di un canale per iscriversi/annullare la sottoscrizione. Il payload per il messaggio PUBLISH
è il nome del canale e i dati effettivi (insieme ovviamente alla dimensione dei dati).
Per connettere tutti gli abbonati è necessario un server centrale. Tutti gli abbonati/editori devono connettersi a questo server. Il programma server mantiene una collezione di code, una per ogni canale. Quando un messaggio di iscrizione o pubblicazione arriva al server per un canale che non esiste, creare una nuova coda di messaggi per questo canale. Per ogni canale il server ha anche bisogno di una collezione di tutti i clienti iscritti a quel canale. Quando un messaggio di pubblicazione arriva al server, viene aggiunto alla fine della coda per il canale in questione. Mentre una coda canale non è vuota, invia una copia di essa a tutti gli abbonati per quel canale, e quando tutti lo hanno ricevuto, il messaggio può essere rimosso dalla coda.
La parte difficile del server è probabilmente la parte di comunicazione. La parte più facile sarà tutte le code e le collezioni, come è possibile utilizzare il C++ standard containers per tutti loro (ad esempio std::queue
per la coda reale, std::unordered_map
per i canali, e std::vector
per la raccolta di clienti collegati.)
I clienti sono molto semplice, tutta la necessità di fare è poter inviare l'abbonamento e pubblicare messaggi sul server e ricevere i messaggi di pubblicazione dal server. La parte difficile sarà ancora una volta l'effettiva parte della comunicazione.
Postscript:
non ho mai costruito un sistema del genere la mia auto, tutto quanto sopra era solo direttamente della parte superiore della mia testa. Un programmatore esperto non dovrebbe aver bisogno di più di un paio d'ore per implementare le basi, forse un paio di giorni per un inesperto.
Per la comunicazione che è possibile utilizzare ad es. Boost ASIO, forse usa uno threads per canale. E puoi usare qualcosa come Boost property tree per costruire/analizzare i messaggi JSON o XML.
Tuttavia, tutto questo è un po 'come reinventare la ruota, quando probabilmente potresti iniziare a utilizzare uno dei sistemi esistenti come RabbitMQ in un paio d'ore, risparmiando un sacco di tempo (e un sacco di bug!)
Hai bisogno di utilizzare una lib o un servizio? O potresti, visto i prerequisiti, usare solo prese o tubi? Sarebbe, probabilmente, più efficiente per un Raspberry. –
ZeroMQ è molto semplice da usare. – Kimi
@ dema80: preferisco il servizio ma lib è ok. Puoi suggerire eventuali prese per l'uso degli attrezzi? – Yoshi