ESP8266 Не могу подключиться к клиенту - PullRequest
0 голосов
/ 16 мая 2018

У меня есть очень простая база данных mysql, которая может получать новые значения с помощью простой команды:

 http://7751b6b1.ngrok.io/ethernet/data.php?movement=test

Если я ввожу это в моем браузере, «test» получает запись в банк данных.Теперь я хочу записать в эту базу данных через мой ESP8266:

 #include "ESP8266WiFi.h"
//General Definition

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
WiFiClient 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");
 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);
 }

Чтение датчика и подключение к Wi-Fi работают хорошо, но я получаю сообщение «Ошибка подключения».

Может кто-нибудь определить ошибку?

Редактировать: обновленный код

#include "ESP8266WiFi.h"
//General Definition
const char server[] = "http://b90e9280.ngrok.io"; //localhost?
const char* MY_SSID = "Gastzugang";
const char* MY_PWD =  "12345678";
String mov; //create Text string
WiFiClient 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() {
//here sensor reading einfügen

if (client.connect(server, 80)) { //Connecting at the IP address and port
Serial.println("connected to server");
WiFi.printDiag(Serial);
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();
}
else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
delay(50);
}

1 Ответ

0 голосов
/ 16 мая 2018

Документация по этому вопросу не ясна, но 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
...