HTTPS (SSL) Seiten mit Arduino / EPS8266 aufrufen In meinem Gewächshaus Projekt und auch beim Projekt Zisterne Füllstandsanzeige 2.0 mit Wemos Lolin32 + MySQL Datenbank kamen immer wieder fragen auf warum die Daten nicht in die Mysql Datenbank geschrieben werden können. Händisch über die Internetseite hat es funktioniert mit dem EPS8266 aber nicht. Nun stand ich selber vor dem Problem, da ich den Internetprovider gewechselt hatte. Ich dachte mit das kann doch nicht sein es hatte doch vorher funktioniert. Nun der Fehler ist recht simpel. Bei meinem alten Provider hatte ich nur eine HTTP Seite (unverschlüsselt) jetzt beim Neuen Provider ist es eine HTTPS Seite (verschlüsselte) und da liegt das Problem.
Das ursprüngliche Gewächshaus Projekt hatte die Daten an eine HTTP Seite gesendet.Jetzt kommen wir zu Lösung des Problem.
Es müssen 4 Sachen gegenüber dem herkömmlichen Code geändert werden.
1. Wie eine Bibliothek eingebunden wird habe ich in diesem Blogartikel schon mal erklärt. #include <WiFiClientSecure.h>
2. Der WiFiClient client; Befehl durch den WiFiClientSecure client; Befehlt ersetzt werden.
3. Der Port muss von 80 auf 443 geändert werden.
4. Man muss dem Arduino / EPS8266 das Sicherheitszertifikat mitteilen. Das macht man mit dem Befehlt client.setFingerprint(fingerprint);
Wenn Ihr nicht wisst wie Ihr an die Daten des Zertifikats ran kommt hier kürz erklärt wo es zu finden ist.
Der SHA1 Fingerabdruck 2F:D7:88:17:0B:CA:08:56:47:A3:08:89:0B:A6:BD:ED:07:A0:45:13 kann nun im Arduino Programm verwendet werden. Es müssen nur noch die Doppelpunkte : durch Leerzeichen ersetzt werden. Hier der Prgrammcode vom Beispiel des Gewächshaus Projektes.
Der Programmcode
#include <esp8266wifi.h> #include <wificlientsecure.h> #include <WEMOS_SHT3X.h> #include <eeprom.h> SHT3X sht30(0x45); const char* ssid = "WLAN-NAME"; // SSID of local network const char* password = "WLAN-PASSWORT"; // Password on network const char* host = "WEBSEITE"; //Webserver // SHA1 Fingerabdruck vom Zertifikat const char fingerprint[] PROGMEM = "2F D7 89 17 0B 7A 08 56 47 A3 08 89 0B A6 BD ED 07 A0 45 13"; WiFiClient client; char servername[] = "WEBSEITE"; // remote server we will connect to String result; float temp; float feucht; int temp1; int temphigh; const int sleepSeconds = 600; void setup() { Serial.begin(115200); Serial.println("Connecting"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } Serial.println("Connected"); delay(500); } void loop() { EEPROM.begin(512); temp1 = EEPROM.read(1); temphigh = EEPROM.read(2); // EEPROM wird geprüft ob Daten vorhanden sind die nicht 1 oder 0 sind! // Ist das der Fall wird tempghigh auf 1 gesetzt. if (!(temphigh == 0 || temphigh == 1)) { temphigh = 1; EEPROM.write(2, temphigh); } // Daten aus dem Sensor lesen. if (sht30.get() == 0) { temp = sht30.cTemp; feucht = sht30.humidity; temp1 = temp; EEPROM.write(1, temp1); } String tempString = String(temp, 1); String feuchtString = String(feucht, 1); Serial.println("\nStarting connection to server..."); //Ausgabe ueber serielle Verbindung WiFiClientSecure client; client.setFingerprint(fingerprint); // Temperaturdaten werden über URL Link an die Datenbank übergeben. if (client.connect(host, 443)) { Serial.println("connected to server"); String url = "/ghaus/wm_t1.php"; url += "?t1="; url += temp; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); client.println(); //Verbindungs mit Server aufbauen und HTTP Anfrage senden } // Luftfeuchtigkeitsdaten werden über URL Link an die Datenbank übergeben. if (client.connect(host, 443)) { Serial.println("connected to server"); String url = "/ghaus/wm_f1.php"; url += "?f1="; url += feucht; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); client.println(); //Verbindungs mit Server aufbauen und HTTP Anfrage senden } client.stop(); //Beenden der Verbindung //prüfen ob die Temperatur unter 20 Grad ist und Mail senden. if (temp1 < 20 && temphigh == 1) { temphigh = 0; EEPROM.write(2, temphigh); sendAMail(tempString, feuchtString); } //prüfen ob die Temperatur über 35 Grad ist und Mail senden. if (temp1 > 35 && temphigh == 0) { temphigh = 1; EEPROM.write(2, temphigh); sendAMail(tempString, feuchtString); } EEPROM.commit(); EEPROM.end(); ESP.deepSleep(sleepSeconds * 1000000); } void sendAMail(String temp, String feucht) { WiFiClientSecure client; client.setFingerprint(fingerprint); if (client.connect(servername, 443)) { //starts client connection, checks for connection Serial.println("connected"); client.println("GET /send_email.php?temperature=" + temp + "&humidity=" + feucht + " HTTP/1.1"); //Send data client.println("Host: bau-es-selbst.info"); client.println("Connection: close"); //close 1.1 persistent connection client.println(); //end of get request } else { Serial.println("connection failed"); //error message if no client connect Serial.println(); } while (client.connected() && !client.available()) delay(1); //waits for data while (client.connected() || client.available()) { //connected or data available char c = client.read(); //gets byte from ethernet buffer result = result + c; } client.stop(); //stop client Serial.println(result); }