Inviare il proprio ip su un server

Ciao a tutti,
mi chiedevo se è possibile con arduino uno e magari un modulo esp8266,
inviare il proprio ip pubblico su un file che risiede su altervista.
Pensavo a uno sketch che si collega al sito my ip, recupera il dato e lo trasmette sul server.
Evitando cosi' di usare servizi come no ip o dns.org.
O ancora meglio usare un cloud per recuperare il proprio ip.
Ho girovagato su google ma non ho trovato quel che cerco.
Secondo voi è fattibile?
Un saluto a tutti.
Enzo

http://icanhazip.com/
http://checkip.amazonaws.com/
https://wtfismyip.com/text
http://ipinfo.io/ip

happy hacking :wink:

http://api.ipify.org ................ text 98.207.254.136
http://api.ipify.org?format=json ................ json {"ip":"98.207.254.136"}
http://api.ipify.org?format=jsonp ................ jsonp callback({"ip":"98.207.254.136"});
http://api.ipify.org?format=jsonp&callback=getip ................ jsonp getip({"ip":"98.207.254.136"});

if (client.connect("api.ipify.org", 80)) {
    Serial.println("connected");
    client.println("GET / HTTP/1.0");
    client.println("Host: api.ipify.org");
    client.println();
} else {
    Serial.println("connection failed");
}

Grazie ragazzi,
ora non mi rimane che provare come inviare l'ip e salvarlo su un file di testo su altervista.

Posto il mio sketch dove attualmente riesco ad inviare il testo ciao su altervista,
ma non ho capito bene come inviare il mio ip su altervista usando http://api.ipify.org/
più che altro dovendo connettersi a 2 server diversi contemporaneamente non sò come impostare lo sketch:

#include "WiFiEsp.h"

// Emula Serial1 sui pin 6/7 se non presente
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif

char ssid[] = "InfostradaWiFi";            // your network SSID (name)
char pass[] = "xxxxxx";        // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status

char server[] = "nome.altervista.org"; //altervista ip

// Inizializzo l'oggetto Ethernet client 
WiFiEspClient client;

void setup()
{
  // Inizializza seriale per il debug
  Serial.begin(115200);
  // Inizializza seriale per modulo ESP
  Serial1.begin(9600);
  // Inizializza modulo ESP
  WiFi.init(&Serial1);

  // Verifico la presenza dello scudo
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Scudo Wify non presente");
    // Non continuare
    while (true);
  }

  // Tentativo di connessione alla rete Wi-Fi
  while ( status != WL_CONNECTED) {
    Serial.print("Tentativo di connettersi al router in corso : ");
    Serial.println(ssid);
    // Connessione WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  // Se connesso,stampo i dati
  Serial.println("Connesso correttamente con la rete");
  
  printWifiStatus();

  Serial.println();
  Serial.println("Connessione al server in corso...");
  // se si ottiene una connessione , riferisco via seriale
  if (client.connect(server, 80)) {
    Serial.println("Connesso al server");
    // Make a HTTP request
    client.println("GET /arduino.php?prova=Ciao HTTP/1.0");
    
    client.println("Host: nome.altervista.org");
    client.println();
    
  }
}

void loop()
{
  // Se ci sono byte in arrivo disponibili dal server,leggo e stampo
    while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // se il server si disconnette, arresto il client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Disconnesso dal server ...");
    client.stop();

    
// Non fare nulla per sempre
    while (true);
  }
}


