Webseiten

Internetseiten werden mit Hilfe von HTML (Hypertext Markup Language (Hypertext-Auszeichnungssprache)) dargestellt. Eine typische HTML ist ein reine Textdatei mit der Dateiendung .html. HTML ist eine Seitenbeschreibungssprache. Neben den Inhalten wird auch die Struktur (Art der Überschrift, Absatz, Aufzählung, Bild, Link, Tabelle etc. ) beschrieben. Da die Darstellung nicht nur auf normalen PCs, sondern auch abhängig von den unterschiedlichsten Darstellungsgeräten (Handy, Smartwatch, Displays unterschiedlichster Auflösung) funktionieren sollte, wird die Darstellung (Design) mit Hilfe von Stylesheets separat in einem CSS - Block oder einer separaten CSS- Datei geschehen, die rein für die Darstellung, das Aussehen des Textes verantwortlich ist.

Alle Inhalte (HTML- Seie, CSS -Seite, Javascript - Seite, Bilder, Videos, …) werden mit Hilfe des Protokolls HTTP (Hypertext Transfer Protokoll) bzw. HTTPS (HyperText Transfer Protocol Secure) übertragen.

Der Browser fordert die Seite von einem Webserver an, dieser überträgt diese dann an den Client und wird dann nach und nach angezeigt. Datei erfolgt die Darstellung im Browser, abhängig von Voreinstellungen, die konfiguriert worden sind.

Normalerweise sind die Seiten statisch auf der Festplatte des Servers abgelegt. Oftmals sollen die HTML-Seiten aber erst dynamisch erstellt werden, wie z.B. bei einer Suchanfrage. Der Server erkannt an der Dateiendung (.php), dass diese nicht direkt, sondern zusätzlich bearbeitet werden sollen. PHP ist eine Scriptsprache, die im Webserver integriert ist und mit dessen Hilfe auf externe Seiten oder Datenbanksysteme zugegriffen werden, sowie umfangreiche Berechnungen gemacht werden können.

PHP kann auch gut auf Datenbanken zugreifen. MySQL ist eine Datenbankverwaltungssystem, welches die Grundlage für viele dynamische Webseiten bildet. Der Zugriff auf die Datenbank erfolgt mit Hilfe der von SQL (Structured Query Language).

Der NodeMCU

Das ESP8266 WiFi-Modul kann in 2 verschiedenen Modi betrieben werden: Der Station- und dem AccessPoint - Modus. Im AP - Modus er arbeitet selbst als Access Point, spannt ein eigenes WLAN auf und andere Stationen können darüber kommunizieren. Es ist dann allerdings kein Zugriff auf das Internet möglich. Im Station-Modus kann der Mikrocontroller mit einem bereits bestehenden Wi-Fi-Netzwerk (Access Point) verbunden werden.

Für den Station-Modus wird die ESP8266WiFi.h Bibliothek benötigt. Die Netzwerkverbindung mit mit Wifi.begin(ssid, password) gestartet. Außerdem wird die IP - Adresse standardmäßig über DHCP vergeben.

Oftmals ist es allerdings notwendig, wenn der Mikrocontroller z.B. durch eine Firewall muss, dass eine feste IP- Adresse und sogar eine fest vorgegebene MAC- Adresse definiert wird.

Mit der Funktion config() wird die Verbindung mit einer festen IP-Adresse versehen.

config(local_ip, gateway, subnet, dns)

  • local_ip : IP-Adresse, die wir der zuweisen möchten
  • gateway : IP-Adresse des Gateways / Router
  • subnet : Subnetzmaske
  • dns : IP-Adresse des DNS-Servers (Domain Name Server).

Mit

uint8_t newMACAddress[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf2};

wifi_set_macaddr(STATION_IF, &newMACAddress[0]);

kann man die MAC - Adresse neu definieren.

Beim Aufruf einer Webseite überprüft der Browser das Sicherheitszertifikat (SSL - Zertifikat) des Servers. Hierzu hat er eine Liste vertrauenswürdiger Zertifizierungsstellen, deren Zertifikaten der Browser vertraut. Auch im ESP8266 wäre dies möglich, allerdings ist der Aufwand (zur Konfiguration und des Rechenaufwandes) groß, v.a. da diese immer wieder erneuert werden muss. Deshalb wird mit wifiClient.setInsecure(); die Sicherheitsüberprüfung abgeschalten.

Einfacher Aufbau einer Internet-Verbindung und Abfrage

netzwerk_aufruf.pdf

  1. Welche IP-Adresse hat der Mikrocontroller?
  2. Dem Mikrocontroller wird eine MAC -Adresse zugewiesen: Informiere dich im Internet, welche Bedeutung eine MAC - Adresse hat und wie sie aufgebaut ist.
  3. Wie lautet das WLAN und das Passwort?
  4. Was passiert in Zeile 24- 27?
  5. Vergleiche die Zeile 35 mit 42;
  6. Informiere dich im Internet über den httpCode. Welche Bedeutung hat der httpCode 400?
  7. In Zeile 46 - 59 sind mehrere if - else - Verschachtelungen. Kennzeichne farblich zusammengehörende Klammern.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
 
HTTPClient sender;
WiFiClientSecure wifiClient;

// WLAN-Daten
const char* ssid = "TP-LINK_AP_AF32";
const char* password = "geheim";
uint8_t newMACAddress[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf2}; 
  
void setup() {
  Serial.begin(9600); 
  // Beginn Netzwerk und WLAN - Konfiguration 
  WiFi.mode(WIFI_STA);
  wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
  IPAddress ip(10, 144, 5, 2);
  IPAddress dns(10, 144, 1, 1);
  IPAddress gateway(10, 144, 1, 2);
  IPAddress subnet(255, 255, 0, 0);
  WiFi.config(ip, dns, gateway, subnet);
 // ende der Netzwerkkonfiguration
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }
 
  Serial.println("Mit dem WLAN verbunden!");
  Serial.println();
  wifiClient.setInsecure();  // sichere Verbindung wird nicht überprüft
}
 
void aufruf(){
  // String getData = "?vorname=klaus&wert1=23,5&wert2=78";
  
  String vorname = "Klaus";
  String temperatur = "23.5";
  String luftfeuchtigkeit = "78";

  //GET Data + Link
  String getData = "?vorname=" + vorname + "&wert1=" + temperatur + "&wert2=" + luftfeuchtigkeit ;
  String Link = "https://www.info-checker.de/raumklima/uhrzeit.php";
  Link = Link + getData;
  
  if (sender.begin(wifiClient, Link)) {
    int httpCode = sender.GET();      
    if (httpCode > 0) {
      if (httpCode == 200) {
        String antwort = sender.getString();
        Serial.println(antwort);
      }else{
        Serial.print("HTTP-Error: " +  String(httpCode));
      }
    }
    sender.end();
  }else {
    Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
  }
}
 
void loop() {
  aufruf();
  delay(2000);
}

Messwerterfassung und Verbindungsaufbau mit einem WEB-Server

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

#include "DHT.h"
#define DHTPIN 12 //Der Sensor wird an PIN 12 angeschlossen    
#define DHTTYPE DHT22    // Es handelt sich um den DHT22 Sensor
 
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen
 
float temperatur;
float luftfeuchtigkeit;
String Str_luftfeuchtigkeit="";
String Str_temperatur ="";
SSD1306AsciiWire oled;
 
HTTPClient sender;
WiFiClientSecure wifiClient;
 
// WLAN-Daten
const char* ssid = "Name";
const char* password = "geheim";


int anzahl=0;
String  getData ="";
String Link="";
String AnalogData="";
String station ="Station";
 
void setup() {
  Serial.begin(9600);

  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x32, 0x3C);
  oled.setFont(System5x7);
  oled.clear();


  dht.begin(); //DHT22 Sensor starten

  
  // folgendes ist nur wichtig, wenn man dem Mikrocontroller eine feste IP und MAC zuweisen möchte
  // neue MAC - Adresse  https://randomnerdtutorials.com/get-change-esp32-esp8266-mac-address-arduino/

  uint8_t newMACAddress[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
  WiFi.mode(WIFI_STA);
  
  // For Soft Access Point (AP) Mode
  //wifi_set_macaddr(SOFTAP_IF, &newMACAddress[0]);
  // For Station Mode
  wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
  
  Serial.print("[NEW] ESP8266 Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
  
  IPAddress ip(192, 168, 178, 53);
  IPAddress dns(192, 168, 178, 1);
  IPAddress gateway(192, 168, 178, 1);
  IPAddress subnet(255, 255, 255, 0);
  WiFi.config(ip, dns, gateway, subnet);
 // ende der Netzwerkkonfiguration
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("-");
  } 
  Serial.println("WLAN- Verbindung aufgebaut.");
  Serial.println(WiFi.localIP()); 
  wifiClient.setInsecure(); // Zertifkat wird nicht abgefragt

//OLED anschließen https://www.14core.com/wiring-nodemcu-esp8266-12e-with-i2c-16x2-lcd-screen/

}
 
 void anfrage(){
// DHT abfragen
luftfeuchtigkeit = dht.readHumidity();
temperatur = dht.readTemperature();
Str_luftfeuchtigkeit= String(luftfeuchtigkeit);
Str_temperatur = String(temperatur);  
  
  // Analogen Eingang abfragen:
  int analog_wert=analogRead(A0);  
  AnalogData = String(analog_wert);   //Wert in String umwandeln
  
  //GET Data
  getData = "?Wert1=" + AnalogData + "&Wert2=" + Str_luftfeuchtigkeit+ "&Wert3=" + Str_temperatur ;
  Link = "https://www.info-checker.de/raumklima/MesswertAbspeichern.php" + getData;
     
  if (sender.begin(wifiClient, Link)) {
    int httpCode = sender.GET(); 
     
    if (httpCode > 0) {
      // Anfrage wurde gesendet und Server hat geantwortet
      // Info: Der HTTP-Code für 'OK' ist 200
      if (httpCode == 200) {
        // Hier wurden die Daten vom Server empfangen
        // String vom Webseiteninhalt speichern
        String payload = sender.getString();
        // Hier kann mit dem Wert weitergearbeitet werden
        // ist aber nicht unbedingt notwendig
        Serial.println(payload);
      }else{
        // Falls HTTP-Error
        Serial.print("HTTP-Error: " +  String(httpCode));
      }
    }
    // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
    sender.end();
  }else {
    Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
  }
 }  // ende void anfrage()
 

 
void loop() {
anfrage();
  oled.clear();
  oled.print("Luft: ");
  oled.println(AnalogData);
  oled.print("Feuchte: ");
  oled.println(Str_luftfeuchtigkeit);
  oled.print("Temperatur: ");
  oled.println(Str_temperatur);
  delay(120000);  // alle 2 Minuten
} // ende loop()

Nur CO2


#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
    

HTTPClient sender;
WiFiClientSecure wifiClient;
 
// WLAN-Daten
const char* ssid = "Handy";
const char* password = "12345678";
// uint8_t newMACAddress[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf2}; 

 
SoftwareSerial softwareSerial(D7, D8);
byte abfrage[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des CO2 Sensors
char antwort[9];
 
 
void setup() {
  Serial.begin(9600);
  softwareSerial.begin(9600);

// Beginn Netzwerk und WLAN - Konfiguration 
  //WiFi.mode(WIFI_STA);
  //wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
  //IPAddress ip(10, 144, 5, 2);
  //IPAddress dns(10, 144, 1, 1);
  //IPAddress gateway(10, 144, 1, 2);
  //IPAddress subnet(255, 255, 0, 0);
  //WiFi.config(ip, dns, gateway, subnet);
 // ende der Netzwerkkonfiguration



WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }
  
  Serial.println("Mit dem WLAN verbunden!");
  Serial.println();
  wifiClient.setInsecure();  // sichere Verbindung wird nicht überprüft
  
} // ende setup
 
 
void loop() {
 delay(600000);
 Serial.println(" ");
 softwareSerial.write(abfrage, 9);
 softwareSerial.readBytes(antwort, 9);
 int resHigh = (int) antwort[2];
 int resLow  = (int) antwort[3];
 int CO2_ppm = (256*resHigh)+resLow;
 String str_CO2_ppm = String(CO2_ppm);
 Serial.print(CO2_ppm);
 Serial.println(" CO2 ppm");
 Serial.println("einzelne Werte: ");  
  for(int i=0; i<9 ; i++){
    Serial.print((int)antwort[i]);
    Serial.print("   ");
  }
  Serial.println(" "); 
  if(antwort[0]!=255){
    Serial.println("RESET .........................................................................................................................");
    delay(500);
    ESP.restart();
  }

// Netzwerkverbindung aufbauen
//GET Data + Link
  String getData = "?wert4=" + str_CO2_ppm + "&beschreibung=2022_06_28_5b";
  String Link = "https://www.info-checker.de/raumklima/MesswertAbspeichern.php";
  Link = Link + getData;
   Serial.println(Link);
  if (sender.begin(wifiClient, Link)) {
    int httpCode = sender.GET();      
    if (httpCode > 0) {
      if (httpCode == 200) {
        String antwort = sender.getString();
        Serial.println(antwort);
      }else{
        Serial.print("HTTP-Error: " +  String(httpCode));
      }
    }
    sender.end();
  }else {
    Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
  }





  
} // ende loop

  • arduino/webserver.txt
  • Zuletzt geändert: 2022/06/27 22:42
  • von khirling