Hallo Leute,
ich stehe gerade auf dem Schlauch, vielleicht kann mich jemand von euch runter schubsen?!
Bei der Umsetzung von diesem Projekt habe ich Schwierigkeiten mit der Verbindung zum Host.
Als Hardware habe ich einen NodeMCU mit ESP8266. Die Verbindung zum Internet stellt eine Fritzbox 7490 her. Dem ESP habe ich in den Fritzbox-Einstellungen Rechte zur "Selbstsändigen Portfreigabe" gegeben. Der Internetzugriff über HTTPS auf die Fritzbox ist aus und der TCP-Port für HTTPS auf 443 gestellt. Das müsste der Standart-Port sein?!
Die WiFi-Verbindung zwischen Fritzbox und ESP kommt problemlos zu stande. Die Verbindung zum Host, in diesem Fall facebook.com, scheitert.
(Probiere ich den Beispiel-Sketch ESP8266WiFi-HTTPSRequest habe ich das gleiche Problem. Verbindung zur Fritzbox klappt, die Verbindung zu github.com funktioniert aber nicht.)
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <SevenSegmentTM1637.h>
#include <ArduinoJson.h>
// Wifi
const char* ssid = "*****";
const char* password = "*************";
// Facebook
// https://github.com/gbrault/esp8266-Arduino/blob/master/doc/esp8266wifi/client-secure-examples.md
const char* host = "graph.facebook.com";
const String url = "/*************?access_token=***********|*******************&fields=fan_count";
const int httpsPort = 443;
const char* fingerprint = "74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3";
// Display https://github.com/bremme/arduino-tm1637
const byte PIN_CLK = D3; // define CLK pin (any digital pin)
const byte PIN_DIO = D4; // define DIO pin (any digital pin)
String payload;
SevenSegmentTM1637 display(PIN_CLK, PIN_DIO);
void setup() {
Serial.begin(9600);
// Wifi
WiFi.begin(ssid, password);
Serial.println();
Serial.print("Connecting ");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
// display.print("CONNECTING");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
// Display
// display.begin(); // initializes the display
// display.setBacklight(100); // set the brightness to 100 %
// display.print("START");
}
void loop() {
String wifistatus = "WIFI OK";
// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;
if (!client.connect(host, httpsPort)) {
String wifistatus = "WIFI FAIL";
Serial.println("connection failed");
return;
}
// display.print(wifistatus);
if (client.verify(fingerprint, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
Serial.println(fingerprint);
}
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: close\r\n\r\n");
Serial.println("request sent");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("headers received");
break;
}
}
// JSON
String line = client.readStringUntil('\n');
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(line);
int fancount = root[String("fan_count")];
if (fancount > 0) {
Serial.print("Fans: ");
Serial.println(fancount);
// display.clear();
// display.print(fancount);
} else {
// display.clear();
// display.print("ERR1");
// display.blink();
}
delay(30000);
}
Die Display-Befehle habe ich raus genommen, da aktuell kein Display angeschlossen ist.
Der Serial-Monitor spuckt folgendes aus:
Connecting ..
Connected, IP address: 192.168.188.62
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3
request sent
headers received
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3
request sent
headers received
certificate doesn't match
74:13:76:77:B8:BF:CA:95:73:DE:04:5A:48:AF:7A:6B:E1:A1:C0:F3
etc...
Den Fingerprint habe ich auch schon in unterschiedlichen Schreibweisen (groß, klein, zusammen, ohne probiert, ohne Erfolg.
Für Hinweise bin ich dankbar! Liegt es an der Fritzbox? Oder doch an mir? Oder...
viele Grüße
Michel