Mein Weg ins IoT (8): Ein einfaches Anwendungsprotokoll
18. April 2016
über
über
In der letzten Folge habe ich mit Hilfe einer Open-Source-Library einen MQTT-Client für Android programmiert. Von meinem Handy aus kann ich nun einfache Textnachrichten absetzen, die über einen öffentlichen MQTT-Broker im Internet an einen MQTT-Client auf meinem PC weitergeleitet werden. Das PC-Programm gibt die Nachrichten dann über USB zu einem SAM-D20-Board mit angeschlossener Relaiskarte weiter, wo wiederum ein Funksteckdosen-Sender angeschlossen ist. Um einen Impuls für den Sender zu generieren, welcher die entsprechende Funksteckdose aktiv schaltet, muss ich das Relais 1 der Karte kurz ein- und dann wieder ausschalten. Zum Ausschalten der Funksteckdose muss ich dasselbe mit dem Relais 0 machen.
Auf dem SAM D20 läuft eine bereits in Elektor vorgestellte Standardfirmware. Das Relais 1 lässt sich über die serielle Schnittstelle mit dem Textkommando „R 0 1 +“ ein und mit „R 0 1 –“ ausschalten. Das Ganze funktioniert, ist aber wenig benutzerfreundlich. Die Standardfirmware zwingt meiner MQTT-Kommunikation ein wenig sinnvolles Anwendungsprotokoll auf. Zum Einschalten einer Funksteckdose sind auf meinem Handy gleich zwei MQTT-Nachrichten einzutippen und mit einem Druck auf den PUBLISH-Button zu versenden:
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
Wie könnte ein nützliches Anwendungsprotokoll und eine komfortablere Benutzeroberfläche für mein Smartphone aussehen? Ich stellte mir vor, dass in einer typischen Steuerungsanwendung gleich mehrere Lampen und Verbraucher ein- und auszuschalten sind. Vielleicht gibt es auch Lampen, die gedimmt werden müssen, mit einem Wertebereich von beispielsweise 0..255. Eventuell sind sogar noch RGB-LEDs im Spiel. Diese könnte man mit einem Wertetripel von 3x 0..255 ansteuern.
Nach etwas Nachdenken fühlte ich mich mit einem kleinen Anwendungsprotokoll gut gerüstet, das schlicht und einfach zwei Bytes als Hexadezimalzahl übermittelt, also zum Beispiel „0503“. Das erste Byte steht dabei für eine Channel- oder Controller-Nummer, charakterisiert also, welcher Verbraucher geschaltet oder auf andere Weise gesteuert werden soll. Das zweite Byte steht für den Wert, der übermittelt werden soll, ihn habe ich ControllerValue genannt. Wer sich ein wenig mit DMX und/oder MIDI auskennt, sieht auf Anhieb, dass man mit meinem kleinen Protokoll auch Beleuchtungs- und Musik-Equipment steuern könnte.
Für meinen Android-MQTT-Client habe ich daraufhin eine kleine Benutzeroberfläche entworfen (Bild), die mein CCProtocol abdeckt. Ganz oben ist die ControllerNumber auszuwählen, beispielsweise „6“. Mit den Buttons ON und OFF kann man nun beispielsweise die Lampe 6 an oder ausschalten. Betätigt man „ON“, wird direkt der Text „06FF“ (ControllerValue FF = 255 für Einschalten) versendet. Berührt man „OFF“, dann geht der Text „0600“ ins Internet. Zum Übermitteln eines bestimmten Wertes (Dimmen u.a.) sucht man sich eine Zahl in der Dropdownbox „Value“ aus. Wählt man beispielsweise „3“ aus, dann wird direkt der Text „0603“ verschickt. Damit man für bestimmte Anwendungen auch noch freie Texte über MQTT versenden kann, habe ich die Textbox und den PUBLISH-Button aus der vorigen Version des Android MQTT Messengers beibehalten.
Wo kann man nun das Topic einstellen, unter dem die Nachrichten veröffentlicht werden sollen? Dies habe ich in ein Settings-Menü ausgelagert. Um ein Topic auszuwählen, berührt man den kleinen Menübutton ganz oben rechts und betätigt den einzigen Menüpunkt „Settings“. Nun tippt man die Schrift „Set Topic“ an und gibt den Topicnamen im aufgehenden Fenster ein. Wie immer wird das gesamte Topic dann nach der folgenden Formel zusammengesetzt:
"/ElektorMyJourneyIoT/" + Topic + "/test"
Wenn man hier beispielsweise „lamp“ eingibt, dann muss man dieses Topic im PC-MQTT-Client auch als „Topic to subscribe“ auswählen und den Subscribe-Knopf betätigen. Auch auf PC-Seite wird dann das Gesamttopic „/ElektorMyJourneyIoT/lamp/test“ eingestellt und man kann die Nachrichten vom Handy empfangen.
Damit ich meine Funksteckdose mit „00FF“ an und mit „0000“ ausschalten konnte, musste ich die Firmware für das Atmel-Board nun natürlich etwas anpassen. Die Firmware ist wie auch die MQTT-Clients für Android und den PC im Download-ZIP unten enthalten.
In der nächsten Folge werden wir uns weiter damit beschäftigen und auch eine Optimierung für die Elektronik vorstellen. Unser nächstes Ziel ist dann natürlich, ein Controllerboard direkt ans Netzwerk anzuschließen!
Auf dem SAM D20 läuft eine bereits in Elektor vorgestellte Standardfirmware. Das Relais 1 lässt sich über die serielle Schnittstelle mit dem Textkommando „R 0 1 +“ ein und mit „R 0 1 –“ ausschalten. Das Ganze funktioniert, ist aber wenig benutzerfreundlich. Die Standardfirmware zwingt meiner MQTT-Kommunikation ein wenig sinnvolles Anwendungsprotokoll auf. Zum Einschalten einer Funksteckdose sind auf meinem Handy gleich zwei MQTT-Nachrichten einzutippen und mit einem Druck auf den PUBLISH-Button zu versenden:
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
Wie könnte ein nützliches Anwendungsprotokoll und eine komfortablere Benutzeroberfläche für mein Smartphone aussehen? Ich stellte mir vor, dass in einer typischen Steuerungsanwendung gleich mehrere Lampen und Verbraucher ein- und auszuschalten sind. Vielleicht gibt es auch Lampen, die gedimmt werden müssen, mit einem Wertebereich von beispielsweise 0..255. Eventuell sind sogar noch RGB-LEDs im Spiel. Diese könnte man mit einem Wertetripel von 3x 0..255 ansteuern.
Nach etwas Nachdenken fühlte ich mich mit einem kleinen Anwendungsprotokoll gut gerüstet, das schlicht und einfach zwei Bytes als Hexadezimalzahl übermittelt, also zum Beispiel „0503“. Das erste Byte steht dabei für eine Channel- oder Controller-Nummer, charakterisiert also, welcher Verbraucher geschaltet oder auf andere Weise gesteuert werden soll. Das zweite Byte steht für den Wert, der übermittelt werden soll, ihn habe ich ControllerValue genannt. Wer sich ein wenig mit DMX und/oder MIDI auskennt, sieht auf Anhieb, dass man mit meinem kleinen Protokoll auch Beleuchtungs- und Musik-Equipment steuern könnte.
Für meinen Android-MQTT-Client habe ich daraufhin eine kleine Benutzeroberfläche entworfen (Bild), die mein CCProtocol abdeckt. Ganz oben ist die ControllerNumber auszuwählen, beispielsweise „6“. Mit den Buttons ON und OFF kann man nun beispielsweise die Lampe 6 an oder ausschalten. Betätigt man „ON“, wird direkt der Text „06FF“ (ControllerValue FF = 255 für Einschalten) versendet. Berührt man „OFF“, dann geht der Text „0600“ ins Internet. Zum Übermitteln eines bestimmten Wertes (Dimmen u.a.) sucht man sich eine Zahl in der Dropdownbox „Value“ aus. Wählt man beispielsweise „3“ aus, dann wird direkt der Text „0603“ verschickt. Damit man für bestimmte Anwendungen auch noch freie Texte über MQTT versenden kann, habe ich die Textbox und den PUBLISH-Button aus der vorigen Version des Android MQTT Messengers beibehalten.
Wo kann man nun das Topic einstellen, unter dem die Nachrichten veröffentlicht werden sollen? Dies habe ich in ein Settings-Menü ausgelagert. Um ein Topic auszuwählen, berührt man den kleinen Menübutton ganz oben rechts und betätigt den einzigen Menüpunkt „Settings“. Nun tippt man die Schrift „Set Topic“ an und gibt den Topicnamen im aufgehenden Fenster ein. Wie immer wird das gesamte Topic dann nach der folgenden Formel zusammengesetzt:
"/ElektorMyJourneyIoT/" + Topic + "/test"
Wenn man hier beispielsweise „lamp“ eingibt, dann muss man dieses Topic im PC-MQTT-Client auch als „Topic to subscribe“ auswählen und den Subscribe-Knopf betätigen. Auch auf PC-Seite wird dann das Gesamttopic „/ElektorMyJourneyIoT/lamp/test“ eingestellt und man kann die Nachrichten vom Handy empfangen.
Damit ich meine Funksteckdose mit „00FF“ an und mit „0000“ ausschalten konnte, musste ich die Firmware für das Atmel-Board nun natürlich etwas anpassen. Die Firmware ist wie auch die MQTT-Clients für Android und den PC im Download-ZIP unten enthalten.
In der nächsten Folge werden wir uns weiter damit beschäftigen und auch eine Optimierung für die Elektronik vorstellen. Unser nächstes Ziel ist dann natürlich, ein Controllerboard direkt ans Netzwerk anzuschließen!
Mehr anzeigen
Weniger anzeigen
Diskussion (2 Kommentare)