Mijn pad naar het IoT (14): Terugmeldingen van de MQTT-server
10 februari 2017
op
op
In het vorige deel heb ik een kleine sensorkaart gerealiseerd. Ik had daarvoor een fototransistor, een druktoets voor het starten van acties en een RGB -LED voor terugmeldingen aangesloten op het in de Elektor-shop verkrijgbare Pretzel-Board (bestukt met een ATmega en de WLAN-chip ESP 8266). Bij het aansluiten van de voedingsspanning logt de ESP 8266 in op een WLAN-netwerk; als dat is gelukt, licht de RGB -LED groen op. Met een druk op de knop kunnen we de ATmega dan in sensor-mode zetten. Hij samplet dan periodiek de meetwaarde van de fototransistor en geeft de ESP 8266 met AT-commando’s opdracht om via TCP /IP verbinding te maken met de HiveMQ-testserver op internet. Daarna wordt de MQTT-Connect-aanvraag verstuurd en tenslotte het MQTT-Publish-commando (met de meetwaarde als payload).
Er was ook een rudimentaire foutafhandeling: De ESP 8266 geeft bijvoorbeeld „ERROR“ terug, als het maken van de TCP /IP-verbinding niet lukt. Wat nog niet gebeurde was het evalueren van de via TCP /IP binnenkomende antwoorden van de server. Zo antwoordt de MQTT-server bijvoorbeeld op de Connect-aanvraag met de bytes „32 2 0 0“ als de poging om een verbinding te maken wordt geaccepteerd en we berichten mogen gaan publiceren.
Ik heb mijn kleine TCP /IP-bibliotheek uitgebreid met de functie
TCPClient_Receive(byte TCPBytesReceivedBuffer[])
die via de ESP 8266 vraagt, of er bytes van de server zijn ontvangen. Als dat het geval is, worden de bytes opgeslagen op het als parameter doorgegeven adres in het geheugen. In de functie
MQTTClient_Connect(String clientid)
van de MQTT-bibliotheek kan ik de ontvangen bytes daarna evalueren. Als het gelukt is, geeft de functie een 1 terug, anders een 0. In de aanroepende functie (die dus periodiek wordt doorlopen) gebruik ik de teruggegeven waarde om de rode LED te laten oplichten, als de poging om een verbinding te maken niet geaccepteerd is. En inderdaad is dat soms het geval.
Nu ik dus bytes van de server kon ontvangen en evalueren, wilde ik natuurlijk meer en programmeerde ik verder. Ik breidde de MQTT-bibliotheek uit met een functie, die een Subscribe-aanvraag kan doen om zich te abonneren. En natuurlijk controleerde ik ook in die functie het antwoord van de server. Het lukte me dan ook al snel om berichten van een andere MQTT-client op internet te ontvangen met het Pretzel-board. Om dat te doen, moeten we periodiek de nieuwe functie
MQTTClient_Get(byte MQTTBytesPayloadBuffer[])
aanroepen. Wat ik me tot nu toe niet gerealiseerd had: de broker geeft de door de zendende MQTT-client met de MQTT-Publish-commando’s uitgestuurde bytes gewoon 1:1 door aan alle clients, die zich op het topic hebben geabonneerd (inclusief topic, natuurlijk de eigenlijke data en ook de lengtebytes). In de volgende aflevering zal ik wat uitvoeriger ingaan op het ontvangen van MQTT-berichten met de Pretzel-kaart, natuurlijk compleet met een kleine demo-toepassing.
In dit deel hebben we alvast de uitgebreide software voor mijn kleine sensorkaart beschikbaar als download. Naast de verbeterde foutafhandeling heb ik de code wat opgeruimd en beter gegeneraliseerd. Zo zijn er nu bijvoorbeeld aparte functies voor de terugmeldingen met de RGB -LED en de blauwe LED op de kaart, wat porteren naar andere hardware gemakkelijker maakt. De code is voorzien van commentaar. Als u er dieper in wilt duiken, kunt u de Arduino-sketch uit de vorige aflevering nog eens downloaden en vergelijken met de nieuwe versie.
Er was ook een rudimentaire foutafhandeling: De ESP 8266 geeft bijvoorbeeld „ERROR“ terug, als het maken van de TCP /IP-verbinding niet lukt. Wat nog niet gebeurde was het evalueren van de via TCP /IP binnenkomende antwoorden van de server. Zo antwoordt de MQTT-server bijvoorbeeld op de Connect-aanvraag met de bytes „32 2 0 0“ als de poging om een verbinding te maken wordt geaccepteerd en we berichten mogen gaan publiceren.
Ik heb mijn kleine TCP /IP-bibliotheek uitgebreid met de functie
TCPClient_Receive(byte TCPBytesReceivedBuffer[])
die via de ESP 8266 vraagt, of er bytes van de server zijn ontvangen. Als dat het geval is, worden de bytes opgeslagen op het als parameter doorgegeven adres in het geheugen. In de functie
MQTTClient_Connect(String clientid)
van de MQTT-bibliotheek kan ik de ontvangen bytes daarna evalueren. Als het gelukt is, geeft de functie een 1 terug, anders een 0. In de aanroepende functie (die dus periodiek wordt doorlopen) gebruik ik de teruggegeven waarde om de rode LED te laten oplichten, als de poging om een verbinding te maken niet geaccepteerd is. En inderdaad is dat soms het geval.
Nu ik dus bytes van de server kon ontvangen en evalueren, wilde ik natuurlijk meer en programmeerde ik verder. Ik breidde de MQTT-bibliotheek uit met een functie, die een Subscribe-aanvraag kan doen om zich te abonneren. En natuurlijk controleerde ik ook in die functie het antwoord van de server. Het lukte me dan ook al snel om berichten van een andere MQTT-client op internet te ontvangen met het Pretzel-board. Om dat te doen, moeten we periodiek de nieuwe functie
MQTTClient_Get(byte MQTTBytesPayloadBuffer[])
aanroepen. Wat ik me tot nu toe niet gerealiseerd had: de broker geeft de door de zendende MQTT-client met de MQTT-Publish-commando’s uitgestuurde bytes gewoon 1:1 door aan alle clients, die zich op het topic hebben geabonneerd (inclusief topic, natuurlijk de eigenlijke data en ook de lengtebytes). In de volgende aflevering zal ik wat uitvoeriger ingaan op het ontvangen van MQTT-berichten met de Pretzel-kaart, natuurlijk compleet met een kleine demo-toepassing.
In dit deel hebben we alvast de uitgebreide software voor mijn kleine sensorkaart beschikbaar als download. Naast de verbeterde foutafhandeling heb ik de code wat opgeruimd en beter gegeneraliseerd. Zo zijn er nu bijvoorbeeld aparte functies voor de terugmeldingen met de RGB -LED en de blauwe LED op de kaart, wat porteren naar andere hardware gemakkelijker maakt. De code is voorzien van commentaar. Als u er dieper in wilt duiken, kunt u de Arduino-sketch uit de vorige aflevering nog eens downloaden en vergelijken met de nieuwe versie.
Read full article
Hide full article
Over Jens Nickel
Jens Nickel studeerde natuurkunde in Stuttgart. Al in zijn vroege jeugd, werd hij gefascineerd door het schrijven van technische artikelen; als liefhebber van technische en wetenschappelijke tijdschriften, greep hij de kans om van zijn hobby zijn beroep te met... >>
Discussie (0 opmerking(en))