Pomijając kwestie bezpieczeństwa przekazywanych danych coraz trudniej jest korzystać z żądań HTTP ponieważ coraz mniej serwerów dopuszcza połączenie bez szyfrowania.
By skorzystać z HTTPS w Arduino musimy uzyskać skrót SHA-1 certyfikatu używanego przez serwer z którym chcemy się łączyć.
openssl s_client -connect www.xyz.org:443
Interesuje nas treść zawarta między znacznikami -----BEGIN CERTIFICATE----- i -----END CERTIFICATE-----
Kopiujemy ten fragment do pliku wraz ze znacznikami, następnie tworzy skrót SHA-1
openssl x509 -noout -in ./plikCertyfikatu -fingerprint -sha1
Z otrzymanego odcisku należy usunąć znaki :, przykładowy odcisk poniżej
const char* fingerprint = "2D EC DC 39 E1 43 FB 81 BF 75 33 7E F4 69 E9 3D 9B EA BF 31";
Prócz tego odcisk SHA-1 możena podejrzeć we właściwościach certyfikatu w Mozilla Firefox na zakładce ogólne.
Niezbędne są dwie biblioteki, WiFi.h by połączyć się z siecią WiFi i HTTPClient.h celem stworzenia klasy która pozwoli na wykonanie żądania HTTP.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
Deklarujemy dane niezbędne do połączenia z siecią
const char* ssid = "nazwaSieci";
const char* password = "hasło";
i dodajemy wcześniej odpowiednio spreparowany certyfikat
const char* fingerprint = "2D EC DC 39 E1 43 FB 81 BF 75 33 7E F4 69 E9 3D 9B EA BF 31";
W funkcji setup() otwieramy połączenie szeregowe celem monitrowania pracy kontrolera i łączymy się do sieci WiFi
void setup() {
Serial.begin(115200);
while(!Serial);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi .");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println();
Serial.println("Connected to WiFi!");
}
Po połączeniu się z siecią towrzymy obiekt HTTPClient który pozwoli na wysłanie zapytania HTTPS.
HTTPClient http;
Przed użyciem obiekt http musimy zainicjalizować podając adres zapytania oraz ceryfikat
http.begin("https://www.testowyServer.org/dane?x=1", fingerprint);
Wysłanie zapytania GET odbywa się poprzez wywołanie funkcji GET() na obiekcie http. Funkcja zwróci int, jeżeli wartość jest większa od 0 to jest kodem zwróconym przez serwer www a wartość mniejsza od 0 oznacza wewnętrzny błąd kontrolera.
int httpCode = http.GET();
Po wykonaniu zapytania możemy wyświetlić treść zwróconą przez serwer,
if(httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Blad podczas generowania zapytania");
}
Po przetworzeniu zapytania należy wywołać funkcję end() celem zwolnienia zasobów zajętych przez obiekt HTTPClient
http.end();