Erste Versuche mit dem ESP8266-WLAN-Seriell-Funkmodul

Dieser Artikel beschreibt die grundlegenden AT-Kommandos des ESP8266 und wie damit eine Verbindung zu einem Access-Point bzw. WLAN-Router aufgebaut und darüber ein Server per TCP/IP kontaktiert werden kann.

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.

Der ESP8266 mit einem LiPo-Akku als Stromversorgung

Bild 1: Der ESP8266 mit einem LiPo-Akku als Stromversorgung

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
Einschaltvorgang und AP-Liste

Bild 2: Einschaltvorgang und AP-Liste

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 Externer Linkhttp://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...

Tags: WLan Wifi ESP8266 Serial to Wifi AT-Kommandos Module Adruino Wifi Shield