<html> <div class=„entry-content“><div class=„entry-content-inner“><div class=„content-headline“><h1 class=„entry-headline“>Die neue NanoESP-Library mit MQTT, HTTP und Blynk-Support</h1></div><p class=„post-meta“> Autor: <a href=„http://iot.fkainka.de/author/fk“ title=„Beiträge von fk“ rel=„author“>fk</a> Montag, der 19. September 2016 <a href=„http://iot.fkainka.de/library#comments“>26 Kommentare</a></p><div class=„post-info“><p class=„post-category“><a href=„http://iot.fkainka.de/category/board“ rel=„category tag“>Board</a>, <a href=„http://iot.fkainka.de/category/calendar-2016“ rel=„category tag“>Calendar 2016</a>, <a href=„http://iot.fkainka.de/category/calendar-2016/days-16“ rel=„category tag“>Days-16</a>, <a href=„http://iot.fkainka.de/category/board/support“ rel=„category tag“>Support</a></p><p class=„post-tags“><a href=„http://iot.fkainka.de/tag/library“ rel=„tag“>Library</a></p></div><p>Im Kontext des neues IoT Adventskalenders 2016 wurde die Library zum NanoESP um einige Funktionen erweitert. Neben den klassischen Befehlen zum Steuern des Moduls, gibt es in dieser Version auch zwei Sub-Libraries, die das Übermitteln von Webseiten erleichtern oder die Verwendung des beliebten MQTT(<a href=„http://mqtt.org/“>http://mqtt.org/</a>) IoT-Protokolls ermöglichen.</p><h1><a href=„https://github.com/FKainka/NanoESP/archive/v1.1.zip“><img class=„wp-image-499 alignleft“ src=„http://iot.fkainka.de/wp-content/uploads/2015/09/download-151556_640.png“ alt=„download-151556_640“ width=„40“ height=„48“ srcset=„http://iot.fkainka.de/wp-content/uploads/2015/09/download-151556_640.png 536w, http://iot.fkainka.de/wp-content/uploads/2015/09/download-151556_640-251x300.png 251w“ sizes=„(max-width: 40px) 100vw, 40px“/></a></h1><h1><a href=„https://github.com/FKainka/NanoESP/archive/v1.1.zip“>Download</a></h1><p>Link auf Github: <a href=„https://github.com/FKainka/NanoESP“>https://github.com/FKainka/NanoESP</a></p><p>Unter den Beispielen befindet sich außerdem ein Programm, welches Blynk-Projekte (<a href=„http://www.blynk.cc/“>http://www.blynk.cc/</a>) ermöglicht. Damit Sie das Programm verwenden können, benötigen Sie eine zusätzliche Library:</p><p><a href=„https://github.com/blynkkk/blynk-library/releases/tag/v0.3.4“>https://github.com/blynkkk/blynk-library/releases/tag/v0.3.4</a></p><p>Auf dieser Seite möchte ich die einzelnen Funktionen und Methoden etwas detaillierter erläutern sowie auf etwaige Neuerungen eingehen. Die Basis der Library bildet die SoftwareSerial-Library, die bereits in Arduino integriert ist. Aufgrund dessen können Befehle wie find() und findUntil() auch mit dieser Library genutzt werden.</p><h2>Inhalt</h2><p><a href=„http://iot.fkainka.de/library#_Toc462047614“>Basics (NanoESP)<br/></a><a href=„http://iot.fkainka.de/library#_Toc462047615“>Webserver (NanoESP_HTTP)<br/></a><a href=„http://iot.fkainka.de/library#_Toc462047616“>MQTT (NanoESP_MQTT)<br/></a> – <a href=„http://iot.fkainka.de/library#_Toc462047617“>Datentyp mqtt_msg.<br/></a> – <a href=„http://iot.fkainka.de/library#_Toc462047618“>Abonnieren mit Funktions-Verknüpfung:</a></p><h1><a name=„_Toc462047614“/>Basics (NanoESP)</h1><table width=„787“><tbody><tr><td width=„295“><strong><u>Funktion</u></strong></td><td width=„492“><strong><u>Erläuterung</u></strong></td></tr><tr><td width=„295“>boolean <strong>init</strong>(boolean vDebug=false);</td><td width=„492“>Initialisiert das Board und stellt default Werte ein (Transfermode = 0, Multiple Connections = 1)<br/> Wenn der Debug-Parameter true ist, wird bei einem fehlerhaften Befehl Zusatzinformationen über den Seriellen Monitor ausgegeben</td></tr><tr><td width=„295“> String <strong>sendCom</strong>(String command);</td><td width=„492“>Sendet ein AT-Kommando an das ESP-Modul</td></tr><tr><td width=„295“>boolean <strong>sendCom</strong>(String command, char respond[]);</td><td width=„492“>s.o.; Zusätzlich wird überprüft, ob das Modul eine Antwort sendet, die dem Respond-Parameter entspricht.</td></tr><tr><td width=„295“>boolean <strong>setMultipleConnections</strong>();</td><td width=„492“>Erlaubt Mehrfachverbindungen (<em>AT+CIPMUX=1</em>)</td></tr><tr><td width=„295“>boolean <strong>setTransferMode</strong>() ;</td><td width=„492“>Setzt den Transfermodus auf transparent (<em>AT+CIPMODE=0</em>)</td></tr><tr><td width=„295“>boolean <strong>reset</strong>();</td><td width=„492“>Resetet das Board und wartet, bis es wieder bereit ist</td></tr><tr><td width=„295“/><td width=„492“/></tr><tr><td width=„295“>boolean <strong>configWifiMode</strong>(int modus);</td><td width=„492“>Stellt den WLAN Modus ein (<em>STATION, ACCESSPOINT, DUAL</em>)</td></tr><tr><td width=„295“>boolean <strong>configWifi</strong>(int modus, String ssid, String password);</td><td width=„492“>Stellt das WLAN ein mit Modus, SSID und Password</td></tr><tr><td width=„295“>boolean <strong>configWifiStation</strong>(String ssid, String password);</td><td width=„492“>Stellt eine Verbindung zu einem WLAN-Router her</td></tr><tr><td width=„295“>boolean <strong>configWifiAP</strong>(String ssid, String password);</td><td width=„492“>Stellt einen eignen AccesPoint zur Verfügung (Password darf leer sein, sonst min sechs Zeichen)</td></tr><tr><td width=„295“>boolean <strong>configWifiAP</strong>(String ssid, String password, int channel, int crypt);</td><td width=„492“>S.o.<p>Zusätzliche Parameter: WLAN-Kanal, Verschlüsselungsmodus</p></td></tr><tr><td width=„295“>boolean <strong>disconnectWifi</strong>();</td><td width=„492“>Trennt die WLAN-Verbindung</td></tr><tr><td width=„295“/><td width=„492“/></tr><tr><td width=„295“>bool <strong>wifiConnected</strong>();</td><td width=„492“>Überprüft, ob automatisch eine WLAN-Verbindung zu einer Station hergestellt wurde (Zeitersparnis gegenüber neue Verbindung bei bekannter Station)</td></tr><tr><td width=„295“>bool <strong>getIpMac</strong>(String &ip, String &mac);</td><td width=„492“>Liefert IP und MAC-Adresse des Boards. Parameter werden als Referenz übergeben</td></tr><tr><td width=„295“>String <strong>getIp</strong>();</td><td width=„492“>Ermittelt die IP/IPs des Boards (<em>AT+CIFSR</em>)</td></tr><tr><td width=„295“>boolean <strong>newConnection</strong>(int id, String type, String ip , unsigned int port);</td><td width=„492“>Baut eine neue Verbindung (TCP oder UDP) auf.<p>Parameter: Verbindungs-ID (0-4), Typ (TCP/UDP), IP (Ziel IP oder Adresse), Port</p></td></tr><tr><td width=„295“>boolean <strong>closeConnection</strong>(int id) ;</td><td width=„492“>Trennt die Verbindung mit der angegebenen Verbindungs-ID</td></tr><tr><td width=„295“>boolean <strong>startUdpServer</strong>(int id, String ip , unsigned int port, unsigned int recvport, int mode=0);</td><td width=„492“>Öffnet eine UDP-Verbindung<p>Der Empfangs-Port kann ein anderer sein als der Sende-Port. Modus 0: Die Ziel IP ändert sich nicht; Modus 1: die Ziel IP ändert sich einmal, wenn das Board eine Nachricht von einer anderen IP erhält; Modus 2: Das Board ändert die Ziel IP immer, wenn es eine neue Nachricht von einer anderen IP erhalten hat.</p></td></tr><tr><td width=„295“>boolean <strong>endUdpServer</strong>(int id);</td><td width=„492“>Beendet die UDP-Verbindung mit der angegeben ID</td></tr><tr><td width=„295“>boolean <strong>startTcpServer</strong>(unsigned int port) ;</td><td width=„492“>Startet einen TCP-Server unter dem angegeben Port. Es kann nur ein TCP-Server aktiviert sein</td></tr><tr><td width=„295“>boolean <strong>endTcpServer</strong>();</td><td width=„492“>Beendet den TCP-Server</td></tr><tr><td width=„295“>boolean <strong>sendData</strong>(int id, String msg);</td><td width=„492“>Sendet Text über die angegebene Verbindung</td></tr><tr><td width=„295“>boolean <strong>sendDataClose</strong>(int id, String msg);</td><td width=„492“>Sendet Text und schließt danach die Verbindung</td></tr><tr><td width=„295“>bool <strong>sendRaw</strong>(int id, unsigned char data[], int LenChar);</td><td width=„492“>Sendet binäre Daten (kein String)</td></tr><tr><td width=„295“>int <strong>getId</strong>();</td><td width=„492“>Gibt die Verbindungs-ID bei Datenempfang an. Wenn keine Daten empfangen wurden ist der Wert -1</td></tr><tr><td width=„295“>bool <strong>recvData</strong>(int &id,int &len);</td><td width=„492“>Wird true, wenn Daten empfangen wurden. ID und Länge werden per Referenz zurückgegeben</td></tr><tr><td width=„295“>int <strong>ping</strong>(String adress);</td><td width=„492“>Pingt den Server unter der angegebenen Adresse an. Die Antwort-Zeit in ms wird zurückgegeben. Ist die Zeit 0 wurde keine Antwort empfangen.</td></tr><tr><td width=„295“/><td width=„492“/></tr><tr><td width=„295“>void <strong>serialDebug</strong>();</td><td width=„492“>Stellt eine direkte Verbindung zwischen Software und Hardware Serieller Schnittstelle her. Kann zum Testen von AT-Kommandos verwendet werden.</td></tr></tbody></table><h1><a name=„_Toc462047615“/>Webserver (NanoESP_HTTP)</h1><table width=„791“><tbody><tr><td width=„258“><strong><u>Funktion</u></strong></td><td width=„533“><strong><u>Erläuterung</u></strong></td></tr><tr><td width=„258“>bool <strong>recvRequest</strong>(int &id, String &method, String &ressource, String &parameter);</td><td width=„533“>Gibt true zurück, wenn ein http-Request empfangen wurde. ID, Methode (POST oder GET) sowie angeforderte URL und etwaige Befehle werden per Referenz zurückgegeben.</td></tr><tr><td width=„258“>bool <strong>recvHTTP</strong>(int id, int len, String &method, String &ressource, String &parameter);</td><td width=„533“>s.o.</td></tr><tr><td width=„258“>bool <strong>sendFromFlash</strong>(int client, const char *website, int len);</td><td width=„533“>Sendet eine als Progmem-Variable gespeicherte Webseite direkt an den angeben Client (Verbindungs-ID)</td></tr><tr><td width=„258“>bool <strong>sendStreamHeader</strong>(int connectionId);</td><td width=„533“>Sendet die Antwort auf einen Event-Stream-Request. Server-Send-Events können zum schnellen Datenaustausch vom Server zum Client genutzt werden (http://www.html5rocks.com/en/tutorials/eventsource/basics/)</td></tr><tr><td width=„258“>bool <strong>sendRequest</strong>(int id, char method[5], String address);</td><td width=„533“>Sendet einen http-Request an einen Server<br/> (ID, Methode (GET/POST), URL)</td></tr><tr><td width=„258“>bool <strong>sendRequest</strong>(int id, char method[5], String address, String parameter);</td><td width=„533“>Sendet einen http-Request an einen Server inklusive Sub-Parameter</td></tr></tbody></table><h1><a name=„_Toc462047616“/>MQTT (NanoESP_MQTT)</h1><table width=„791“><tbody><tr><td width=„330“><strong><u>Funktion</u></strong></td><td width=„461“><strong><u>Erläuterung</u></strong></td></tr><tr><td width=„330“>bool <strong>connect</strong>(int id, String brooker, unsigned int port, String deviceId);</td><td width=„461“>Baut eine Verbindung zu einem MQTT-Server auf. Minimale Parameter: Verbindungs-ID, Broker-Adresse und Geräte-ID (darf nur einmal auf dem Broker vorhanden sein)<p>(Defaultwerte: Clean Session = true, keepAliveTime = 120s)</p></td></tr><tr><td width=„330“>bool <strong>connect</strong>( <em>[<u>s.o]</u></em>, mqtt_msg * lastWill);</td><td width=„461“>Erweitere Parameter der Connect-Funktion:<p>Parameter: lastWill-Nachricht</p></td></tr><tr><td width=„330“>bool <strong>connect</strong>( <em><u>[s.o]</u></em> , bool cleanSession, byte keepAliveTime);</td><td width=„461“>Erweitere Parameter der Connect-Funktion:<p>Parameter: cleanSession, keepAliveTime</p></td></tr><tr><td width=„330“>bool <strong>connect</strong>( <em><u>[s.o]</u></em> , bool cleanSession, byte keepAliveTime, mqtt_msg * lastWill);</td><td width=„461“>Erweitere Parameter der Connect-Funktion:<p>Parameter: cleanSession, keepAliveTime, lastWill-Nachricht</p></td></tr><tr><td width=„330“>bool <strong>connect</strong>(<em><u>[s.o]</u></em>, String userName , String password);</td><td width=„461“>Erweitere Parameter der Connect-Funktion:<p>Parameter: Nutzername und Passwort für Broker mit Benutzerverwaltung</p></td></tr><tr><td width=„330“>bool <strong>connect</strong><em><u>([s.o]</u></em>,  bool cleanSession, byte keepAliveTime, mqtt_msg * lastWill , String userName , String password);</td><td width=„461“>Erweitere Parameter der Connect-Funktion</td></tr><tr><td width=„330“>bool <strong>disconnect</strong>(int id);</td><td width=„461“>Trennt Verbindung zum MQTT-Broker</td></tr><tr><td width=„330“>bool <strong>subscribe</strong>(int id, String topic) ;</td><td width=„461“>Abonniert ein Topic</td></tr><tr><td width=„330“>bool <strong>subscribe</strong>(int id, String topic, byte qos);</td><td width=„461“>Abonniert ein Topic mit Qos</td></tr><tr><td width=„330“>bool <strong>subscribe</strong>(int id, String topic, byte qos, void (*g)(String value));</td><td width=„461“>Abonniert ein Topic und weißt dem Topic eine Funktion zu, die aufgerufen wird, wenn eine Nachricht unter dem Topic empfangen wird (s.u. für weitere Erklärungen)</td></tr><tr><td width=„330“>bool <strong>unsubscribe</strong>(int id, String topic) ;</td><td width=„461“>Deabonniert ein Topic</td></tr><tr><td width=„330“>bool <strong>publish</strong>(int id, String topic, String value);</td><td width=„461“>Veröffentlicht Nachricht unter dem angeben Topic</td></tr><tr><td width=„330“>bool <strong>publish</strong>(int id, String topic, String value, byte qos, bool retain);</td><td width=„461“>Veröffentlicht Nachricht unter dem angeben Topic<p>Zusätzliche Parameter: Quality of Service, Retain</p></td></tr><tr><td width=„330“>bool <strong>publish</strong>(int id, mqtt_msg *msg);</td><td width=„461“>Veröffentlicht Nachricht unter dem angeben Topic (Datentyp mqtt_msg s.u.)</td></tr><tr><td width=„330“>bool <strong>recvMQTT</strong>(int id, int len, String &topic, String &value);</td><td width=„461“>Gibt True zurück wenn eine MQTT-Nachricht empfangen wurde. Topic und Nachricht per Referenz</td></tr><tr><td width=„330“>bool <strong>recvMQTT</strong>(int &id, String &topic, String &value) ;</td><td width=„461“>Gibt True zurück wenn eine MQTT-Nachricht empfangen wurde. ID, Topic und Nachricht per Referenz</td></tr><tr><td width=„330“>void <strong>stayConnected</strong>(int id);</td><td width=„461“>Hält die Verbindung zum Broker aktiv, indem in regelmäßigen Abständen (i.d.R. StayConnected-Zeit/2) ein Ping gesendet wird</td></tr><tr><td width=„330“>bool <strong>ping</strong>(int id);</td><td width=„461“>Pingt den MQTT-Broker an (damit Verbindung bestehen bleibt)</td></tr></tbody></table><h2><a name=„_Toc462047617“/>Datentyp mqtt_msg</h2><p>Mqtt_msg ist eine Struktur, über die eine MQTT-Nachricht definiert werden kann.</p><p><em>  typedef struct{</em></p><p><em>               String topic;</em></p><p><em>               String value;</em></p><p><em>               byte qos;</em></p><p><em>               bool retain;</em></p><p><em>  } mqtt_msg;</em></p><p><strong><u>Beispiel:</u></strong></p><p><em>mqtt_msg msgMode = {„NanoESP/test/rgb/mode“,“1“, 0, true};  </em></p><p>Es können auch einzelne Werte der Nachricht verändert werden:</p><p><em>msgMode.value = „0“;</em></p><h2><a name=„_Toc462047618“/>Abonnieren mit Funktions-Verknüpfung:</h2><p>In dem Befehl</p><p>bool <strong>subscribe</strong>(int id, String topic, byte qos, void (*g)(String value));</p><p>kann als letzter Parameter eine Funktion angeben werden, die dann aufgerufen wird, wenn zu diesem Topic eine Nachricht empfangen wurde (Wildcards erlaubt). Die Funktion muss einen Parameter vom Typ String haben, der die Nachricht des Topics enthält. Es können maximal 5 dieser Funktions-Verknüpfungen definiert werden.</p><p><strong><u>Beispiel:</u></strong></p><p>mqtt.subscribe(0, „test/song“, 2, gotnewSong)</p><p>void gotnewSong(String value) {</p><p>Serial.println(„New Song: “ + value);</p><p>}</p><div class=„social-share“> <like href=„http://iot.fkainka.de/library“ send=„true“ layout=„button_count“ width=„200“ show_faces=„true“/><a href=„http://twitter.com/share“ class=„twitter-share-button“ data-url=„http://iot.fkainka.de/library“>Tweet</a> <plusone size=„medium“ href=„http://iot.fkainka.de/library“/></div></div></div><div class=„entry-content“><div class=„entry-content-inner“/></div> </html>