Su', non litigate: aggiornare quella cosa è inutile, perché dyndns.it richiede o un pagamento oppure il rinnovo ogni 30 giorni, che diventa una menata, specie se si è come me in CIG, ops ferie ,spesso (e mi dispiace per gli altri)
altri servizi simili sono macchinosi o poco documentati o richiedono anch'essi riti voodoo per usarli stabilmente
l'unico con il quale mi son trovato bene è change-ip, che non richiede il rinnovo sul sito e non rompe troppo le balle
Ricorderete che io ho solo una nodeMcu (ESP12E) che usavo per il termoremoto
ricorderete anche che prima di trovarmi con due pesi e due misure stavo trasformando il termoremoto in una sorta di maggiordomo via bot di telegram:
........telegram ho speso 150 euri in donnaccie........
centocinquanta euro segnati sul conto divertimenti, signore
ad adesso il conto divertimenti vale 758 euro, signore
mi piace la parte dove mi chiama signore...........
altro che "Mercedes ho freddo", molto meglio
comunque mi son trovato comodo a gestire anche il dns dinamico con questo coso
come sapete il termoremoto andava su una nodeMcu, anche maggiordomo gira li'
però non dovrebbe essere difficile il porting su altro, ho usato solo roba standard
per prima cosa, una cosina che mi mancava
IPAddress nslookup(char * nome)
{
IPAddress ip;
WiFi.hostByName(nome, ip);
return ip;
}
non sono sicuro che wifi.hostbyname esiste anche fuori da un 8266 però nslookup sarebbe comunque facile da riscrivere, e non nemmeno vitale per il programma
per prima cosa serve di schedulare l'azione, una cosa semplice con l'uso di millis, basta fare un test ogni 10 minuti o anche più
basta una sola chiamata
sincronizzadns();
la sincronizzadns:
IPAddress sincronizzaddns(void)
{
static IPAddress vecchioip = {0, 0, 0, 0};
IPAddress mioip = myip();
IPAddress nullo = {0, 0, 0, 0};
if (mioip != nullo)
{
if (mioip != vecchioip)
{
vecchioip = mioip;
aggiornadyndns(vecchioip);
}
}
return vecchioip;
}
come vedete restituisce un indirizzo IP (quello attuale), viene comodo per usarla contestualmente ad una stampa
naturalmente myip() restituisce l'indirizzo ip attuale, leggendolo dal sito di change-ip
IPAddress myip(void)
{
IPAddress ipaddr;
char trigger[] = "<!--IPADDR=";
char fine = '-';
char server[] = "ip.ChangeIP.com";
WiFiClient cl;
if (cl.connect(server, 80))
{
unsigned long int tempo = millis();
cl.println("GET / ");
cl.println();
byte index = 0;
int point = 0;
while (millis() - tempo < 1500)
{
if (cl.available())
{
char c = cl.read();
if (trigger[index])
{
if (trigger[index] == c)
{
index++;
}
else
{
index = 0;
}
}
else
{
// se !trigger[index] abbiamo finito il trigger
if (c == fine)
{
index = 0;
cl.stop();
return ipaddr;
}
if (c == '.')
{
point++;
continue;
}
ipaddr[point] = ipaddr[point] * 10 + c - '0';
}
}
}
cl.stop();
}
else
{
// nulla da fare la connessione era già giu
}
return {0, 0, 0, 0};
}
come vedete sia il nome del server che i due trigger di inizio e fine sono parametrizzati
e ricordate la mia libreria di salvataggio variabili (BtW, per questo la ho scritta, non per altro)
Se vi ricordate il mio grep non vuol dire greppia.... vi ci ritroverete, è lo stesso meccanismo, ma ricerca una sola stringa per volta
e quindi la aggiornadyndns
void aggiornadyndns(IPAddress ip)
{
char server[] = "nic.ChangeIP.com";
char dominio[] = "xxxxxxxxxxxxxxxxx";
char user[] = "yyyyyyyyyyyyyy";
char password[] = "zzzzzzzzzzzzz";
WiFiClient cl;
if (cl.connect(server, 80))
{
cl.print("GET /nic/update?u=");
cl.print(user);
cl.print("&p=");
cl.print(password);
cl.print("&cmd=update&hostname=");
cl.print(dominio);
cl.print("&myip=");
cl.print(ip);
cl.print("&useragent=Nelson-Arduino");
cl.println("");
unsigned long int tempo = millis();
while (millis() - tempo < 1500)
{
if (cl.available())
{
char c = cl.read();
// Serial.print(c);
}
}
cl.stop();
}
else
{
}
}
anche qui come vedete i dati sensibili sono su stringhe (di C) e facilemente importabili con la libreria di prima
credo che questo sia soddisfacente
PS: sia ben chiaro: non venitemi a dire che non va, la sto usando da mesi