• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как получить "чистый" ответ от сервера

ESP-01S

Member
Доброй ночи всем неспящим!

Цель: получить "внешний" IP устройства.
Способ реализации: Отправляем запрос на api.ipify.org а потом имеем геморрой с разбором ответа, который приходит в следующем виде

HTTP/1.1 200 OK
Server: Cowboy
Connection: close
Content-Type: text/plain
Vary: Origin
Date: Wed, 09 Sep 2020 16:03:19 GMT
Content-Length: 13
Via: 1.1 vegur

82.209.228.10
Смысл кода - узнать значение Content-Length и вернуть указанное количество символов с конца строки.

Кому интересно - сам код:
Код:
#include <ESP8266WiFi.h>
                             
const char* ssid = "SSID-name";
const char* password = "SSID-pwd";
const char* host = "api.ipify.org";

IPAddress ip (192, 168, 100, 9);                                
IPAddress gateway (192, 168, 100, 1);
IPAddress subnet (255, 255, 255, 0);
IPAddress dns1 (192, 168, 100, 1);

WiFiClient client;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet, dns1, dns1);
 
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
}

void loop()
{
  Serial.println("=================================");
  if (client.connect(host, 80))
      {
    Serial.println("Connected");
    client.print( "GET /?format=text ");
    client.println( "HTTP/1.1");
    client.print( "Host:" );
    client.println(host);
    client.println( "Connection: close" );
        client.println();
        client.println();

   delay(500); 
      while (client.available())
        {
        String c = client.readString();
        Serial.println("Request from browser: ");
        int pos = c.substring(c.indexOf("Content-Length: ")+16,c.indexOf("Content-Length: ")+19).toInt();
        Serial.print("RESULT - "); Serial.println(c.substring(c.length()-pos,c.length()));
        }
      client.stop();
      client.flush();
      delay(100);
      }
   else
      {
       client.stop();
       Serial.println ("ERR connect!!");
      }
  delay(500);
}
И вот здесь возникает вопрос - неужели нет более простого способа получить "чистый" текстовый ответ (в данном случае "82.209.228.10") без примесей в виде заголовков, т.е. как на видимой части страницы браузера?
PS^ по коду прошу сильно не пинать - только что написан под конкретную задачу, но за конструктивную критику буду отдельно благодарен.
 

enjoynering

Well-known member
можно. смотрите пример PathArgServer.ino и исходники ...libraries/ESP8266WebServer/src/ESP8266WebServer.h и функции в нем:

Код:
collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
header(const String& name) const; // get request header value by name
ну и дальше гугл в помощь.
 

ESP-01S

Member
Вот, блин, как просто все оказалось - прекрасно работает.
И огород с разбором заголовков городить не нужно.

Большое спасибо!
 
Сверху Снизу