Webserver¶
Sommige apparaten beschikken over een webserver waarmee je dit apparaat via het internet kunt bewaken en besturen. Voorbeelden hiervan zijn netwerkprinters en netwerkrouters. In de opdrachten gebruiken we een IoT-knoop met een webserver. Via een browser lezen we de sensorwaarden van de knoop en besturen we de LEDs op deze knoop.
We beschrijven eerst de webserver-software en de hardware van de IoT-knoop. We gebruiken hierbij de ESP8266-hardware zoals beschreven in XXX. Daarna bespreken we de voor- en nadelen van deze aanpak.
ESP8266 webserver-software¶
Met het programma sensor-webserver-0
kun je de sensorwaarden (temperatuur, luchtdruk, lichtniveau, en soms luchtvochtigheid) uitlezen.
Je kunt hiermee ook de beide LEDs aan- en uitzetten.
Dit programma is te vinden op GitHub: https://github.com/eelcodijkstra/iot2018
Adressering¶
Bij het gebruik heb je de nodeid
van de IoT-knoop nodig.
Deze staat op de knoop; voor de ESP8266-bordjes is deze afgeleid van het WiFi-MAC-adres.
Deze nodeid bestaat meestal uit 4 hexadecimale cijfers.
Bij het opstarten van het ESP8266-bordje probeert de webserver verbinding te maken met het lokale WiFi-netwerk. Tijdens dit proces brandt de ingebouwde LED. De webserver moet geconfigureerd zijn voor toegang tot het lokale netwerk (zie verderop).
Als er verbinding is met het lokale netwerk gaat de ingebouwde LED uit. Je kunt dan proberen de webserver in het netwerk te vinden, via een computer met een browser.
Als je computer mDNS ondersteunt, dan is de webserver te vinden via de URL: http://esp8266-xxxx.local
.
Hier is xxxx
de nodeid.
De lokale domeinnaam esp8266-xxxx.local
is alleen in het lokale netwerk beschikbaar.
Als je computer geen mDNS ondersteunt, dan moet je het IP-adres van de webserver in het lokale netwerk zien te vinden.
In de browser gebruik je dan de URL: http://aaa.bbb.ccc.ddd
.
Hierin is aaa.bbb.ccc.ddd
het IP-adres.
Je kunt het IP-adres van de IoT-knoop-webserver achterhalen door deze te verbinden met de Arduino IDE. Via de seriële monitor van de Arduino IDE geeft de IoT-knoop de nodige informatie weer:
- het IP-adres van de knoop (verkregen via DHCP);
- het MAC-adres van de knoop (ingebouwd);
- de lokale domeinnaam, afgeleid van het MAC-adres
(
esp8266-xxxx.local
, waarbijxxxx
de laatste 4 tekens van het MAC-adres zijn)
De lokale domeinnaam wordt via mDNS (multicast-DNS, zie https://en.wikipedia.org/wiki/Multicast_DNS) in het netwerk verspreid.
Het IP-adres van de knoop blijft in elk geval gelijk totdat je deze opnieuw opstart. De lokale router deelt via DHCP de lokale IP-adressen uit. In veel gevallen zal op bij opnieuw opstarten de knoop hetzelfde IP-adres krijgen.
Te doen
- nagaan of mDNS werkt op Windows 10
- NB: werkt in elk geval op Mac OS X en op iOS, waarschijnlijk ook op Android.
Gebruik¶
De webserver biedt de volgende URLs:
/
- voor de “home” pagina. Deze bevat de sensordata en knoppen om LED0 aan- en uit te zetten./leds/0
- voor het afhandelen van het formulier opgestuurd door de LED-knoppen.- anders: geeft een 404-pagina met een overzicht van de gebruikte HTTP-method, URL, en parameters.
Via de browser-ontwikkelaarstools is de interactie tussen de browser en de webserver te volgen.
Met NodeRed kun je een webserver maken die zich hetzelfde gedraagt als de ESP8266-webserver.
Configuratie¶
Je moet deze software aanpassen voor het lokale WiFi-netwerk.
Vervang de ...
door de naam (SSID) en het wachtwoord van het netwerk.
const char* ssid = "..."; // adapt to local WiFi
const char* password = "..."; // adapt to local WiFi
Het is alleen mogelijk om verbinding te maken met een netwerk met ssis/password-beveiliging. Een schoolnetwerk kan een uitgebreidere beveiliging hebben; zie Gebruik via het schoolnetwerk.
Toelichting bij het programma¶
Met het programma sensor-webserver-0
kun je LED0 aan- en uitzetten.
De webserver gebruikt 2 verschillende URLs:
server.on("/", handleRoot);
server.on("/leds/0", handleLed0);
server.onNotFound(handleNotFound);
De functies voor het afhandelen van deze URLs gebruiken beide de functie sendHTMLdoc
,
voor het HTML-document als response op het http-request.
de functie handleLed0
handelt de parameters af van het POST
-request.
Alleen de on
-parameter wordt gebruikt.
void handleRoot() {
Serial.println("/");
sendHTMLdoc();
}
void handleLed0() {
if (server.method() == HTTP_POST) {
for (uint8_t i=0; i < server.args(); i++) {
if (server.argName(i) == "on") {
String argvalue = server.arg(i);
if (argvalue == "0") {
digitalWrite(ledPin, LOW);
} else if (argvalue == "1") {
digitalWrite(ledPin, HIGH);
}
}
}
}
sendHTMLdoc();
}
Voor het versturen van het HTML-document gebruiken deze functies dezelfde code:
void sendHTMLdoc() {
digitalWrite (LED_BUILTIN, LOW );
const char *red = "red";
const char *black = "black";
const char *color;
char buffer[800];
if (digitalRead(ledPin)) {
color = red;
} else {
color = black;
}
float temp = bme.readTemperature();
float pres = bme.readPressure() / 100;
snprintf ( buffer, 800,
"<html>\n\
<head>\n\
<title>ESP8266 Sensor server</title>\n\
</head>\n\
<body> <h1>ESP8266 control</h1>\n\
<p>\n\
<form action=\"/leds/0\" method=\"post\">\n\
<button type=\"submit\" name=\"on\" value=\"1\">On</button>\n\
<span style=\"font-weight:bold;color:%s;\"> [[LED]] </span>\n\
<button type=\"submit\" name=\"on\" value=\"0\">Off</button>\n\
</form>\n\
</p>\n\
<table>\n\
<tr><td>Temperature</td> <td>%.02f °C</td></tr>\n\
<tr><td>Atm.pressure</td> <td>%.02f hPa</td> </tr>\n\
<tr><td>IP address</td> <td>%s</td> </tr>\n\
</table>\n\
<p><a href=\"/\">refresh</a></p>\n\
</body>\n\
</html>\n",
color, temp, pres, ipAddress2String(WiFi.localIP()).c_str()
);
server.send ( 200, "text/html", buffer );
digitalWrite ( LED_BUILTIN, HIGH );
}
Andere webserver-hardware¶
Je kunt ook een Raspberry Pi gebruiken als IoT-knoop. Een Raspberry Pi Zero W is relatief goedkoop, heeft een WiFi-radio, en heeft aansluitingen voor allerlei soorten sensoren en actuatoren. Voor het programmeren kun je bijvoorbeeld Python gebruiken. Een voorbeeld van een IoT-project met een Raspberry Pi is het Poseidon project.
Te doen
- verwijzing naar implementatie van het Poseidon project.
Te doen
Wensen voor de webserver software sensor-webserver-0:
- melden van IP-adres via webpagina (voor omgevingen waar niet iedereen mDNS heeft); (misschien niet zo hard nodig: je kunt het IP-adres van een bestaande verbinding ook vinden via de browser-tools).
- melden van IP-adres van de gebruiker
- melden op console: HTTP-request
Voorbereiding¶
Om de webserver-node te gebruiken moet je deze programmeren voor je eigen netwerk, via je computer met Arduino IDE.
Nodes die op deze manier voorbereid zijn kunnen gebruikt worden door leerlingen die beginnen met IoT-0. Deze leerlingen hoeven deze voorbereiding niet zelf uit te voeren.
Voor de voorbereiding zijn de onderstaande stappen nodig. De eerste stappen heb je mogelijk al uitgevoerd, maar voor de volledigheid:
- Installeer de Arduino IDE: Installeren Arduino IDE
- Installeer de ESP8266-board-software in de Arduino IDE: Installeren extra boards
- Installeer de USB driver voor WeMos D1 mini pro: Installeren USB device-driver
Je kunt controleren of dit gelukt is door de ESP8266 aan de sluiten op je computer. Stel het juiste board en de juiste poort in (Hulpmiddelen->Board etc.). Open de Seriële Monitor met als baudrate 115200. Reset de ESP8266 (kleine knopje links van de USB-aansluiting). De ESP8266 meldt dan o.a. dat deze verbinding probeert te maken met het ingestelde WiFi-netwerk.
Als de ESP8266 zich niet meldt, controleer dan of de “Blink” sketch werkt. (zie Testen van de keten.)
- Installeer de Adafruit BME280-library (Installeren extra libraries)
Een volgende stap is het installeren van de IoT-voorbeeld-software.
- Installeer de voorbeeld-software: Installeren iot2018-voorbeelden
Als dit gelukt is vind je deze voorbeelden onder Bestand->Sketchbook->iot2018.
De webserver-software vind je als Bestand->Sketchbook->iot2018->sensor-webserver-0. Deze moet je nu aanpassen aan je eigen netwerk (netwerknaam/SSID en wachtwoord).
Notitie
De code werkt alleen voor netwerken die beveiligd zijn met een algemeen wachtwoord. Voor netwerken die een combinatie (gebruikersnaam, wachtwoord) gebruiken is een andere aanpak nodig.
- Configureer de webserver-sketch
- Upload de code naar de ESP8266 (pijl naar rechts in Arduino IDE) .
- Als de upload gelukt is, open je de Seriële Monitor (als deze nog niet open was).
Als het goed is krijg je nu de melding dat de ESP8266 contact probeert te maken met je lokale netwerk. Als er niets te zien is, reset dan eventueel de ESP8266. Als dat gelukt is, krijg je het toegewezen IP-adres te zien. Dit heb je straks nodig.
- Maak contact met de ESP8266-node via een browser in hetzelfde WiFi-netwerk. Als je geluk hebt, lukt dit via de URL: http://esp8266.xxxx.local/ met voor xxxx de identificatie van je node. Als dat niet lukt, gebruik dan: http://aaa.bbb.ccc.ddd/ waarin a…d het IP-adres is van je ESP8266.
Als je zover gekomen bent, en het werkt: gefeliciteerd!