In het vorige deel van deze serie heb ik me eerst beziggehouden met het Pretzel-board, dat een ATmega328 en een WLAN-chip van het type ESP 8266 bevat. De Pretzel-kaart werd via USB aangesloten op mijn PC en met eenvoudige tekstcommando’s, die de ATmega328 gewoon doorgaf aan de ESP 8266, kon ik de WLAN-chip besturen vanuit een terminalprogramma op de PC. Zo was ik succesvol verbonden met het WLAN-netwerk in mijn huis en kon ik via TCP /IP tekens verzenden binnen mijn eigen intranet.

Nu gaan we verder met MQTT. Het was wat omslachtig om de benodigde commando’s met de hand samen te stellen en in het terminalprogramma in te voeren. Maar ik had toch voor het negende deel van de serie al een minimale bibliotheek voor de PC geschreven, waarmee ik tekenreeksen voor de MQTT-commando’s CONNECT en PUBLISH kon samenstellen en dan naar een MQTT-testbroker op het Internet kon sturen.

Als ik de routines
TCPClient_Connect(String IPAddressString, int Port)
voor het verbinden met een TCP -server op het web en
TCPClient_Send(Byte[] data, int length, Boolean Answer)
voor het zenden van data naar die server
nou gewoon zó kon aanpassen, dat het werk gedaan kon worden door de ESP 8266 in plaats van de ingebouwde netwerkinterfaces, dan zou ik de routines voor het samenstellen van de MQTT-commando’s gewoon 1:1 kunnen hergebruiken.

Het Pretzel-board zou dan een soort WLAN-dongle voor mijn PC worden. De firmware in de ATmega328 bleef tot nu toe beperkt tot doorgeven van alle tekens die via een virtuele COM-poort van de PC kwamen aan de ESP 8266 en omgekeerd. De C#-routines die nodig waren voor het zenden via de seriële interface had ik ook al klaarliggen. Ik had nog wel een thread nodig voor het voortdurend inlezen van ontvangen tekens om de reactie van de ESP 8266 te kunnen weergeven in het PC-programma. De code kon ik grotendeels overnemen uit de officiële C#/.NET-documentatie.
Daarna voorzag ik mijn PC-programma van een aantal schakelvlakjes om verschillende acties te starten: één keer voor het resetten van de ESP 8266 en één voor het verbinden met mijn WLAN-netwerk. Om het geheel in de gaten te houden, maakte ik ook een groot tekstveld, waarin de terugmeldingen van de ESP 8266 naar de PC kunnen worden weergegeven.
 
Het resultaat van die inspanningen is te zien in het screenshot. Bij mijn „MQTT-minimum cliënt met ESP 8266“ moeten we in de dropdown-box rechtsboven eerst de COM-poort kiezen, die de Pretzel-kaart gebruikt voor de verbinding met de PC. Daarna moeten we de WLAN-chip resetten via het schakelvlakje eronder. Voer dan de SSID en het wachtwoord voor uw eigen WLAN-netwerk in in de tekstvelden en druk op het schakelvlakje „WiFi Connect“. Het AT-commando en het iets vertraagde antwoord van de WLAN-chip (als het gelukt is, moet dat gewoon „OK“ zijn) verschijnen dan in het grote tekstvenster.

Als tot zover alles is gelukt, dan kunnen we met de button daaronder verbinding maken met de TCP -server op het Internet, die werkt als MQTT-broker (in mijn geval HiveMQ-Broker). Als we nu een „CONNECT“, gevolgd door „OK“ zien, is er een TCP /IP-verbinding tot stand gebracht.

Nu kunnen we beginnen met MQTT. Als we op het schakelvlakje „MQTT Connect“ drukken stelt de minimale bibliotheek het juiste MQTT-commando samen en stuurt het via TCP /IP naar de testbroker. Alles werkt hier net zoals beschreven in deel 9, maar ditmaal verzorgt de ESP 8266 de netwerkcommunicatie. De overeenkomst tussen de programma’s is ook te zien in de broncode, die onderaan deze pagina is te downloaden. Vergelijk die maar eens met de broncode van het programma uit deel 9.

Voer een topic en een tekst in om berichten naar de MQTT-testbroker te verzenden. Deze kunnen met een MQTT-client overal ter wereld worden weergegeven. Overigens mogen we, noch bij de HiveMQ-broker noch bij de eerder in deze serie gebruikte Mosquitto-testbroker, de tekens CrLf die de ESP 8266 standaard achter alle TCP /IP-berichten hangt meezenden. Als we dat doen, beëindigt de testbroker de TCP -verbinding. We moeten dus als aantal tekens in het commando AT+CIPSEND de exacte lengte van de MQTT-string meegeven.

Na ongeveer twee minuten sluit de ESP 8266 trouwens de TCP /IP-verbinding, als er niets meer verstuurd wordt („CLOSED“). Daarna moet we opnieuw een verbinding opbouwen. We zouden dat kunnen voorkomen, door in het PC-programma een timer in te bouwen, die elke minuut een nieuw MQTT-bericht verstuurt. Zoiets zou bijvoorbeeld nuttig kunnen zijn bij een temperatuursensor, die meetwaarden publiceert via MQTT. Meer daarover in één van de volgende delen van de serie!