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

Нужна помощь Отправка GET запроса

Добрый день.
Очень нужна помощь по отправке GET запроса с ЕSP 8266.
Работаю с библиотекой 8266HTTPClient.h
Пишет,что не авторизован.
 

view24

Member
Добрый день.
Очень нужна помощь по отправке GET запроса с ЕSP 8266.
Работаю с библиотекой 8266HTTPClient.h
Пишет,что не авторизован.
Действительно, иногда сервер допускает только авторизованные запросы. Значит, нужно знать Ваш или чей-то логин и пароль. Если знаете, то измените URI запроса как-то так:
...... http://логин:пароль@111.111.1111.111.....
 

Dminriy_Donskoy

New member

Алексей.

Active member
https://esp8266.ru/forum/threads/esp8266-i-get.2573/#post-62102
там информация о проблемке написана от моего имени.
получил совет тренироваться с библиотеками;), а вот грамотного ответа пока никто не написал.
Спрашивал вас
В составе СДК есть библиотека ESP8266HTTPClient и примеры её использования
для защищенного соединения BasicHttpsClient.ino
Код, который вы пытаетесь реализовать, построение построение заголовков запроса в вашем случае, уже реализован библиотекой.
По какой причине вы не пользуетесь этой библиотекой из СДК?
Ответа не получил, да ещё мой вопрос воспринят как совет тренироваться с библиотеками.
Похоже вам код готовый нужен а не советы.
 

Dminriy_Donskoy

New member
Спрашивал вас

Ответа не получил, да ещё мой вопрос воспринят как совет тренироваться с библиотеками.
Похоже вам код готовый нужен а не советы.
Алексей, я Вам без сомнений благодарен за участие, и я воспользуюсь Вашим советом, когда разберусь как работать с предложенной Вами библиотекой.
Но, во первых, хотелось получить результат понятным и простым методом (GET-запросом), который, кстати, большинством и применяется (мажордомо и др.).
А так как не "выстрелило" быстро, пробовать другими способами можно и нужно, но хотелось бы понимать физику процесса! Почему не "выстрелило", как можно прочитать ответ протокола обмена HTTPS об обмене данными с сервером и расшифровать его, чтобы увидеть почему данные не принялись.
Так, что дело тут не в достижении результата, а в понимании процесса.
Уверен, если в слепую использовать библиотеки, то никакой уверенности в стабильной работе устройства не будет.
Спасибо.
 

Алексей.

Active member
Dminriy_Donskoy, Я только предлагал сравнить два запроса, успешный с браузера и неуспешный с модуля, завернув их на локальный ПК (по причине отсутствия контроля запросов на удаленном сервере).
Таким образом можно оценить в чем отличия и попытаться разобраться.
Вы это делали?
 

Dminriy_Donskoy

New member
Dminriy_Donskoy, Я только предлагал сравнить два запроса, успешный с браузера и неуспешный с модуля, завернув их на локальный ПК (по причине отсутствия контроля запросов на удаленном сервере).
Таким образом можно оценить в чем отличия и попытаться разобраться.
Вы это делали?
это ещё дольше... сначала надо будет научиться "поднимать" сервер на локальном пк :)
 

Алексей.

Active member
сначала надо будет научиться "поднимать" сервер на локальном пк :)
В этом нет ничего сложного, да и сервер настоящий не нужен. Нужно только принять входящее tcp соединение, отобразить что передает клиент и передать ему заготовленный ответ.
Есть удобная утилита nc (NetCat) нет-кат, на ней будем прослушивать tcp порт и отправлять заготовленный ответ подключенному клиенту.
Подготовим ответ в например файле response
Код:
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=UTF-8
Content-Length: 10
Connection: close

Not Found
Запустим нет-кат
Код:
alex@lenovo-e480:~$ nc -v -C -l 8080 < response
Listening on [0.0.0.0] (family 0, port 8080)
Проверяем запрос от примитивного скетча
Код:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin("*****", "*****");
  Serial.println("Connecting to wifi ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("connected");

  WiFiClient client;
  if (!client.connect("192.168.14.47", 8080)) {
    Serial.println("tcp connection failed");
  } else {
    HTTPClient http;
    Serial.println("[HTTP] begin...");
    if (http.begin(client, "http://esp8266kpn.000webhostapp.com/index.php?serial=1234&php_dzn=130")) {
      Serial.println("[HTTP] GET...");
      int code = http.GET();     
      if (code > 0) {
        Serial.printf("[HTTP] GET... code: %d \n", code);
        Serial.println(http.getString());
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s \n", http.errorToString(code).c_str());
      }
      http.end();
    } else {
      Serial.println("[HTTP] failed");
    }
  }
}

void loop() {
}
Нет-кат выводит
Код:
alex@lenovo-e480:~$ nc -v -C -l 8080 < response
Listening on [0.0.0.0] (family 0, port 8080)
Connection from 192.168.14.72 61056 received!
GET /index.php?serial=1234&php_dzn=130 HTTP/1.1
Host: esp8266kpn.000webhostapp.com
User-Agent: ESP8266HTTPClient
Connection: close
Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
Вывод модуля в сериал
Код:
Connecting to wifi
..
connected
[HTTP] begin...
[HTTP] GET...
[HTTP] GET... code: 404
Not Found
Тот ответ что подготовили то и получил клиент.

Попробуем на браузере ФФ.
для того чтоб браузер не пошел разрешать домен esp8266kpn.000webhostapp.com на DNS, этот домен пропишем на локальном ПК в хостах.
Ещё раз запустим нет-кат, а на браузере откроем страницу
Код:
http://esp8266kpn.000webhostapp.com:8080/index.php?serial=1234&php_dzn=130
Нет-кат выводит
Код:
alex@lenovo-e480:~$ nc -v -C -l 8080 < response
Listening on [0.0.0.0] (family 0, port 8080)
Connection from esp8266kpn.000webhostapp.com 46166 received!
GET /index.php?serial=1234&php_dzn=130 HTTP/1.1
Host: esp8266kpn.000webhostapp.com:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
 

