Erste Versuche mit dem ESP8266-WLAN-Seriell-Funkmodul
Der ESP8266 von Espressif ist ein kleines und günstiges WLAN-Modul mit serieller Schnittstelle. Dieses Modul kann sich mit einem Access-Point oder Router verbinden. Darüber können dann TCP/IP-Verbindungen im lokalen Netzwerk oder das Internet hergestellt werden. Die Kommunikation erfolgt über einfache AT-Kommandos. Auf der eBucht bekommt man die Module derzeit (Stand 9'2014) für 3-5 EUR per Direkt-Versand aus China. Der Versand dauert meist etwa 3-4 Wochen.
Aufbau
Der ESP8266 wurde mit einem FTDI FT232-Seriell-USB-Wandler verbunden (TXD auf RXD und umgekehrt). Dabei ist zu beachten, dass die Eingänge des ESPs nicht 5V-tolerant sind. Die Stromversorgung sollte stabile 3.3V liefern. CH_PD wurde mit VDD verbunden.
Initialisierung
Nach dem Einschalten meldet sich der ESP8266 mit wirren Zeichen und einem "ready". Die Baudrate ist 115200 Baud, 8N1 (bei älteren Firmware-Vesionen 57600 Baud).
[wirre Zeichen]
ready
Auf ein AT-Kommando (alle Befehle müssen am Ende mit <CR> abgeschlossen werden) sollte der ESP8266 nun mit einem OK antworten:
AT
OK
Zunächst sollte der ESP zurück gesetzt werden:
AT+RST
OK
ets Jan 8 2013,rst cause:4, boot mode:(3,7)
wdt reset
load 0x40100000, len 24236, room 16
tail 12
chksum 0xb7
ho 0 tail 12 room 4
load 0x3ffe8000, len 3008, room 12
tail 4
chksum 0x2c
load 0x3ffe8bc0, len 4816, room 4
tail 12
chksum 0x46
csum 0x46
ready
Die Firmwareversion lässt sich wie folgt abfragen. 0015 steht dabei für die SDK-Version, 0900 ist die Version der Firmware.
AT+GMR
00150900
OK
Einige Parameter können mit ? abgefragt werden. Bei nicht vorhandenen Kommando beweisen die Entwickler Humor:
AT?
no this fun
Verbinden mit einen Access-Point / WLan-Router
AT+CWMODE=3
OK
Der aktuelle Modus kann auch abgefragt werden:
AT+CWMODE?
+CWMODE:1
Nun kann eine Liste der verfügbaren Acceess-Points (Router) abgerufen werden. Zurück gegeben wird jeweils der Kanal die Art der Verschlüsselung, die SSID und die Signalstärke in dB. Bis der ESP antwortet, kann schon mal eine Sekunde vergehen.
AT+CWLAP
+CWLAP:(0,"",0)
+CWLAP:(3,"TP-LINK_XXXX",-80)
+CWLAP:(3,"FRITZ!Box 7362 SL",-66)
+CWLAP:(4,"homeinternet",-81)
+CWLAP:(4,"wait for it",-91)
+CWLAP:(4,"EasyBox-akalees",-84)
+CWLAP:(4,"FRITZ!Box Fon WLAN 7170",-76)
+CWLAP:(3,"UPC24059XXXX",-88)
+CWLAP:(4,"Nibbler",-44)
+CWLAP:(3,"Speed",-78)
+CWLAP:(3,"UPC24259XXXX",-84)
+CWLAP:(3,"UPC24625XXXX",-89)
OK
Wir möchten uns mit dem WLAN-Router "Nibbler" und dem Passwort "OpenSesame" verbinden:
AT+CWJAP="Nibbler","OpenSesame"
OK
Der aktuelle Access-Point lässt sich auch abfragen:
AT+CWJAP?
+CWJAP:"Nibbler"
OK
Bei erfolgreichem Verbindungsaufbau lässt sich auch die vom AP per DHCP zugewiesene IP abfragen:
AT+CIFSR
192.168.168.105
OK
In der DHCP-Liste des Routers ist nun auch der ESP gelistet:
MAC Address IP Address Expires On
18:FE:34:XX:XX:XX 192.168.168.105 2014-10-07 20:37:04
Der ESP kann unter seiner IP per ICMP angepingt werden:
> ping 192.168.168.105
PING 192.168.168.105 (192.168.168.105) 56(84) bytes of data.
64 bytes from 192.168.168.105: icmp_req=1 ttl=255 time=6.57 ms
64 bytes from 192.168.168.105: icmp_req=2 ttl=255 time=3.40 ms
64 bytes from 192.168.168.105: icmp_req=3 ttl=255 time=3.42 ms
64 bytes from 192.168.168.105: icmp_req=4 ttl=255 time=7.50 ms
64 bytes from 192.168.168.105: icmp_req=5 ttl=255 time=6.90 ms
64 bytes from 192.168.168.105: icmp_req=6 ttl=255 time=7.78 ms
64 bytes from 192.168.168.105: icmp_req=7 ttl=255 time=7.78 ms
Der ESP8266 als Access Point
Das Modul kann auch ohne zusätzlichen Router als eigenständiger Access-Point arbeiten. Das Module ist dann für WLAN-fähige Endgeräte oder andere ESP8266-Module sichtbar. Wir möchten das Modul als AP mit der SSID "ESP4711" und dem Passwort "12345678" konfigurieren. Das Passwort muss eine Mindestlänge von 8 Zeichen haben.
AT+CWSAP="ESP4711","1234567",7,3
pwd ERROR
AT+CWSAP="ESP4711","12345678",7,3
OK
AT+CWSAP?
+CWSAP:"ESP4711","12345678",13,3
OK
TCP-Server
AT+CIPMUX=1
OK
AT+CIPMUX?
+CIPMUX:1
OK
AT+CIPSERVER=1,1314
OK
Aufruf im Browser: http://192.168.168.105:1314/
Link
+IPD,0,303:GET / HTTP/1.1
Host: 192.168.168.105:1314
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
OK
AT+CIPCLOSE=0
OK
Unlink
Einfache TCP-Verbindung aufbauen
Im folgenden wird mit dem WLAN-Modul eine Verbindung zu einem Server (IP=192.168.168.81) aufgebaut. Dazu wurde auf einem Linux-Rechner mit Netcat ein TCP-Socket auf Port 1313 geöffnet:
user@linux:~$ nc -v -l 192.168.168.81 1313
Mit dem Modul wird nun eine TCP-Verbindung zu dem Server aufgebaut. Mit dem zweiten Parameter von CIPSEND muss angegeben werden, wieviele Bytes gesendet werde sollen. In diesem Fall 5 Bytes: "Hello!"
AT+CIPSTART=4,"TCP","192.168.168.81",1313
OK
Linked
AT+CIPSEND=4,6
> Hello!
Auf der Serverseite sieht man nun den Verbindungsaufbau und die Testdaten:
yip@yip:~$ nc -v -l 192.168.168.81 1313
Connection from 192.168.168.105 port 1313 [tcp/xtel] accepted
Hello!
UDP-Verbindung aufbauen
Analog zu einer TCP/IP-Verbindung lassen sich auch UDP-Pakete versenden:
AT+CIPSTART=3,"UDP","192.168.168.81",1314
OK
AT+CIPSEND=3,6
> 123456
Auf der Serverseite wird wieder Netcat verwendet um die UDP-Pakete anzuzeigen:
user@linux:~$ nc -v -l -u 192.168.168.81 1314
Connection from 192.168.168.105 port 1314 [udp/*] accepted
123456
Leider hängt sich der ESP8266 jedes mal auf und antwortet mit einem Reset wenn ein UDP-Paket empfangen wird:
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x40100000, len 24236, room 16
tail 12
chksum 0xb7
ho 0 tail 12 room 4
load 0x3ffe8000, len 3008, room 12
tail 4
chksum 0x2c
load 0x3ffe8bc0, len 4816, room 4
tail 12
chksum 0x46
csum 0x46
Das aktuelle Wetter von einem Webserver im Internet abfragen
Hier noch ein komplexeres Beispiel, bei dem das aktuelle Wetter über das Internet per HTTP-GET Request von openweathermap.org abgefragt wird:
AT+CIPSTART=3,"TCP","api.weathermap.org",80
OK
Linked
AT+CIPSTATUS
STATUS:3
+CIPSTATUS:2,"TCP","188.226.224.148",80,0
OK
AT+CIPSEND=3,76
> GET /data/2.5/weather?q=Dortmund HTTP/1.0
Host: api.openweathermap.org
SEND OK
+IPD,3,536:HTTP/1.1 200 OK
Server: nginx
Date: Wed, 01 Oct 2014 19:51:22 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 433
Connection: close
X-Source: redis
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST
{"coord":{"lon":7.45,"lat":51.52},"sys":{"type":1,"id":4912,"message":0.0304,"country":"DE","sunrise":1412746992,"sunset":1412787122},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"cmc stations","main":{"tem
OK
+IPD,3,185:p":288.83,"pressure":1003,"humidity":77,"temp_min":287.77,"temp_max":289.85},"wind":{"speed":6.7,"deg":190},"clouds":{"all":0},"dt":1412796719,"id":2935517,"name":"Dortmund","cod":200}
OK
Unlink
Der Server von openweathermap liefert unter http://api.openweathermap.org/data/2.5/weather?q=Dortmund das aktuelle Wetter von Dortmund im JSON-Format. Die Antwort wurde hier in zwei +IPD-Antworten mit 536 und 185 Bytes geteilt. In der Antwort im Beispiel ist mit "temp":288.83 die aktuelle Temperatur in Kelvin zu finden. 288.83-273.15=15.68°C. Passt! :)
to be continued...