********* 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``, waarbij ``xxxx`` 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. .. todo:: * 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. .. code-block:: c++ 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 :ref:`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: .. code-block:: c++ 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. .. code-block:: c++ 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: .. code-block:: c++ 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, "\n\
\n\\n\
\n\ \n\Temperature | %.02f °C |
Atm.pressure | %.02f hPa |
IP address | %s |