Dminriy_Donskoy

New member
Алексей, спасибо Вам за помощь (разъяснения), но в результате я не понял, что мне с этим делать.
Сделать вывод, что хост esp8266kpn.000webhostapp.com не принимает данные от еспшки
или повторить выше описанное на своём компе?
или что то изменить в файлах хоста, чтобы заработало?
или, может он (хост) данные принимает, а рнр файл не корректно их извлекает (присваивает внутренней переменной)?
и таки, да! провёл такой эксперимент: в рнр коде присваиваю значение переменной php_dzn только если она передавалась, т.е.
if ( !empty( $_GET['php_dzn'] ))
{
$dzn=$_GET['php_dzn'];
}
и что в результате: значение переменной не сохраняется ! её можно увидеть только в момент передачи хосту, поэтому и видим при передаче через строку запроса браузера. При повторном запросе к хосту, если не передавать значение переменной, она опустошается.
в общем, без записи в базу данных переменную, переданную на хост от еспешки не уведеть, если не прописать в базу данных, или я ошибаюсь?
 

Алексей.

Active member
Если запросы с браузера обрабатываются успешно, то и менять со стороны хоста ничего не требуется.
из командной строки браузера хост данные принимает, от еспшки - не принимает.
Я неоднократно предлагал сравнить запросы, отправляемые на хост.
Как сравнить запросы не имея возможности смотреть логи со стороны хоста, завернув их на локальный ПК, я уже показал.
Вы почему то упорно не хотите привести (показать) два запроса. Если в запросах есть секретные данные, замените их например звездочками '*'
и таки, да! провёл такой эксперимент: в рнр коде присваиваю значение переменной php_dzn только если она передавалась, т.е.
if ( !empty( $_GET['php_dzn'] ))
{
$dzn=$_GET['php_dzn'];
}
и что в результате: значение переменной не сохраняется !
Как на пых-пыхе определяете, что запрос был? Если запрос не долетел до хоста, чего сохранять собрались?
Где лог успешного запроса браузера и неуспешного запроса esp?
В запросе обязательно должн совпадать в стартовой строке выполняемый метод и uri, версия протокола не обязательно. Обязательно должен совпадать заголовок Host:
 

Dminriy_Donskoy

New member
Если запросы с браузера обрабатываются успешно, то и менять со стороны хоста ничего не требуется.
Я неоднократно предлагал сравнить запросы, отправляемые на хост.
Как сравнить запросы не имея возможности смотреть логи со стороны хоста, завернув их на локальный ПК, я уже показал.
Вы почему то упорно не хотите привести (показать) два запроса. Если в запросах есть секретные данные, замените их например звездочками '*'
Как на пых-пыхе определяете, что запрос был? Если запрос не долетел до хоста, чего сохранять собрались?
Где лог успешного запроса браузера и неуспешного запроса esp?
В запросе обязательно должн совпадать в стартовой строке выполняемый метод и uri, версия протокола не обязательно. Обязательно должен совпадать заголовок Host:
ну, да, Вы правы..., но я о другом писал:
1) отправляю на хост значение переменной
esp8266kpn.000webhostapp.com/index.php?serial=1234&php_dzn=130
и выводится в браузере значение
php_dzn=130
тут же после этого:
2) просто захожу на хост без передачи значения переменной
esp8266kpn.000webhostapp.com
и в браузере значение переменной не выводится! - оно стало пусто
php_dzn=""
т.е. не сохраняется рнр- программой хоста.
значит, может получаться так что еспшка переменную передала, а когда я захожу на хост, чтобы посмотреть её значение набрав в браузере:
esp8266kpn.000webhostapp.com
- значение переменной пусто.
 

Dminriy_Donskoy

New member
ну, да, Вы правы..., но я о другом писал:
1) отправляю на хост значение переменной
esp8266kpn.000webhostapp.com/index.php?serial=1234&php_dzn=130
и выводится в браузере значение
php_dzn=130
тут же после этого:
2) просто захожу на хост без передачи значения переменной
esp8266kpn.000webhostapp.com
и в браузере значение переменной не выводится! - оно стало пусто
php_dzn=""
т.е. не сохраняется рнр- программой хоста.
значит, может получаться так что еспшка переменную передала, а когда я захожу на хост, чтобы посмотреть её значение набрав в браузере:
esp8266kpn.000webhostapp.com
- значение переменной пусто.
переменная выводится обычной командой
print ($dzn);
 

CodeNameHawk

Moderator
Команда форума
т.е. не сохраняется рнр- программой хоста.
значит, может получаться так что еспшка переменную передала, а когда я захожу на хост, чтобы посмотреть её значение набрав в браузере:
Сама ваша переменная не сохранится, она будет видна, пока файл на сервере открыт, его (файл) открывает есп, на время передачи данных.
Перед закрытием файла, данные надо самому сохранить.
Если данных не много, сохраняйте в файл на сервере( на некоторых серверах требуется разрешить запись файлов), если данных много, удобно записывать в базу данных.
 

Dminriy_Donskoy

New member
Сама ваша переменная не сохранится, она будет видна, пока файл на сервере открыт, его (файл) открывает есп, на время передачи данных.
Перед закрытием файла, данные надо самому сохранить.
Если данных не много, сохраняйте в файл на сервере( на некоторых серверах требуется разрешить запись файлов), если данных много, удобно записывать в базу данных.
спасибо, теперь понятно
 
Сверху Снизу