Salve a tutti,purtroppo nonstante numerose ricerche non sono venuto a capo di questo fastidioso problema :'(,in sintesi:
Utilizzo Arduino (Duemilanove con ATMega328) con l'Ethernet shield per fornire un servizio che,attraverso semplici pagine web ("prodotte" da Arduino) mi permette di pilotare diversi carichi elettrici.
Il problema è che,fin quando i client che utilizzano l'applicazione appartengono alla LAN casalinga (composta da un Modem/Router/AP ADSL collegato a due switch in cascata) il tutto funziona in maniera perfetta,ma non appena cerco di accedere dall' "esterno",il led LINK sull'eth shield comincia a lampeggiare e il led TX rimane fisso acceso.
Sul client che cerca di collegarsi, la connessione rimane "appesa" in attesa di dati,lo stato di "trance" in cui cade l'arduino viene interrotto solo attraverso un reset.
Premettendo che:
-I parametri di rete dell'eth shield mac,ip,gw,nmask) sono corretti
-Sul router attivo il Virtual Server verso la coppia ip:porta dell'arduino
-Sono arrivato anche a disattivare il firewall sul Router
-Quando arduino va in "trance" comincia a far sfarfallare anche i led delle porte degli switch che portano dall'eth shield fino al router,rendendo la navigazione in Internet praticamente impossibile (per tutti gli host collegati alla Lan)
Per essere sicuro che non fosse un problema di codice sviluppato,ho fatto gli stessi test con il codice di esempio WebServer,e sono giunto agli stessi risultati :-/
Oh si,per esempio usavo Serproxy per accedere da postazione remota (al di fuori della LAN) ad arduino,in effetti lo shield l'avevo preso proprio per eliminare il pc dalla "catena"
Tra l'altro ho scritto un semplice programma "echo" che ascolta sulla 23,aperto la porta sul router,e mi sono collegato con ip esterno ad arduino,la connessione va a buon fine però non appena riceve il carattere (di cui dovrebbe fare l'echo) fa quello che ho descritto nel post precedente,cmq a quanto pare la connessione la stabilisce,almeno così sembra.
Se ti viene altro in mente posta pure.
EDIT:
E' come se non ci fosse "ritorno" nella comunicazione,per esempio se faccio girare uno sketch del tipo:
Ovviamente con le dovute inizializzazioni,da lcale mi stampa in loop testo,il led LINK si accende e spegne,RX e TX fissi accesi,mentre se lo faccio da remoto LINK si accende e si spegne,RX "scintilla" solo una volta (non appena metto qualcosa nel buffer di lettura) poi si spegne e TX fisso acceso,è come se non arrivassero le conferme della "consegna" dei caratteri........
Come si vede in entrambi i casi il Three Wa HandShaking viene portato a termine con successo (la connessione in effetti viene stabilita),solo che nel secondo caso,dopo l'invio da parte dell'host di un dato ad Arduino,che dovrebbe far partire la scrittura di "Testo" (vedi codice precedente post) segue,invece che di un semplice msg di ACK (che rappresenta la conferma ad ogni msg ricevuto),un msg di PUSH+ACK (dove il flag push,che onestamente non conoscevo,dovrebbe richiedere alla macchina che lo riceve di svuotare il buffer) al quale però l'host che lo riceve non risponde (o non sa cosa rispondere),così viene inviato un numero enorme di duplicati di quest'ultimo messaggio (in circa 10 sec. se ne contano 5000,si fermano solo perchè faccio il reset di Arduino).
Mi verrebbe da dire che c'è un errore in qualche funzione della Libreria Ethernet,ma mi sembra assurdo che non abbia trovato "letteratura" in merito,tranne il caso di perdita della connessione dopo x tempo,del problema del cold start,non ho trovato niente di simile a questo............
Per favore se qualcuno ha qualche ipotesi (anche la più bizzarra) mi faccia sapere.
Faccio Up giusto per la cronaca,magari sarà utile a qualcuno in futuro.
Sono quasi sicuro che il problema sia del modem/router,purtroppo non so perchè ma,nonostante tolga il firewall,metta l'host Arduino nella zona demilitarizzata (DMZ) (oltre ad abilitare il port forwarding) il router non fa uscire i pacchetti generati da Arduino (ma ricevo tutto ciò che gli viene inviato dall'esterno),nei log di sicurezza,il router interpreta i pacchetti di Arduino come un attacco di tipo Smurf (un DOS basato sull'echo dei pacchetti ICMP).
Purtroppo il router (USR 9110) è abbastanza vecchiotto (ce l'ho da 4 anni) e lo sviluppo del FW si è fermato al 2007,quindi credo che le speranze di risolvere/bypassare il problema siano ridotte al lumicino.