• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь esp8266 и GET

iopq

New member
подскажите пожалуйста уже очень долго мучаюсь а толку нет. как с помощью модуля esp8266mod отправлять GET запросы серверу?
вот мой код-
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
WiFiClient client;
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bme;
void setup()
{
Serial.begin(115200);
if (!bme.begin())
{ 
while (1);
}
WiFi.begin("name", "pass");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
} 
void loop() {
if (!client.connect("site.ru",80))
{
client.stop();
return;
}
String url = "/111/bmp280.php?Temp="+(String)bme.readTemperature()+"&Press="+(String)bme.readPressure();
client.println("GET "+url+" HTTP/1.1\r\nHost: "+"site.ru"+"\r\nConnection: close\r\n\r\n");
client.stop();
}
знаю что к wi-fi подключается и с сервером соединяется однако запросы не отправляются. пробовал по всякому
 

Belerafon

New member
Посмотрите что в ответ от сервера приходит, возможно там подсказка, код ошибки будет, логи сервера посмотреть, может там будет что то. Сервер случаем не на https ?
 

Dminriy_Donskoy

New member
та же проблема
хост (Сервер) на https.
логин хоста под паролем... может здесь зарыто? но - к хосту от еспшки конектится.
использую библиотеку #include <WiFiClientSecure.h>
из командной строки браузера хост данные принимает, от еспшки - не принимает.
где то читал, что не все серверы разрешают изменение данных на хосте GET-запросом.
есть решение? или таки да - не всем дозволено изменять данные хоста?
или можно разрешить как то в тексте index.php файла хоста???
 

Алексей.

Active member
из командной строки браузера хост данные принимает, от еспшки - не принимает.
Немного не привычная терминология "командная строка браузера" возможно это то что указано в адресной строке.
Если одни запросы принимаются, а другие нет, сравниваем запросы и находим отличия.
 

Dminriy_Donskoy

New member
Немного не привычная терминология "командная строка браузера" возможно это то что указано в адресной строке.
Если одни запросы принимаются, а другие нет, сравниваем запросы и находим отличия.
спасибо за уточнение - да "адресная строка браузера".
возможно всё же играет роль откуда запрос на хост отправлен?
сравниваем:
1) Туристическое агентство ТурБюро
2) String url = "/index.php?serial=";
url += API_KEY;
url += "&php_dzn=";
url += String(dzn);
Serial.print("requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
 

Dminriy_Donskoy

New member
спасибо за уточнение - да "адресная строка браузера".
возможно всё же играет роль откуда запрос на хост отправлен?
сравниваем:
1) Туристическое агентство ТурБюро
2) String url = "/index.php?serial=";
url += API_KEY;
url += "&php_dzn=";
url += String(dzn);
Serial.print("requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
;) тур бюро само нарисовалось;) просто на этом сайте экспериментировал с приёмом данных.
1) esp8266kpn.000webhostapp.com/index.php?php_dzn=130
 

Алексей.

Active member
Что то не понятно чего с чем сравниваете?
Что у вас в переменной host известно только вам. Может домен а может ip адрес.
утилитой curl выполнил два запроса, отключил дефалтовые заголовки, чтоб остались только те что у вас (только Host)
в первом запросе использовал домен
Код:
alex@lenovo-e480:~$ curl -v -H 'User-Agent:' -H 'Accept:' 'https://esp8266kpn.000webhostapp.com/index.php?serial=1234&php_dzn=130'
*   Trying 145.14.145.233...
* TCP_NODELAY set
* Connected to esp8266kpn.000webhostapp.com (145.14.145.233) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.000webhostapp.com
*  start date: Jun 13 00:00:00 2018 GMT
*  expire date: Jun 13 12:00:00 2019 GMT
*  subjectAltName: host "esp8266kpn.000webhostapp.com" matched cert's "*.000webhostapp.com"
*  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=RapidSSL TLS RSA CA G1
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x556478a83900)
> GET /index.php?serial=1234&php_dzn=130 HTTP/2
> Host: esp8266kpn.000webhostapp.com
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< date: Tue, 28 May 2019 18:00:51 GMT
< content-type: text/html; charset=UTF-8
< server: awex
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-request-id: 04e241dc9504945799e2790afa8aaca1
<
<!DOCTYPE html>
<html>
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <title>Туристическое агентство ТурБюро</title>
   <meta name="description" content="Описание страницы" />
   <meta name="keywords" content="Ключевые слова" />
   <link rel="stylesheet" type="text/css" href="style.css" media="screen" />
   </head>
