quinta-feira, 27 de dezembro de 2018

Capturando Endereço IP Externo Público via API


Mas e se vc tiver que saber seu Endereço IP Externo via código pelo Arduino ou ESP8266 ? 

Hummmmmm....

Existem 3 maneiras para capturar o Endereço IP externo que sua Operadora fornece quando vc se conecta a Internet. 

A primeira é manual e é através do seu router. Como minha operadora é VIVO, tenho um router Arcadyan (aquele com 2 antenas). É só vc ir até o STATUS e depois MAIS. Vc vai ver o seu endereço IP externo. Como vc é cliente residencial, seu endereço IP não é FIXO. Endereço fixo isso custa muito $$$. Então seu ip vai mudar todas as vezes que vc se conectar a rede da sua operadora (por isso usamos o NoIP.com para que não precise o tempo todo mapear esse endereço externo). 

Blz...

A segunda é manual através de sites que existem aos montes na Internet...

IN
http://www.meuip.com.br/
http://e-meuip.com/
https://meuip.co/
https://www.localizaip.com.br/

OUT
https://whatismyipaddress.com/
https://www.iplocation.net/find-ip-address
https://www.whatismyip.com/ip-address-lookup/
https://www.expressvpn.com/what-is-my-ip

Mas antes de continuar, é preciso esclarecer algumas "coisinhas" básicas sobre Endereço IP que muitos ainda confundem muito.

Endereço IP da sua Rede Local está restrito a uma faixa de rede que NÃO PASSA PELO SEU ROTEADOR e são chamados de ENDEREÇOS PRIVADOS (RFC 1918). Ou seja, seu roteador NÃO ROTEIA esses pacotes com esses endereços para o mundo exterior... para fora... para a Internet. O máximo que ele faz é usar esse endereço ip da sua rede local com outro endereço ip quando ele tem que fazer NAT no router de borda da sua rede e rastrear cada conexão que vc faz com um socket que seu navegador cria (abra o prompt com CMD e digite netstat -a, vc vai fazer todos os sockets criados pelo seu navegador). É assim que ele identifica cada uma das suas abas do seu navegador.

Então sua Rede Local terá endereços ip como esses...

Endereços Privados (RFC 1918)
(endereços IPs que não são roteados pelo router)

classe A => 10.0.0.0       - 10.255.255.255             1 rede           /8
classe B => 172.16.0.0   - 172.31.255.255             16 redes      /12
classe C => 192.168.0.0 - 192.168.255.255           255 redes    /16

Endereços PÚBLICOS passam pelo seu roteador e são gerados por ele. Não é bemmmm gerados por ele. Mas o endereçamento ip é distribuído pelos gestores de Internet (no Brasil é o NIC.br que faz esse trabalho)para uma operadora quando ela é criada. Ela compra uma faixa de endereços ips públicos e é ela que administra esse endereçamento ip enquanto ela existir.

São esses os Endereços Públicos que vc vai ver nos sites como meuip.com.br....

classe A =>1.0.0.0   - 126.0.0.0
classe B =>128.1.0.0 - 191.254.0.0
classe C =>192.0.1.0 - 223.255.254.0

O endereço ip externo que a Vivo deu para minha conexão foi 187.114.174.237. Esse endereço ip está dentro da faixa de endereço ip público. No caso a 2a. faixa. 

Pronto....bora lá !

A terceira é através de código. Vamos usar o método via API e criar uma conexão com a api api.ipify.org

Usei um NodeMCU ESP-12E.

==========================================================

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char* ssid = "suaredewifi";

const char* password = "suasenha";

//--------------FUNCAO CAPTURA ENDEREÇO IP EXTERNO

String IPExterno()
{
  Serial.println("");
  Serial.println("---------------------------------");
  WiFiClient client;
  if (client.connect("api.ipify.org", 80))
  {
    Serial.println("Conectado ao servidor externo...");
    client.println("GET / HTTP/1.0");
    client.println("Host: api.ipify.org");
    client.println();
  } else {
    Serial.println("Conexão falhou para ipify.org :(");
    return String();
  }
  delay(5000);
  String line;
  while (client.available())
  {
    line = client.readStringUntil('\n');
    // comente esta linha se vc NÃO quiser ver a resposta q o 
    // servidor da api envia para a sua requisição
    //Serial.println(line); 
  }
  return line;
}
//-------------------------------------
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  Serial.print("Conectando a rede wifi...");
  Serial.println(ssid);

  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);
    Serial.print(".");
  }

  Serial.println("");

  Serial.println("WiFi conectado.");
  Serial.print("Endereco IP Rede Local: ");
  Serial.println(WiFi.localIP());
  
}
//-------------------------------------
void loop() {
  String ip = IPExterno();
  Serial.print("Endereço IP Externo: " + ip );

}

==========================================================

A Saída Serial...



Observe que na saída o meu endereço ip da minha rede local 192.168.15.18 está na faixa do endereçamento ip PRIVADO classe C.

Já o endereço IP Público Externo 187.114.174.237 está classe B.

É isso. :)





Nenhum comentário:

Postar um comentário