2013-09-27 7 views
12

Gibt es eine Möglichkeit, über alle verbundenen Clientdetails (IP & Name) von einem anderen Client zu finden? Ich weiß, es gibt ein Thema "$ SYS/broker/clients/active", das die Anzahl der aktuell verbundenen Clients angibt, aber wenn ich mehr über jeden verbundenen Client wissen möchte, gibt es einen Weg?So finden Sie verbundene MQTT-Clientdetails

Ich entwickle eine Lösung, bei der die Anzahl der Clients (über das drahtlose Netzwerk) mit dem MQTT-Broker verbunden wird, der sich auf einem Server befindet. Ich habe auch einen anderen Klienten, der auf der gleichen Maschine läuft und mit dem Vermittler verbunden ist, der beobachtet, wenn irgendein neuer Klient mit dem Vermittler oder für einen verbundenen Klienten verbunden ist. Ich kann die Nachricht in der Broker-Konsole sehen, wenn ein neuer Client eine Verbindung herstellt oder der verbundene Client die Verbindung trennt. Können wir etwas Ähnliches von einem Kunden erhalten, der mit dem Broker verbunden ist? Bitte schlagen Sie vor, was der beste Weg wäre, dies zu erreichen?

Vielen Dank im Voraus.

-Dilip

+0

Können Sie weitere Details zu den von Ihnen verwendeten Tools hinzufügen? Die Frage ist sehr hell auf Details. – ralight

+0

Die Art der Sache, die Sie fragen, wird implementierungsspezifisch sein - das MQTT-Protokoll bietet dies nicht; Daher ralight's Frage, welche Tools/Clients/Broker Sie verwenden. – knolleary

+0

Danke Roger und Knolleary für deine Antwort. Ich benutze einen C-Client auf einem Router, der mit dem Broker an einem Remote-Standort über das Internet und einem Python-Client auf dem Server verbunden wird (wo Broker installiert ist). Es kann zu jedem Zeitpunkt n-Nummern geben. Jetzt, wenn Router n/w ausfällt, wird Broker diesen Client trennen und an dieser Stelle möchte ich Benutzer des Routers informieren (per E-Mail mit Google API), dass seine/ihre N/W ist down.Hope dies gibt Ihnen einige Einblicke lassen Sie mich wissen, wenn Sie weitere Details benötigen. – Dilip

Antwort

20

Ihre ursprüngliche Frage, Noch Antworten auf nachfolgende Fragen identifizieren, welche Maklerimplementierung Sie verwenden. Es könnte also eine effizientere Antwort auf Ihre Frage geben.

Ohne diese Informationen konzentrieren wir uns auf das, was Sie im Protokoll selbst tun können.

MQTT unterstützt RETAINED-Nachrichten. Hier speichert der Broker die zuletzt gespeicherte Nachricht für jedes Thema. Wenn ein Client das Thema abonniert, erhält er die beibehaltene Nachricht (falls vorhanden).

Es gibt auch das Testament (LWT) Merkmal (das goetzchr bezeichnet), die verwendet werden können eine Nachricht im Auftrag des Kunden zu veröffentlichen, wenn es ungewöhnlich trennt.

Durch die Kombination dieser beiden Funktionen können Sie einen einfachen Presence-Service auf dem Broker erstellen, und zwar alles innerhalb des Protokolls. Es funktioniert wie folgt:

  1. , wenn ein Client eine Verbindung herstellt, veröffentlicht er eine beibehaltene Nachricht zu einem Thema eindeutig es zum Beispiel:

    clients/my_client_id/state

    mit einer Nutzlast von 1. (my_client_id durch die eigene ID des Kunden ersetzen.

  2. Es stellt auch eine LWT-Nachricht auf Verbindung, die zu demselben Thema veröffentlicht wird, aber mit einer Nutzlast von 0. Dies sollte auch eine RETAINED-Nachricht sein.

  3. , wenn ein Client sauber trennt, veröffentlicht sie eine beibehaltene Nachricht auf das gleiche Thema mit einer Nutzlast von 0

Dies ist ein weiterer Client clients/# abonnieren können alle Nachrichten in Kunden anzeigt, um die Änderungen zu erhalten Verbindungsstatus (das vollständige Thema identifiziert den Client und den Wert der Nutzlast, der den Verbindungsstatus angibt).

Um mehr Informationen als nur verbundenen Zustand zu erhalten, können die Kunden eine weitere Rückmeldung auf connect veröffentlichen, zu einem anderen Thema, zB clients/my_client_id/info, das alle Informationen enthält, die Sie interessiert.

Dies funktioniert nur, wenn Sie Kontrollieren Sie alle Clients, die sich mit Ihrem Broker verbinden und sie dazu bringen, sich so zu verhalten.

Dies ist kein idealer Ansatz; hoffentlich wird Ihre Broker-Implementierung einige serverseitige Mittel bereitstellen, um dies zu tun.

+0

Danke Knolleary. Ich war auf der Suche nach so etwas. Hoffentlich wird das meinem Zweck dienen. Danke auch allen für Ihre Unterstützung. – Dilip

6

wie Knolleary bereits erwähnt diese Implementierung spezifisch ist und nicht durch MQTT selbst zur Verfügung gestellt.

Eine Lösung könnte die HiveMQ MQTT broker sein. Es verfügt über ein Plugin-SDK, mit dem Sie eine solche Anpassung über Callbacks vornehmen können, dh jedes Mal, wenn ein Client eine Verbindung herstellt, trennt, eine Nachricht sendet oder eine Nachricht abonniert, können Sie benutzerdefinierten Code ausführen, wie in Ihrem Fall eine E-Mail senden. Beim Schreiben Ihres benutzerdefinierten Codes können Sie auf alle Informationen über den Client zugreifen, der den Rückruf aufgerufen hat. So wäre es einfach, dein Verhalten zu implementieren. Die einzige Sache ist, wo Sie die E-Mail-Adresse speichern? Ist es der Benutzername?

Weitere Informationen zum Schreiben von benutzerdefinierten HiveMQ Plugins finden Sie in der getting started guide und die example plugin on GitHub

(Disclosure: Ich bin einer der HiveMQ Entwickler)

Cheers, Chris

+0

Danke für Ihren Vorschlag Goetzchr. E-Mail-Adressen werden in der Datenbank gespeichert, wenn ein Client erfolgreich eine Verbindung mit dem Broker herstellt, werden alle Details für den Python-Client veröffentlicht, der auf dem Broker-Rechner ausgeführt wird, um sie aufzunehmen und in die Datenbank einzufügen. Ich bin mir nicht sicher, ob wir zu diesem Zeitpunkt in HiveMQ einsteigen wollen, da wir mit dem MQTT-Broker schon einige Entwicklungsschritte gemacht haben. Mein Hauptziel war es, den Python-Client irgendwie zu benachrichtigen, wenn ein bestimmter Client vom Broker getrennt wird. Wir haben bereits ein anderes Modul, das sich darum kümmert, E-Mails an die gewünschte E-Mail-Adresse zu senden. – Dilip

+1

Ah ok, ich denke, eine mögliche Lösung wäre, die letzte Willens- und Testamentsfunktion von MQTT zu verwenden. Dies gibt Ihnen die Möglichkeit, eine Nachricht an ein Thema zu senden, wenn ein Client unerwartet getrennt wird. Das Thema und die Nachricht können für jeden Client in der Connect-Nachricht individuell festgelegt werden. –

+0

Danke Goetzchr. Ich war auf der Suche nach so etwas. – Dilip