Mijn pad naar het IoT (8): Een eenvoudig toepassingsprotocol
19 april 2016
op
op
In de vorige aflevering heb ik met behulp van een open source-library een MQTT-client voor Android geprogrammeerd. Vanuit mijn mobieltje kan ik nu eenvoudige tekstberichten versturen, die via een openbare MQTT-broker op het Internet naar een MQTT-client op mijn PC worden doorgegeven. Het PC-programma geeft de berichten dan via USB door aan een SAM -D20-kaart met een aangesloten relaiskaart, waarop weer een zender voor draadloze stopcontacten is aangesloten. Om een impuls te genereren, die de zender opdracht geeft om het eerste draadloze stopcontact in te schakelen, moet ik relais 1 op de kaart kort in- en dan weer uitschakelen. Voor het uitschakelen van stopcontact nummer 1 moet ik hetzelfde doen met relais 0.
Op de SAM D20 draait al eerder in Elektor gepresenteerde standaard firmware. Met die firmware kunnen we relais 1 via de seriële interface inschakelen met het tekstcommando „R 0 1 +“ en uitschakelen met „R 0 1 –“. Het werkt allemaal wel, maar het is niet erg gebruikersvriendelijk. De standaard firmware dringt een onbeholpen toepassingsprotocol op aan mijn MQTT-communicatie. Om een draadloos stopcontact in te schakelen moet ik op mijn mobieltje twee MQTT-berichten intikken en op de PUBLISH-button drukken om ze te verzenden:
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
Hoe zouden een nuttig toepassingsprotocol en een meer comfortabele gebruikersinterface voor mijn smartphone eruit kunnen zien? Het leek me, dat in een typische besturingstoepassing meteen meerdere lampen en verbruikers in en uit te schakelen zouden moeten zijn. Misschien zijn er ook lampen, die gedimd moeten worden, met een waardenbereik van bijvoorbeeld 0..255. Misschien moeten er zelfs RGB -LED’s worden aangestuurd. Die zou je met een drietal waarden van 3x 0..255 willen aansturen.
Na wat nadenken kwam ik uit op een klein toepassingsprotocol, dat heel simpel twee bytes overdraagt als hexadecimale getallen, dus bijvoorbeeld „0503“. Het eerste byte staat daarbij voor een kanaal of apparaatnummer, dus het geeft aan, welke verbruiker geschakeld of bestuurd moet worden. Het tweede byte staat voor de over te dragen waarde, dat heb ik ControllerValue gedoopt. Wie iets weet van DMX en/of MIDI, ziet meteen, dat we met mijn protocolletje ook verlichtings- en muziekapparatuur zouden kunnen besturen.
Vervolgens heb ik een kleine gebruikersinterface ontworpen voor mijn Android-MQTT-client (zie afbeelding), waarmee ik mijn CCProtocol kan aansturen. Helemaal bovenaan kunnen we een ControllerNumber uitkiezen, bijvoorbeeld „6“. Met de buttons ON en OFF kunnen we nu bijvoorbeeld lamp 6 aan- of uitschakelen. Als we op „ON“ drukken, wordt meteen de tekst „06FF“ (ControllerValue FF = 255 voor inschakelen) verstuurd. Drukken we op „OFF“, dan gaat de tekst „0600“ het Internet op. Voor het versturen van een bepaald getal (bijvoorbeeld om te dimmen) kunnen we een getal kiezen in de dropdown-box „Value“. Kiezen we bijvoorbeeld „3“, dan wordt meteen de tekst „0603“ verzonden. Om er voor te zorgen dat we voor speciale toepassingen nog steeds vrije teksten via MQTT kunnen verzenden, heb ik de textbox en de PUBLISH-button uit de vorige versie van de Android MQTT Messenger gehandhaafd.
Waar kunnen we nu het Topic instellen, waaronder de berichten moeten worden gepubliceerd? Dat heb ik een plaatsje gegeven in een Settings-menu. Om een Topic te kiezen, drukken we op de kleine menu-button rechts bovenin en geven we als menukeuze „Settings“. Dan kiezen we „Set topic“ en voeren de Topic-naam in in het dialoogvenster dat dan verschijnt. Het complete Topic wordt dan, zoals altijd, opgebouwd volgens de volgende formule:
"/ElektorMyJourneyIoT/" + Topic + "/test"
Als we hier bijvoorbeeld „lamp“ invoeren, dan moeten we dit topic ook kiezen als „Topic to subscribe“ in de MQTT-client op de PC en op de Subscribe-knop drukken. Aan de PC-kant wordt dan ook het complete Topic „/ElektorMyJourneyIoT/lamp/test“ ingesteld en we kunnen de berichten van het mobieltje ontvangen.
Om mijn draadloze stopcontact met „00FF“ aan en met „0000“ uit te kunnen schakelen, moest ik de firmware voor de Atmel-kaart nu natuurlijk wel aanpassen. Die firmware is, net als de MQTT-clients voor Android en de PC, beschikbaar in het onderstaande ZIP-bestand.
In de volgende aflevering gaan we hiermee verder en dan gaan we ook een optimalisatie voor de elektronica bekijken. En dan willen we natuurlijk een controllerkaart rechtstreeks op het netwerk aansluiten!
Op de SAM D20 draait al eerder in Elektor gepresenteerde standaard firmware. Met die firmware kunnen we relais 1 via de seriële interface inschakelen met het tekstcommando „R 0 1 +“ en uitschakelen met „R 0 1 –“. Het werkt allemaal wel, maar het is niet erg gebruikersvriendelijk. De standaard firmware dringt een onbeholpen toepassingsprotocol op aan mijn MQTT-communicatie. Om een draadloos stopcontact in te schakelen moet ik op mijn mobieltje twee MQTT-berichten intikken en op de PUBLISH-button drukken om ze te verzenden:
R 0 1 + [PUBLISH] R 0 1 – [PUBLISH]
Hoe zouden een nuttig toepassingsprotocol en een meer comfortabele gebruikersinterface voor mijn smartphone eruit kunnen zien? Het leek me, dat in een typische besturingstoepassing meteen meerdere lampen en verbruikers in en uit te schakelen zouden moeten zijn. Misschien zijn er ook lampen, die gedimd moeten worden, met een waardenbereik van bijvoorbeeld 0..255. Misschien moeten er zelfs RGB -LED’s worden aangestuurd. Die zou je met een drietal waarden van 3x 0..255 willen aansturen.
Na wat nadenken kwam ik uit op een klein toepassingsprotocol, dat heel simpel twee bytes overdraagt als hexadecimale getallen, dus bijvoorbeeld „0503“. Het eerste byte staat daarbij voor een kanaal of apparaatnummer, dus het geeft aan, welke verbruiker geschakeld of bestuurd moet worden. Het tweede byte staat voor de over te dragen waarde, dat heb ik ControllerValue gedoopt. Wie iets weet van DMX en/of MIDI, ziet meteen, dat we met mijn protocolletje ook verlichtings- en muziekapparatuur zouden kunnen besturen.
Vervolgens heb ik een kleine gebruikersinterface ontworpen voor mijn Android-MQTT-client (zie afbeelding), waarmee ik mijn CCProtocol kan aansturen. Helemaal bovenaan kunnen we een ControllerNumber uitkiezen, bijvoorbeeld „6“. Met de buttons ON en OFF kunnen we nu bijvoorbeeld lamp 6 aan- of uitschakelen. Als we op „ON“ drukken, wordt meteen de tekst „06FF“ (ControllerValue FF = 255 voor inschakelen) verstuurd. Drukken we op „OFF“, dan gaat de tekst „0600“ het Internet op. Voor het versturen van een bepaald getal (bijvoorbeeld om te dimmen) kunnen we een getal kiezen in de dropdown-box „Value“. Kiezen we bijvoorbeeld „3“, dan wordt meteen de tekst „0603“ verzonden. Om er voor te zorgen dat we voor speciale toepassingen nog steeds vrije teksten via MQTT kunnen verzenden, heb ik de textbox en de PUBLISH-button uit de vorige versie van de Android MQTT Messenger gehandhaafd.
Waar kunnen we nu het Topic instellen, waaronder de berichten moeten worden gepubliceerd? Dat heb ik een plaatsje gegeven in een Settings-menu. Om een Topic te kiezen, drukken we op de kleine menu-button rechts bovenin en geven we als menukeuze „Settings“. Dan kiezen we „Set topic“ en voeren de Topic-naam in in het dialoogvenster dat dan verschijnt. Het complete Topic wordt dan, zoals altijd, opgebouwd volgens de volgende formule:
"/ElektorMyJourneyIoT/" + Topic + "/test"
Als we hier bijvoorbeeld „lamp“ invoeren, dan moeten we dit topic ook kiezen als „Topic to subscribe“ in de MQTT-client op de PC en op de Subscribe-knop drukken. Aan de PC-kant wordt dan ook het complete Topic „/ElektorMyJourneyIoT/lamp/test“ ingesteld en we kunnen de berichten van het mobieltje ontvangen.
Om mijn draadloze stopcontact met „00FF“ aan en met „0000“ uit te kunnen schakelen, moest ik de firmware voor de Atmel-kaart nu natuurlijk wel aanpassen. Die firmware is, net als de MQTT-clients voor Android en de PC, beschikbaar in het onderstaande ZIP-bestand.
In de volgende aflevering gaan we hiermee verder en dan gaan we ook een optimalisatie voor de elektronica bekijken. En dan willen we natuurlijk een controllerkaart rechtstreeks op het netwerk aansluiten!
Read full article
Hide full article
Discussie (0 opmerking(en))