Die NanoESP Library

Originalartikel

Backup

<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&#228;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 &#220;bermitteln von Webseiten erleichtern oder die Verwendung des beliebten MQTT(<a href=„http://mqtt.org/“>http://mqtt.org/</a>) IoT-Protokolls erm&#246;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:&#160;<a href=„https://github.com/FKainka/NanoESP“>https://github.com/FKainka/NanoESP</a></p><p>Unter den Beispielen befindet sich au&#223;erdem ein Programm, welches Blynk-Projekte (<a href=„http://www.blynk.cc/“>http://www.blynk.cc/</a>) erm&#246;glicht. Damit Sie das Programm verwenden k&#246;nnen, ben&#246;tigen Sie eine zus&#228;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&#246;chte ich die einzelnen Funktionen und Methoden etwas detaillierter erl&#228;utern sowie auf etwaige Neuerungen eingehen. Die Basis der Library bildet die SoftwareSerial-Library, die bereits in Arduino integriert ist. Aufgrund dessen k&#246;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>&#160;&#8211;&#160;<a href=„http://iot.fkainka.de/library#_Toc462047617“>Datentyp mqtt_msg.<br/></a>&#160;&#8211;&#160;<a href=„http://iot.fkainka.de/library#_Toc462047618“>Abonnieren mit Funktions-Verkn&#252;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&#228;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 &#252;ber den Seriellen Monitor ausgegeben</td></tr><tr><td width=„295“>&#160;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&#228;tzlich wird &#252;berpr&#252;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&#252;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&#228;tzliche Parameter: WLAN-Kanal, Verschl&#252;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“>&#220;berpr&#252;ft, ob automatisch eine WLAN-Verbindung zu einer Station hergestellt wurde (Zeitersparnis gegen&#252;ber neue Verbindung bei bekannter Station)</td></tr><tr><td width=„295“>bool <strong>getIpMac</strong>(String &amp;ip, String &amp;mac);</td><td width=„492“>Liefert IP und MAC-Adresse des Boards. Parameter werden als Referenz &#252;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“>&#214;ffnet eine UDP-Verbindung<p>Der Empfangs-Port kann ein anderer sein als der Sende-Port. Modus 0: Die Ziel IP &#228;ndert sich nicht; Modus 1: die Ziel IP &#228;ndert sich einmal, wenn das Board eine Nachricht von einer anderen IP erh&#228;lt; Modus 2: Das Board &#228;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 &#252;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&#223;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&#228;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 &amp;id,int &amp;len);</td><td width=„492“>Wird true, wenn Daten empfangen wurden. ID und L&#228;nge werden per Referenz zur&#252;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&#252;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&#228;uterung</u></strong></td></tr><tr><td width=„258“>bool <strong>recvRequest</strong>(int &amp;id, String &amp;method, String &amp;ressource, String &amp;parameter);</td><td width=„533“>Gibt true zur&#252;ck, wenn ein http-Request empfangen wurde. ID, Methode (POST oder GET) sowie angeforderte URL und etwaige Befehle werden per Referenz zur&#252;ckgegeben.</td></tr><tr><td width=„258“>bool <strong>recvHTTP</strong>(int id, int len, String &amp;method, String &amp;ressource, String &amp;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&#246;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&#228;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&#228;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&#252;r Broker mit Benutzerverwaltung</p></td></tr><tr><td width=„330“>bool <strong>connect</strong><em><u>([s.o]</u></em>,&#160; 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&#223;t dem Topic eine Funktion zu, die aufgerufen wird, wenn eine Nachricht unter dem Topic empfangen wird (s.u. f&#252;r weitere Erkl&#228;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&#246;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&#246;ffentlicht Nachricht unter dem angeben Topic<p>Zus&#228;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&#246;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 &amp;topic, String &amp;value);</td><td width=„461“>Gibt True zur&#252;ck wenn eine MQTT-Nachricht empfangen wurde. Topic und Nachricht per Referenz</td></tr><tr><td width=„330“>bool <strong>recvMQTT</strong>(int &amp;id, String &amp;topic, String &amp;value) ;</td><td width=„461“>Gibt True zur&#252;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&#228;lt die Verbindung zum Broker aktiv, indem in regelm&#228;&#223;igen Abst&#228;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, &#252;ber die eine MQTT-Nachricht definiert werden kann.</p><p><em>&#160; typedef struct{</em></p><p><em>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String topic;</em></p><p><em>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String value;</em></p><p><em>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte qos;</em></p><p><em>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bool retain;</em></p><p><em>&#160; } mqtt_msg;</em></p><p><strong><u>Beispiel:</u></strong></p><p><em>mqtt_msg msgMode = {&#8222;NanoESP/test/rgb/mode&#8220;,&#8220;1&#8220;, 0, true};&#160; </em></p><p>Es k&#246;nnen auch einzelne Werte der Nachricht ver&#228;ndert werden:</p><p><em>msgMode.value = &#8222;0&#8220;;</em></p><h2><a name=„_Toc462047618“/>Abonnieren mit Funktions-Verkn&#252;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&#228;lt. Es k&#246;nnen maximal 5 dieser Funktions-Verkn&#252;pfungen definiert werden.</p><p><strong><u>Beispiel:</u></strong></p><p>mqtt.subscribe(0, &#8222;test/song&#8220;, 2, gotnewSong)</p><p>void gotnewSong(String value) {</p><p>Serial.println(&#8222;New Song: &#8220; + 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>