Документация по этому вопросу не ясна, но WiFiClient
поддерживает только http
, а не https
.
Здорово, что вы используете https
! Но вам нужно будет использовать WiFiClientSecure
вместо WifiClient
.
Скорее всего, вы захотите проверить личность сервера после подключения. Вы сделаете это, используя метод verify
для объекта client
. Для этого вам необходимо знать отпечаток сертификата, который использует веб-сервер.
Итак, ваш код будет выглядеть примерно так:
#include "ESP8266WiFi.h"
//General Definition
#define SERVER_FINGERPRINT "C0 5D 08 5E E1 3E E0 66 F3 79 27 1A CA 1F FC 09 24 11 61 62"
const char server[] = "https://7751b6b1.ngrok.io";
//localhost into server via ngrok
const char* MY_SSID = "Gastzugang";
const char* MY_PWD = "12345678";
String mov; //create Text string
WiFiClientSecure client; //Create Wifi client
//Setup
void setup()
{
Serial.begin(115200);
Serial.println("Connecting to "+*MY_SSID);
WiFi.begin(MY_SSID, MY_PWD);
Serial.println("going into wl connect");
int PIR_output=16; // output of pir sensor
while (WiFi.status() != WL_CONNECTED) //not connected, ...waiting to
connect
{
delay(1000);
Serial.print(".");
}
Serial.println("wl connected");
Serial.println("");
Serial.println("Credentials accepted! Connected to wifi\n ");
Serial.println("");
}
void loop() {
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
Serial.println("1");
}
else {
mov = "0" ;
Serial.println("0");
}
if (client.connect(server, 8095)) { //Connecting at the IP address and port
Serial.println("connected to server");
if (client.verify(SERVER_FINGERPRINT, host)) {
Serial.println("certificate matches");
} else {
Serial.println("certificate doesn't match");
}
WiFi.printDiag(Serial);
client.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
client.print("movement=");
client.print(mov);
client.stop();
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
delay(50);
}
Три важных изменения:
- определяя client
как WiFiClientSecure
вместо WiFiClient
- добавление вызова на client.verify
после успешного подключения
- предоставление постоянного отпечатка пальца сервера для сравнения с
Отпечаток, который я предоставил, не будет работать с вашим сервером. Вам нужно будет найти его отпечаток самостоятельно. Вы можете сделать это, перейдя в него с помощью веб-браузера, такого как Chrome, и щелкнув по полю «Безопасное» в адресной строке (в случае Chrome). Нажмите «Сертификат», затем разверните «Детали» в представлении сертификата. Прокрутите до конца, и вы увидите два отпечатка пальца, SHA-256 и SHA-1. Скопируйте отпечаток SHA-1 и предоставьте его в виде строки, например, SERVER_FINGERPRINT
, который я включил.
Вы можете пропустить проверку сертификата, если хотите, но тогда вы не будете уверены, что на самом деле вы подключаетесь к реальному серверу, а не к серверу, имитирующему его.
Более подробная информация о WiFiClientSecure
на Client Secure , включая еще один пример того, как найти отпечаток сервера под Windows.
Если у вас возникнут проблемы, я бы порекомендовал разобрать вашу программу до базовых - WiFi
connect, а затем WiFiClientSecure
; не беспокойтесь о ИК-датчике или чем-либо еще. Как только вы получите урезанную версию, работающую с вашим сервером, перенесите сделанные изменения обратно в реальную программу, которую вы пытаетесь заставить работать.
Обновление
Для вашего исправленного кода оно написано прямо сейчас:
client.println("Get /ethernet/data.php?"); //making a http request
Serial.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
client.println("movement=1");
Serial.println("movement=1");
}
else {
mov = "0" ;
client.println("movement=0");
Serial.println("movement=0");
}
delay(5000);
client.stop();
}
Попробуйте:
client.print("Get /ethernet/data.php?"); //making a http request
Serial.println("Get /ethernet/data.php?");
//Connecting and Sending values to database
if(digitalRead(16) == HIGH) // reading the data from the pir sensor
{
mov = "1";
client.print("movement=1");
Serial.println("movement=1");
}
else {
mov = "0" ;
client.print("movement=0");
Serial.println("movement=0");
}
client.println(" HTTP/1.1");
client.println("Host: 7751b6b1.ngrok.io");
delay(5000);
client.stop();
}
В том виде, в котором оно написано сейчас, оно обрезает параметры в URL с помощью новой строки, пропускает тег «HTTP / 1.1» в конце строки и не указывает виртуальный хост, с которым вы пытаетесь связаться (может или может не быть проблемой в зависимости от вашего сервера). Нужно отправить две строки на веб-сервер, выглядя так:
GET /ethernet/data.php?movement=1 HTTP/1.1
HOST: 7751b6b1.ngrok.io