...
Не обращаем внимание на строчки с коннектом и хендшейком.
Запрос с 32-й строки по 34-ю
Ответ с 36-й и далее

Во втором запросе использовал ip адрес, ну и curl-у сказал не выполнять проверку сертификатов
Код:
alex@lenovo-e480:~$ curl --insecure -v -H 'User-Agent:' -H 'Accept:' 'https://145.14.145.233/index.php?serial=1234&php_dzn=130'
*   Trying 145.14.145.233...
* TCP_NODELAY set
* Connected to 145.14.145.233 (145.14.145.233) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=*.000webhostapp.com
*  start date: Jun 13 00:00:00 2018 GMT
*  expire date: Jun 13 12:00:00 2019 GMT
*  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=RapidSSL TLS RSA CA G1
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55d1b7d5f900)
> GET /index.php?serial=1234&php_dzn=130 HTTP/2
> Host: 145.14.145.233
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 404
< date: Tue, 28 May 2019 18:16:05 GMT
< content-type: text/html
< content-length: 8535
< etag: "5cda79a6-2157"
< server: awex
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
< x-request-id: 05d27eb96023583700a8a6b2df6c38b9
<
<!doctype html>
<html>
<head>
    <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-10701068-1', 'auto');
        ga('send', 'pageview');
        ga('send', 'event', 'error-page', 'open', 'no-such-website');
    </script>


...
Запрос во втором случае отличается только заголовком Host а ответ совсем другой, получили вместо 200-тки код 404.
Сервер получающий запросы, проксирует их по доменам и урлам, не найдя куда проксировать запрос, вернул 404-й код, и запрос просто не долетел до пых-пыха который /index.php должен обрабатывать.
 

Dminriy_Donskoy

New member
Доброго дня Алексей!
Огромное спасибо, что попытались разобраться с моим вопросом.
Извините, что не указал значение переменной host - думал, что библиотека WiFiClientSecure.h работает только с именами доменов, в моём варианте имя домена "esp8266kpn.000webhostapp.com".
1) - это текст в адресной строке браузера, который передаёт значение переменной php_dzn хосту "esp8266kpn.000webhostapp.com"
2) - это фрагмент скетча ESP8266 который формирует GET-запрос хосту "esp8266kpn.000webhostapp.com" , чтобы передать значение переменной php_dzn.
во втором случае переменная хостом не принимается.
подтверждение выполнения команды client.connect есть. Если надо могу выложить весь текст скетча.
обменом информацией в инете не владею, поэтому сам разобраться не могу.
 

Алексей.

Active member
обменом информацией в инете не владею, поэтому сам разобраться не могу.
А интернеты для проверки (сравнения) запросов и не особо нужны.
Этап установления соединения (пусть даже защищенного) вы успешно прошли, можете потренироваться уже без защищенного соединения и без интернетов в своей локальной сети.
Запросы отправляете с браузера и с esp на локальный ПК и сравниваете.

П.С.
В составе СДК есть библиотека ESP8266HTTPClient и примеры её использования
для защищенного соединения BasicHttpsClient.ino
Код, который вы пытаетесь реализовать, построение построение заголовков запроса в вашем случае, уже реализован библиотекой.
По какой причине вы не пользуетесь этой библиотекой из СДК? Нет доверия к библиотекам? Свой код всегда лучше?
 

Dminriy_Donskoy

New member
А интернеты для проверки (сравнения) запросов и не особо нужны.
Этап установления соединения (пусть даже защищенного) вы успешно прошли, можете потренироваться уже без защищенного соединения и без интернетов в своей локальной сети.
Запросы отправляете с браузера и с esp на локальный ПК и сравниваете.

П.С.
В составе СДК есть библиотека ESP8266HTTPClient и примеры её использования
для защищенного соединения BasicHttpsClient.ino
Код, который вы пытаетесь реализовать, построение построение заголовков запроса в вашем случае, уже реализован библиотекой.
По какой причине вы не пользуетесь этой библиотекой из СДК? Нет доверия к библиотекам? Свой код всегда лучше?
Спасибо, буду тренироваться ;)
 
Сверху Снизу