void printWifiStatus()
{
  // stampo la SSID della rete a cui si è connessi
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // stampo l'indirizzo IP dello scudo WiFi
  IPAddress ip = WiFi.localIP();
  Serial.print("Indirizzo IP: ");
  Serial.println(ip);

  // stampo l'intensità del segnale ricevuto
  long rssi = WiFi.RSSI();
  Serial.print("Potenza del segnale(RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Aggiornamento:
Riesco a collegarmi ai 2 server contemporaneamente ma non riesco a far scriver sul file txt l'ip ottenuto, posto lo sketch:

#include "WiFiEsp.h"

// Emula Serial1 sui pin 6/7 se non presente
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif

char ssid[] = "InfostradaWiFi";            // your network SSID (name)
char pass[] = "xxxxxxxx";        // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status

char server[] = "nome.altervista.org"; //altervista ip
char server2[] = "api.ipify.org"; //recupero ip

// Inizializzo l'oggetto Ethernet client 
WiFiEspClient client;

void setup()
{
  // Inizializza seriale per il debug
  Serial.begin(115200);
  // Inizializza seriale per modulo ESP
  Serial1.begin(9600);
  // Inizializza modulo ESP
  WiFi.init(&Serial1);

  // Verifico la presenza dello scudo
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Scudo Wify non presente");
    // Non continuare
    while (true);
  }

  // Tentativo di connessione alla rete Wi-Fi
  while ( status != WL_CONNECTED) {
    Serial.print("Tentativo di connettersi al router in corso : ");
    Serial.println(ssid);
    // Connessione WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  // Se connesso,stampo i dati
  Serial.println("Connesso correttamente con la rete");
  
  printWifiStatus();

  Serial.println();
  Serial.println("Connessione al server in corso...");
  // se si ottiene una connessione , riferisco via seriale
  if (client.connect(server, 80)) {
    Serial.println("Connesso al server");
    // Make a HTTP request
    client.println("GET /arduino.php?prova=Ciao HTTP/1.0");
    
    client.println("Host: nome.altervista.org");
    client.println();
    
  }
  if (client.connect(server2, 80)) {
    Serial.println("Connesso al server");
    // Make a HTTP request
    client.println("GET / HTTP/1.0");
    client.println("Host: api.ipify.org");
    Serial.println("ip:");
   client.println("GET /file.txt HTTP/1.0");
   client.println("Host: nome.altervista.org");
    client.println();
    
  }
}

void loop()
{
  // Se ci sono byte in arrivo disponibili dal server,leggo e stampo
    while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // se il server si disconnette, arresto il client
  if (!client.connected()) {
    Serial.println();
    Serial.println("Disconnesso dal server ...");
    client.stop();

    
// Non fare nulla per sempre
    while (true);
  }
}


void printWifiStatus()
{
  // stampo la SSID della rete a cui si è connessi
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // stampo l'indirizzo IP dello scudo WiFi
  IPAddress ip = WiFi.localIP();
  Serial.print("Indirizzo IP: ");
  Serial.println(ip);

  // stampo l'intensità del segnale ricevuto
  long rssi = WiFi.RSSI();
  Serial.print("Potenza del segnale(RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

e questo è l'errore che ho sul serial monitor:

[WiFiEsp] Connecting to api.ipify.org
Connesso al server
ip:
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] Data packet send error (1)
[WiFiEsp] Failed to write to socket 1
[WiFiEsp] Disconnecting  1

Disconnesso dal server ...

Tanto per "informazione", che provider utilizzi?

speedyant:
Tanto per "informazione", che provider utilizzi?

Infostrada

Il file dove scrivi l'ip dove risiede?

speedyant:
Il file dove scrivi l'ip dove risiede?

Come riportato negli sketch prima, il file risiede su altervista

Intanto vedi come sia possibile da altervista scrivere un file, dimenticando arduino per un attimo. Come ti autentichi su altervista? Come puoi interagire con lo "spazio web"?

speedyant:
Intanto vedi come sia possibile da altervista scrivere un file, dimenticando arduino per un attimo. Come ti autentichi su altervista? Come puoi interagire con lo “spazio web”?

Su alervista ho creato questo script per scrivere su un file txt:

  <?php
    $a=$_GET["prova"];
    if (strlen($_GET["prova"])){
        $write_file = fopen("file.txt","w");
        fwrite($write_file,$a);
        fclose($write_file);
        }
?>

E raggiungo il sito mettendo il nome host come server su arduino e richiamo lo script con il comando get su arduino.
Difatti nel primo sketch ho scritto “ciao” come prova e il file è stato scritto correttamente su altervista all’interno del mio file txt.
Il problema è come estrapolare solo l’ip ottenuto da api.ipify.org e inviarlo sul mio file txt.

Credo che ti basti questo:

<?php

$ip = $_SERVER["REMOTE_ADDR"];
$write_file = fopen("file.txt","w");
fwrite($write_file,$ip);
fclose($write_file);

?>

Il problema è sul
clientprintln (get/arduino.php?prova=ciao )
Non ho capito il metodo da usare per fargli stampare l'IP su altervista dopo il segno =

In questo caso, tutto quello che segue il segno uguale (compreso) è superfluo.
Ogni volta che ci si collega a quella pagina php (con un browser, con Arduino o in qualunque modo), lo script salva l'ip del client su file.txt.

supergiox:
In questo caso, tutto quello che segue il segno uguale (compreso) è superfluo.
Ogni volta che ci si collega a quella pagina php (con un browser, con Arduino o in qualunque modo), lo script salva l'ip del client su file.txt.

Adesso ho capito perfettamente cosa intendevi dire.
Ho provato lo script che hai postato ed ha salvato un ip che però non è il mio ip pubblico.
Penso sia colpa di altervista che usa il cloudflare e maschera l'ip.

Ho risolto modificando lp script così:

   <?php

$ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
$write_file = fopen("file.txt","w");
fwrite($write_file,$ip);
fclose($write_file);

?>

Grazie mille per le dritte ragazzi.
Buona serata.
Enzo