2013-09-27 3 views
12

C'è un modo per trovare tutti i dettagli del client connesso (nome IP &) da un altro client? So che c'è un argomento "$ SYS/broker/clients/active" che fornisce il numero di client attualmente connessi, ma se voglio sapere di più su ciascun client connesso, c'è qualche modo?Come trovare i dettagli del client MQTT collegato

Sto sviluppando una soluzione in cui il numero di client sarà connesso (utilizzando la rete wireless) al broker MQTT situato su un server. Avrò anche un altro client in esecuzione sulla stessa macchina e connesso al broker che osserverà se un nuovo client è connesso con il broker o per un client disconnesso. Posso vedere il messaggio sulla console del broker quando un nuovo client si connette o il client connesso viene disconnesso. Possiamo ottenere qualcosa di simile da un client connesso al broker? Si prega di suggerire quale sarebbe il miglior modo possibile per raggiungere questo obiettivo?

Grazie in anticipo.

-Dilip

+0

Puoi aggiungere ulteriori dettagli su quali strumenti stai utilizzando? La domanda è molto leggera sui dettagli. – ralight

+0

Il tipo di cosa che stai chiedendo sarà specifico per l'implementazione - il protocollo MQTT non lo fornisce; quindi la domanda di ralight su quali strumenti/clienti/broker stai usando. – knolleary

+0

Grazie Roger e Knolleary per la vostra risposta. Sto usando un c-client su un router che sarà connesso al broker situato in una posizione remota su Internet e un client python sul server (dove è installato il broker). Possono esserci n-numeri di router in qualsiasi momento. Ora se il n/w del router va giù, il broker scollegherà quel client e a questo punto vorrei informare l'utente del router (via email usando l'API di google) che il suo n/w è giù. Scopo questo ti dà qualche intuizione , fammi sapere se hai bisogno di ulteriori dettagli. – Dilip

risposta

20

tua domanda iniziale, né le risposte alle domande successive identificano quale implementazione del broker stai usando. Quindi potrebbe esserci una risposta più efficiente alla tua domanda.

Senza queste informazioni, concentriamoci su ciò che è possibile fare nel protocollo stesso.

MQTT supporta i messaggi CONSERVATI. È qui che il broker memorizza il messaggio conservato più recente rispetto a ciascun argomento. Quando un cliente si iscrive all'argomento, riceverà il messaggio conservato (se ne esiste uno).

C'è anche la funzione Last Will and Testament (LWT) (a cui goetzchr si riferisce), che può essere utilizzata per pubblicare un messaggio per conto del client se si disconnette in modo anomalo.

La combinazione di queste due funzionalità consente di creare un servizio di presenza semplice sul broker, il tutto all'interno del protocollo. Funziona in questo modo:

  1. quando un client si connette, pubblica un messaggio MANTENERE ad un argomento unico ad esso, per esempio:

    clients/my_client_id/state

    con un carico utile di 1. (sostituendo my_client_id con l'id del cliente.

  2. inoltre, al collegamento, imposta un messaggio LWT da pubblicare sullo stesso argomento, ma con un carico utile di 0. Questo dovrebbe essere anche un messaggio RITENUTO.

  3. quando un client si disconnette in modo pulito, pubblica un messaggio MANTENERE allo stesso soggetto con un carico utile di 0

Questo permette un altro client di sottoscrivere clients/# per ricevere tutti i messaggi che indicano le variazioni di clienti 'stato della connessione (l'argomento completo che identifica il client e il valore del payload che indica lo stato della connessione).

Per ottenere più informazioni rispetto dello stato appena collegato, i clienti possono pubblicare un altro messaggio conservato alla connessione, a un altro argomento, ad esempio clients/my_client_id/info che contiene tutte le informazioni che ti interessa.

questo funziona solo se si avere il controllo di tutti i client che si connettono al proprio broker e in grado di indurli a comportarsi in questo modo.

Questo non è un approccio ideale; si spera che l'implementazione del broker fornisca alcuni strumenti sul lato server per farlo.

+0

Grazie Knolleary. Stavo cercando qualcosa del genere. Quindi spero che questo serva al mio scopo. Grazie anche a tutti per il vostro supporto. – Dilip

6

come Knolleary già precisato questo è Attuazione specifiche e non è fornito da MQTT stessa.

Una soluzione potrebbe essere utilizzare HiveMQ MQTT broker. Dispone di un plug-in SDK, che consente di effettuare tale personalizzazione sui callback, vale a dire ogni volta che un client si connette, disconnette, invia un messaggio, sottoscrive un messaggio è possibile eseguire codice personalizzato, come nel caso dell'invio di un'e-mail. Durante la scrittura del codice personalizzato è possibile accedere a tutte le informazioni sul client, che ha richiamato la richiamata. Quindi sarebbe facile implementare il tuo comportamento. L'unica cosa è dove memorizzi l'indirizzo email? È il nome utente?

Per ulteriori informazioni sulla scrittura di plug-in personalizzato HiveMQ vedere il getting started guide e la example plugin on GitHub

(Disclosure: io sono uno degli sviluppatori HiveMQ)

Cheers, Chris

+0

Grazie per il tuo suggerimento Goetzchr. Gli indirizzi di posta elettronica saranno archiviati nel database, quando un client si connetterà con successo con il broker, pubblicherà tutti i dettagli per il client Python in esecuzione sul broker per prelevarli e inserirli sul DB. Non sono sicuro se vogliamo passare a HiveMQ in questo momento poiché abbiamo già fatto un bel po 'di sviluppo usando il broker MQTT. Il mio obiettivo principale era quello di informare in qualche modo il client Python quando un particolare client viene disconnesso dal broker. Abbiamo già un altro modulo che si occuperà di inviare e-mail all'indirizzo desiderato. – Dilip

+1

Ah, ok, penso che una possibile soluzione sarebbe quella di utilizzare l'ultima funzione testamento e testamento di MQTT. Questo ti dà la possibilità di inviare un messaggio a un argomento quando un client viene disconnesso in modo imprevisto. L'argomento e il messaggio possono essere specificati singolarmente per ciascun cliente nel messaggio Connect. –

+0

Grazie Goetzchr. Stavo cercando qualcosa del genere. – Dilip