• Система автоматизации с открытым исходным кодом на базе 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
Вот, блин, как просто все оказалось - прекрасно работает.
И огород с разбором заголовков городить не нужно.

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