Problema WiFi shield : errore nella connect

Ciao a tutti, sto usando la formidabile coppia arduinoUNO-WiFi shield per connettermi al mio computer attraverso la rete internet;
Uso le librerie WiFI.h per ottenere un ip , e poi uso la socketIOClient per connettermi al pc con le socket.io...
Sul computer ho un server che ascolta la porta 3000..
Ma purtroppo non riesce a connettersi al server, questo è lo sketch:

#include "SocketIOClient.h"
#include "Ethernet.h"
#include "SPI.h"
#include "WiFi.h"

SocketIOClient client;

char ssid[] = "MIA RETE"; //  your network SSID (name)
char pass[] = ''MIA PASS"                                        

char hostname[] = "MIO_IP";
int port = 3000;
int status= WL_IDLE_STATUS;

void setup() 
                                
              {
                  Serial.begin(9600)                                    
                       status = WiFi.begin(ssid, pass);
                    
                         if ( status != WL_CONNECTED) {
                      
                           Serial.println("Couldn't get a wifi connection");
                             // don't do anything else:
                       while(true);
                      
                    }
                    
                    else if(status == WL_CONNECTED){
                      
                            Serial.println("Connected to wifi");
                          IPAddress ip;
                          
                       ip = WiFi.localIP();
                          
                 Serial.println(ip);
                 Serial.println("\nConnessione al server ..\n");          /*ok fino a qui*/
                  
            //  client.setDataArrivedDelegate(ondata);
           client.connect(hostname,3000);
                        //  if (!client.connect(hostname,3000)) Serial.println(F("Not connected."));
                  
      if (client.connected()) {
                client.send("Client here!");    }
      else if(!client.connected()){ 
                Serial.println("errore connessione");  }
    }
  }


   void loop() 
   {
          client.monitor();
          
   }
          
        
   // websocket message handler: do something with command from server
   void ondata(SocketIOClient client, char *data) {
          Serial.print(data);
}

cosa puo essere?

edit by mod: per favore includere il codice usando gli appositi tag

funziona usando senza passare da intenet, ma in rete locale?

Scusa , ma come dovrei fare per ''restare'' in rete locale?

Ciao,
attenzione che se usi l'IDE 1.0.5 devi aggiornare il firmware dello shield Wifi con quello fornito insieme allo stesso IDE.
Per aggiornare:

Altrimenti prova con un IDE precedente (es. 1.0.4)

urca.. allora se fai ipconfig (windows) o ifconfig (linux) avrai l'elenco delle tue schede di rete. Il tuo ip LOCALE sarà PROBABILMENTE del tipo 192.168.1.X
il tuo ip REMOTO lo vedi da siti come www.mioip.com e normalmente è unico per tutti i PC (in pratica l'ip remoto è del router, che "nasconde" i vari PC dietro la NAT, che devi impostare per far vedere i PC all'esterno, in pratica quello che si fa per i server o programmi p2p come emule e company).

se hai fastweb dillo subiuto che è molto differente.

@Lesto : non sto usando l'ip globale, no no... sto usando l'ip locale che leggo ogni volta facendo ''ifconfig'' su ubuntu... Voglio semplicemente restare nella rete locale e mandare dei maledetti pacchetti Json ad un server che gira sul mio pc.... un server in javascript con node.js......

@Pitusso: si, sto usando la 1.05 e non ho mai aggiornato il firmware; domani mattina ho a disposizione la shield quindi provo ad utilizzare la 1.04 oppure ad aggiornare il firmware....

Ho sistemato un po il codice, e sto utilizzando la versione 1.04 dell'IDE, NON ho ancora aggiornato il firmware ;

  1. WiFi.begin(ssid) funziona correttamente ed ottengo l'ip dell'arduino
  2. client.connect(hostname,3000) non funziona, mi ritorna FALSE....
#include "SocketIOClient.h"
#include "Ethernet.h"
#include "SPI.h"
#include "WiFi.h"

SocketIOClient client;

char ssid[] = "CENTEC"; 

char hostname[] = "10.26.144.37";
int port = 3000;
int status= WL_IDLE_STATUS;

void ondata(SocketIOClient client, char *data) {
Serial.print(data);
}

