Go Down

Topic: Ethernet Shield + Arduino UNO + Android (Read 7 times) previous topic - next topic

leodoidaum

Pessoal estou com um problema, não sei mais o que fazer , tentei de tudo... é o seguinte:
Tenho uma aplicação Android que acessa um Arduino Uno com Ethernet Shiled, porém, só consigo acessar e acionar um led se eu estiver na rede local, via internet eu não consigo. Já configurei no meu Router para o redirecionamento de pacotes para o endereço do Arduino "192.168.1.20", mas o Arduino não recebe os pacotes. Outra coisa , o meu Ethernet Shield é esse:

http://produto.mercadolivre.com.br/MLB-233869906-ethernet-shield-w5100-wiznet-arduino-_JM?redirectedFromParent=MLB230773495

Minha Aplicação Arduino está configurada assim:

#include <SPI.h>
#include <Ethernet.h>

//define actions
#define action_none -1
#define action_out_all 0
#define action_mypin_up 1
#define action_mypin_down 2

// define network config
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBE }; //physical mac address
byte ip[] = { 192, 168, 1, 20 };         // ip in lan -> cambialo pure
byte gateway[] = { 192, 168, 1, 1 };         // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                   //subnet mask
Server server(80);                                      //server port
String readString = String(30); //string for fetching data from address

// arduino out
int pinOutRelay = 5;

// incoming GET command 
String r_pinOutRelay_down = "GET /?out=5&status=0 HTTP/1.1";
String r_pinOutRelay_up = "GET /?out=5&status=1 HTTP/1.1";
String r_out_all = "GET /?out=all HTTP/1.1";

// current action
int current_action;

void setup(){
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
 
  pinMode(pinOutRelay, OUTPUT);   
  digitalWrite(pinOutRelay, LOW);
  //enable serial datada print 
  Serial.begin(9600);
  current_action = -1;
}
void loop(){
  current_action = -1;
  // Create a client connection
  Client client = server.available();
    if (client) {
      while (client.connected()) {
       if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
        if (readString.length() < 30)
        {
          //store characters to string
          readString = readString + c;
        } 
        //output chars to serial port
        //Serial.print(c);
        //if HTTP request has ended
        if (c == '\n') {
     
         Serial.print(readString);
         // ****************************************************
          if(readString.startsWith(r_pinOutRelay_up))
          {
          Serial.print("\n HIGH\n");
          current_action = action_mypin_up;
          }
          else if(readString.startsWith(r_pinOutRelay_down))
          {
           Serial.print("\n LOW\n");
           current_action = action_mypin_down;             
          }
          else if(readString.startsWith(r_out_all))
          {
            Serial.print("\n ALL\n");
            current_action = action_out_all;
          }
          else
          {
            Serial.print("\n None \n"); 
            current_action = action_none;
          }
         // **************************************************** 
          // now output HTML data starting with standart header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
         char buf[12];             
         switch(current_action)
         {
         case action_out_all:
           client.print("{\"ip\" : \"192.168.10.20\", \"devices\" : [{ \"type\" : \"gate\", \"name\" : \"caldaia\", \"out\" : \"");         
           client.print(pinOutRelay);
           client.print("\"}");           
           client.print("]}");                     
           break;
         case action_mypin_down:
           digitalWrite(pinOutRelay, LOW);
           client.print("{\"status\" : \"low\" , \"out\" : \"");
           client.print(pinOutRelay);
           client.print("\"}");                         
           break;         
         case action_mypin_up:
           digitalWrite(pinOutRelay, HIGH);
           client.print("{\"status\" : \"high\" , \"out\" : \"");
           client.print(pinOutRelay);
           client.print("\"}");               
           break;
         default:
           current_action = action_none;       
         }
          // ****************************************************               
          //clearing string for next read
          readString="";
          //stopping client
          client.stop();
        }
      }
    }
  }
}

Minha aplicação Android executa o comando assim:

public final String executaGet(String url) {
      Log.i(CATEGORIA, "Http.metodoGet: " + url);
      try {
         // Cria a URL
         URL u = new URL(url);
         HttpURLConnection conn = (HttpURLConnection) u.openConnection();

         // Configura a requisicao para get
         conn.setRequestMethod("GET");
         conn.setDoInput(true);
         conn.setDoOutput(false);
         conn.connect();

         InputStream in = conn.getInputStream();

         // String arquivo = readBufferedString(sb, in);
         String arquivo = readString(in);

         conn.disconnect();

         return arquivo;
      } catch (MalformedURLException e) {
         Log.e(CATEGORIA, e.getMessage(), e);
      } catch (IOException e) {
         Log.e(CATEGORIA, e.getMessage(), e);
      }
      return null;
   }

Para enviar os comandos para o Arduino eu envio pela WEB ou pelo Android da seguinte forma:

http://IP_externo:80/?out=5&status=1 ---------------> Para ligar o Led
http://IP_externo:80/?out=5&status=0 ---------------> Para desligar o Led

Se o meu computador estiver logado na rede executando os seguinte comandos, eu consigo ligar e desligar o Led, inclusive pelo android:
http://192.168.1.20:80/?out=5&status=1
http://192.168.1.20:80/?out=5&status=0

Alguém saberia me informar o motivo pelo qual eu não estou conseguindo acessar o Arduino via web ?

Obrigado.


Kotch

O problema com certeza e no seu roteador, a porta 80 e para acessar a pagina de configuração do seu roteador rode seu aplicativo em outra porta por exemplo 8080 e faça o devido roteamento que vai funcionar!

8)
????????????????????

leodoidaum

Blz Kotch vou fazer esse teste , valeu !

leodoidaum

Kotch , fiz o teste mas ainda não consigo enviar comandos para o Arduino, coloquei a porta 2376 ,estou tentando enviar dados para o Ethernet Shield da seguinte forma:

http://IP_Externo:2376/?out=8&status=1

Porém, não consigo enviar os comandos , acessando via chrome da a seguinte mensagem : Ops! O Google Chrome não conseguiu se conectar a...
Mas eu consigo acessar da seguinte forma:

http://192.168.1.107:2376/?out=8&status=1

sem problemas , o Led liga e desliga...

Mais alguma dica ?

Kotch

#4
May 01, 2012, 02:17 pm Last Edit: May 01, 2012, 02:21 pm by Kotch Reason: 1
Mas de que forma esta acessando de dentro ou fora da sua rede?

Não entendi bem o problema?
1-Quando voce esta na rede interna voce consegue conectar no ip interno?
2-Quando voce esta na rede interna voce não consegue conectar no ip externo?
3-Quando voce esta na rede externa voce consegue conectar no ip externo?
4-Seu ip é fixo ou dinamico?
5-tem um firewall bloqueando pelo acesso externo?

Se de uma forma acessa, de outra tambem irá funcionar, pois TUDO DEPENDE DE ROTEAMENTO!

8)
????????????????????

Go Up