ESP als Webserver

Eine Webpage, vom ESP aufgebaut!

Um den ESP8266 in das WLAN-Netz einzubinden ist zunächst mal die Bibliothek ESP8266WiFi.h zuständig, die bereits im ESP-Paket enthalten ist. Für die Arbeit als Webserver benötigt man zusätzlich die Bibliothek ESP8266WebServer.h (ebenfalls im ESP-Paket). Ich bevorzuge für die Einbindung des ESP ins Netz feste IP-Adressen, da man ihn damit leichter wiederfindet. Außerdem kann man alle im Haus werkelnden ESPs mit aufeinanderfolgenden Adressen in einem IP-Bereich ansiedeln, der für die dynamische DNS-Vergabe gesperrt ist.

Wie das Ganze konkret funktionieren kann, illustriert das folgende Listing (hier auch zum Download):


#include <ESP8266WiFi.h>
//#include <WiFiClient.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

//**** Diese Daten müssen angepasst werden ***************

#define WIFI_AP "myWiFi" // Bez. des Access-Points
#define WIFI_PASSWORD "myPassword" // Access-Key

// Ich bevorzuge feste IPs, weil sich der WSP dann schneller wiederfinden lässt

int subNetIP = 1; //IP des Subnets
int myIP = 23; // gewünschte IP-Nummer
String myHostname = "ESP8266";

//**********************************************************

WiFiClient wifiClient;

ESP8266WebServer server(80); //Server an port 80

void setup()
{
  Serial.begin(115200);
  InitWiFi();
  server.on("/", handleRoot); // Routine für die root-Page
  server.on("/other", doOtherThings); // Routine für eine andere Seite
  server.begin();
  Serial.println("Webpage hört auf 192.168." + String(subNetIP) + "." + String(myIP));
}

void loop() {
  server.handleClient();
}

void connectToWiFi() {
  WiFi.begin(WIFI_AP, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

String niceStr(int i) {  //Zahlen ggf. mit führender Null
  String out = "";
  if (i < 10) out += "0";
  out += String(i);
  return out;
}

String uptime() {
  String out = "";
  unsigned long up = millis();
  up = up / 1000;
  int d = up / 86400L; // days
  out = niceStr(d) + " d ";
  up = up % 86400;
  d = up / 3600L; // hours
  out += niceStr(d) + " h ";
  up = up % 3600;
  d = up / 60L; // minutes
  out += niceStr(d) + " m ";
  d = up % 60;
  out += niceStr(d) + " s";
  return out;
}

String macAdresse() {
  String out = "";
  byte mac[6];
  WiFi.macAddress(mac);
  for (int i = 5; i > 0; i--) {
    out += hex(mac[i]) + ":";
  }
  out += hex(mac[0]);
  return out;
}

String hex(byte b) {
  String out = String(b, HEX);
  if (out.length() == 1) out = "0" + out;
  return out;
}

void InitWiFi()
{
  Serial.println("Verbinde mit AccessPoint ...");
  //  Versuch, mit dem WiFi-Netz zu verbinden
  IPAddress ip(192, 168, subNetIP , myIP);
  IPAddress gateway(192, 168, subNetIP, 1);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, subNetIP, 1);
  WiFi.config(ip, dns, gateway, subnet); // auf feste IP einstellen
  WiFi.hostname(myHostname); //Hostnamen setzen
  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  connectToWiFi();
  Serial.println(" verbunden!");
}

void doOtherThings() {
  String msg = "<html><head><title>Another Page</title></head><body>";
  msg += "<center><br><br><br><br><br><H1>Dies ist noch eine Webpage</H1>";
  msg += "<a href = \"/\"> zurück zur Hauptseite</a></center></body></html>";
  server.send(200, "text/html", msg);
}

void handleRoot() {
  String msg = "<meta http-equiv=\"refresh\" content=\"60\"> ";
  msg += "<center><H1><u>" + String(myHostname) + "</u></H1> </p>";
  msg += "<br />Diese Seite aktualisiert im Minutentakt die Uptime-Zeit!<br /><br />";
  msg += "<b>Online seit:</b> " + uptime() + "<br />";
  msg += "<b>IP-Adresse:</b> 192.168." + String(subNetIP) + "." + String(myIP) + "<br />";
  msg += "<b>MAC-Adresse:</b> " + macAdresse() + "<br />";
  msg += "===================================================<br />";
  msg += "<a href = \"other\">Hier gehts zu einer anderen Webpage ...</a><br />\n";
  server.send(200, "text/html", msg);
}

3 Gedanken zu „ESP als Webserver

  • Pingback: Der ESP8266 (ESP-01) – Blog aus der Nordheide

  • Dezember 3, 2020 um 10:34 am
    Permalink

    Vielen Dank für das Teilen dieses kleinen WebServer Beispiels!

    Aber funtkioniert die Kombination aus fester IP und Hostname? Bei mir geht nur entweder oder.
    Bei fester IP aus dem Skript wird der Standardhostname ESPXXX angezeigt. Der Hostname aus aus „WiFi.hostname(myHostname); “ wird nur übernommen, wenn „WiFi.config(ip, dns, gateway, subnet);“ auskommentiert ist….

    Gibts da einen Trick?

    Antwort
    • Dezember 3, 2020 um 10:51 am
      Permalink

      Ooops! Da stellst Du mir eine schwierige Frage. Mir ist das Problem so noch gar nicht aufgefallen, vor allem wohl auch deshalb, weil ich die Hostnamen den IP-Adressen in meiner Fritzbox zuweise. Insofern kann ich nicht sicher sagen, ob der Hostname direkt aufgelöst wird, oder ob meine Fritzbox das macht (und mithin der Hostname-Eintrag wirkungslos ist).
      Einen Trick (außer dem mit meiner Fritzbox) kenne ich sonst nicht (und der Eintrag in der Fritzbox ist ja in dem Sinne keiner). Sorry!

      Antwort

Schreibe einen Kommentar zu y5gm5n_admin Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert