PHP Dashboard für HmIP Smartmeter
09.10.2024
Elektronik | Funk | Software
Der Technik-Blog
Für dieses Projekt gibt es auch ein Video auf Youtube: NodeMCU ESP8266 - SSL verschlüsselter HTTPS Request mit Post & GET Parametern - ohne CA-Check
Die meisten Mikrocontroller und Development Boards (Arduino, NodeMCU, ESP32, ESP8266 usw.) verwenden bei der Kommunikation mit einem Webserver das unverschlüsselte Protokoll HTTP. Sehr oft ist das vom Entwickler oder Anwender sogar gewollt, da hier meistens nur Steuerdaten übertragen werden und es nicht notwendig ist, diese zu verschlüsseln. Trotzdem kommt es oft zu immer mehr Problemen, wenn man HTTP anstatt HTTPS verwendet.
Für die Datenübertragung zwischen Webserver und Mikrocontroller wird seit mehr als einem Jahrzehnt HTTP verwendet. Für das Protokoll gibt es sehr viele einfache Bibliotheken und die Ressourcen an heutigen Mikrocontrollern sind für diesen Verwendungszweck ausreichen vorhanden. HTTPS ist bei jeder guten Webseite heutzutage eine Grundvoraussetzung. Immer mehr Webserver bzw. Webspace Anbieter akzeptieren nur noch das HTTPS Protokoll. Teilweise blockieren auch Firewalls bereits HTTP und lassen nur noch HTTPS-Requests durch. Genau diese gravierende und fortschreitende Entwicklung zwingt uns, die Datenübertragungsart der Mikrocontroller anzupassen.
Grundsätzlich bestätigt die Zertifizierungsstelle die Echtheit des Servers. Der Client kann durch die Abfrage der Zertifikate erkennen, ob der angefragte Server tatsächlich dieser ist, oder ob jemand dazwischen die zu übertragenen Daten abfängt. Unser Beispielcode ignoriert diese Überprüfung. Das bedeutet, die Datenübertragung erfolgt zwar über HTTPS, jedoch wird die Vertraulichkeit der Gegenstelle nicht überprüft. Für die meisten Anwendungen ist der Beispielcode trotzdem geeignet. Außerdem kommuniziert der Mikrocontroller auch bei einem Zertifikatsfehler oder einem selbst signierten SSL-Zertifikat zuverlässig.
Unser Beispielcode funktioniert gleich wie der eines HTTP-Requests, allerdings über HTTPs. Dazu wird am Beginn des Quellcodes eine URL definiert, die der Mikrocontroller später aufrufen wird. Während des Aufrufes kann man dann Parameter über POST und GET an den Webserver übermitteln. Das können beispielsweise Wetterdaten einer Messstation sein. Die empfangene Antwort des Servers wandelt der Sourcecode in einen String um, der dann wenn nötig relativ einfach weiterverarbeitet werden kann.
/* HTTPS GET/POST Request for NodeMCU/ESP8266 Powered by: https://www.aeq-web.com */ #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <ESP8266WebServer.h> #include <ESP8266HTTPClient.h> ///////////////////////////////BASIC SETINGS//////////////////////////// const char *ssid = "YOURNETWORK"; //Wifi Network Name const char *password = "YOURPASSWORD"; //Wifi Network Key const char *host = "www.aeq-web.com"; //Domain to Server String path = "/test.php?get=test"; //Path of Server const int httpsPort = 443; //HTTPS PORT (default: 443) int refreshtime = 15; //Make new HTTPS request after x seconds ///////////////////////////////BASIC SETINGS//////////////////////////// String datarx; //Received data as string long crontimer; void setup() { delay(1000); Serial.begin(115200); WiFi.mode(WIFI_OFF); delay(1000); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print("Connected: "); Serial.println(ssid); } void loop() { if(crontimer < millis()/1000){ crontimer = (millis()/1000)+refreshtime; callhttps(); // } } void callhttps(){ WiFiClientSecure httpsClient; httpsClient.setTimeout(15000); delay(1000); int retry = 0; while ((!httpsClient.connect(host, httpsPort)) && (retry < 15)) { delay(100); Serial.print("."); retry++; } if (retry == 15) { Serial.println("Connection failed"); } else { Serial.println("Connected to Server"); } httpsClient.print(String("GET ") + path + "HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); while (httpsClient.connected()) { String line = httpsClient.readStringUntil('\n'); if (line == "\r") { break; } } while (httpsClient.available()) { datarx += httpsClient.readStringUntil('\n'); } Serial.println(datarx); datarx = ""; }
<?php echo "GET: " . $_GET["get"]. " "; echo "POST: " . $_GET["post"]. " "; echo "Time: " . date("Y-m-d H:i:s"); ?>
Mit dem Flash Download Tool können fertig exportierte Programme (.BIN Datei) auf den ESP32/ESP8266 ohne Arduino IDE geladen werden
WeiterlesenIn diesem Artikel bauen wir eine autarke LoRa Wetterstation, die Temperatur, Luftdruck, Feuchtigkeit, Sonnenintensität und Windgeschwindigkeit messen kann
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved