• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Код, который вы пытаетесь реализовать, построение построение заголовков запроса в вашем случае, уже реализован библиотекой.
По какой причине вы не пользуетесь этой библиотекой из СДК? Нет доверия к библиотекам? Свой код всегда лучше?
Спасибо, буду тренироваться ;)
 
Сверху Снизу