void setup() 
                  
               
              {
                  Serial.begin(9600);
                   Serial.println("Attempting to connect to the network...");
                     Serial.println(ssid);
                  
                       status = WiFi.begin(ssid);
                    
                         if ( status != WL_CONNECTED) {
                      
                                     Serial.println("Couldn't get a wifi connection");
                                     // don't do anything else:
                                     while(true);
                      
                                }
                    
                    else if(status == WL_CONNECTED){
                      
                      Serial.println("Connected to wifi");
                      IPAddress ip;
                          
                      ip = WiFi.localIP();
                          
                 Serial.println(ip);
                 
                 Serial.println("\nConnessione al server ..\n");

E fin qui è ok, poi

             client.setDataArrivedDelegate(ondata);
         
         if (!client.connect(hostname,3000)) {Serial.println("Not connected.");
         }
      if (client.connected()) {
             client.send("Client here!");    }
    else if(!client.connected()){ 
               Serial.println("errore connessione");  }
    }
  }

  
   void loop() 
   {
         client.monitor();
          
    }

scusa ma "10.26.144.37" che cos'è? poi sulla porta 3000...

E' l'ip del mio computer

wlan0     Link encap:Ethernet  IndirizzoHW c4:17:fe:02:54:10  
          indirizzo inet:10.26.144.37  Bcast:10.26.255.255  Maschera:255.255.0.0
          indirizzo inet6: fe80::c617:feff:fe02:5410/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:100662 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59960 errors:0 dropped:0 overruns:0 carrier:0
          collisioni:0 txqueuelen:1000 
          Byte RX:133756411 (133.7 MB)  Byte TX:7241182 (7.2 MB)

cos'è che non va nella 3000?

che non è un valore standard, quindi si presuppone che tu abbia un programma ad-hoc in ascolto sulla porta 3000 del tuo pc

Come faccio dall'arduino a mandare un semplice ping al server sulla 3000? cosi intanto vedo se il server è raggiungibile dall arduino..

i ping non sono su una porta, ma vanno verso un ip.

per fare un test apri dal terminale di un pc "telnet ip porta" e vedi se così ti colleghi.

Ma cosa ti aspetti di avere sulla porta 3000?

Sulla 3000 ho gia un server in ascolto, un server.coffee che funziona correttamente; perchè è stato gia testato con un client.coffee ...

Per quanto riguarda telnet

marco@marco-Aspire-5740:~$ telnet 10.26.144.37 3000
Trying 10.26.144.37...
Connected to 10.26.144.37.
Escape character is '^]'.

però dovresti provare da u naltro pc in rete interna, per verificare se sono i firewall di windows/router che danno problemi

No, non credo sia problema di firewall, perchè all'interno della rete riesco a raggiungere il mio computer facendo un ping da un altro pc...
Il problema secondo me è nella libreria, ovvero SocketIOClient.h ; sono andato a vedere la definizione della funzione "connect(hostname,port) ",

ed è fatta cosi :

bool SocketIOClient::connect(char thehostname[], int theport) {
if (!client.connect(thehostname, theport)) return false;
hostname = thehostname;
port = theport;
sendHandshake(hostname);
return readHandshake();
}

il problema è quell' realHandshake() che non so che cosa faccia; e mi risulta FALSE..

il fatto che tu PINGHI non vuol dire che le porte siano aperte.
Il ping spesso NON è filtrato dai firewall, mentre, al contrario, i firewall bloccano le porte. Win 7 (ma forse anche vista) in poi hanno un fw intgrato.

Qundi:

  1. pinga da remoto, se KO c'è un problema di connessione;
  2. telnetta da remoto, se KO c'è un problmea di firewall/nat/configurazione del server

Ho capito, sei stato chiaro..
comunque, facendo le ultime prove adesso, vedo che il mio arduino si connette alla rete locale;
mi stampa l'ip dell'arduino;
ma quando va a fare la connect ovviamente si blocca, e il server non stampa niente sulla console...
Non so neanche dove cercare l'errore, se nel server, anche se credo di no, oppure nella definizione della connect, nel SocketIOCLient.cpp

prima di tutto verifica da un altro PC, POI passi all'arduino.
Devi essere straceto che non ci siano problemi nella lan

zio90:
@Pitusso: si, sto usando la 1.05 e non ho mai aggiornato il firmware; domani mattina ho a disposizione la shield quindi provo ad utilizzare la 1.04 oppure ad aggiornare il firmware....

hai fatto? anche io avevo quel problema sul connect ma dopo che ho aggiornato ho risolto

Adesso aggiorno il firmware poi vi dico...
Comunque sono CERTO che nella lan non ci siano problemi, da un altro pc funziona tutto.. il server è raggiungibile e non ci sono intoppi...