HTTPS (SSL) Seiten mit Arduino / EPS8266 aufrufen

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 88 17 0B CA 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);

}

Folgende Bauteile wurden verwendet:

1x Wemos D1 mini Pro v2.0 – http://bit.ly/2PHnnxZ
1x Temperatursensor SHT30 – http://bit.ly/2XVK3gw
1x I2C Kabel – http://bit.ly/2UTjGpL
1x Lipo Akku – https://amzn.to/2DMz3uy *

1x Solarzelle – https://amzn.to/2Lkp85t *

 
Sandwich
1x Wemos D1 mini pro v1.0 – https://amzn.to/2DIawXj *
1x Temperatursensor SHT30 – https://amzn.to/2LrBubU *
1x Batterie Shield – https://amzn.to/2DJC2nz *

Leave a Comment