Доброй ночи всем неспящим!
Цель: получить "внешний" IP устройства.
Способ реализации: Отправляем запрос на api.ipify.org а потом имеем геморрой с разбором ответа, который приходит в следующем виде
Кому интересно - сам код:
И вот здесь возникает вопрос - неужели нет более простого способа получить "чистый" текстовый ответ (в данном случае "82.209.228.10") без примесей в виде заголовков, т.е. как на видимой части страницы браузера?
PS^ по коду прошу сильно не пинать - только что написан под конкретную задачу, но за конструктивную критику буду отдельно благодарен.
Цель: получить "внешний" IP устройства.
Способ реализации: Отправляем запрос на api.ipify.org а потом имеем геморрой с разбором ответа, который приходит в следующем виде
Смысл кода - узнать значение Content-Length и вернуть указанное количество символов с конца строки.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
Кому интересно - сам код:
Код:
#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);
}
PS^ по коду прошу сильно не пинать - только что написан под конкретную задачу, но за конструктивную критику буду отдельно благодарен.