Pages: [1]   Go Down
Author Topic: Ethernet Shield + Arduino UNO + Android  (Read 7245 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

 smiley-cool
Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Blz Kotch vou fazer esse teste , valeu !
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

 smiley-cool
« Last Edit: May 01, 2012, 07:21:28 am by Kotch » Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

É isso mesmo Kotch , é uma questão de roteamento...
1-Sim consigo perfeitamente.
2-Sim perfeitamente.
3-Sim , mas o problema é quando eu estou tentando acessar de fora para dentro , quando eu quero acessar do meu celular a minha rede interna.
4- Na minha rede interna os IPs são fixos e o meu "Ip Externo" é dinâmico.
5- Não , eu desabilitei o firewall no meu roteador.

O problema é acessar a minha rede interna quando eu estou usando o meu celular via 3G, esse é o problema.

valeu!
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Já testou acessar de um IP interno o IP externo? Tipo, de um micro que esteja na rede interna, tentando conectar-se ao IP dinâmico externo?

Não use a porta 80, use 8080, como foi dito pelo Kotch, porque normalmente há firewalls dentro do provedor de acesso (seu Turbonet ou Speedy podem estar atrás de um firewall, isso que eu queria dizer)
« Last Edit: May 02, 2012, 11:25:25 pm by neuron_upheaval » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pois é neuron_upheaval , de dentro da minha rede eu consigo acessar o Arduino normalmente, tanto o IP interno , quanto o IP externo dinâmico, consigo acessar o Arduino e realizar todos os comandos, porém, quando estou acessando de fora da minha rede eu não consigo, no entanto, eu não testei acessar via outra porta, vou testar e falo para vocês o resultado.

Obrigado!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pois é neuron_upheaval , de dentro da minha rede eu consigo acessar o Arduino normalmente, tanto o IP interno , quanto o IP externo dinâmico, consigo acessar o Arduino e realizar todos os comandos, porém, quando estou acessando de fora da minha rede eu não consigo, no entanto, eu não testei acessar via outra porta, vou testar e falo para vocês o resultado.

Obrigado!

Amigo, o problema parece estar mesmo nas configurações do seu roteador(configuração NAT para ser mais exato).
Você precisa direcionar todo o tráfego externo (IP_EXTERNO:Porta) para o ip interno (192.168.1.20)e na porta que você configurar(tenta configurar a 8080).
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Já testou acessar de um IP interno o IP externo? Tipo, de um micro que esteja na rede interna, tentando conectar-se ao IP dinâmico externo?

Vai dar erro!
Nao vai conseguir pois a operadora, nao faz este roteamento!

Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tem que que configurar o roteamento no seu modem adsl e nao use a porta 80 pois alem do bloqueio da operadora, a porta 80 e usada para configuracao do teu adsl entao quando conseguir se conectar da rede externa pra rede interna pela porta 80 vai cair na pagina de configuração do adsl!

 smiley-cool
Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Amigo, o problema parece estar mesmo nas configurações do seu roteador(configuração NAT para ser mais exato).
Você precisa direcionar todo o tráfego externo (IP_EXTERNO:Porta) para o ip interno (192.168.1.20)e na porta que você configurar(tenta configurar a 8080).

Qual o modelo do seu roteador ?
Entre nele e habilite o DMZ no IP do arduino e configure o arduino para a porta 8080.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pessoal , me desculpe por demorar para responder , ultimamente tenho estado muito atarefado, porém , eu fiz o teste e não deu certo, fiz todos os roteamentos necessários, porem, não funciona , eu tentei na porta 8080 também e nada , só funciona se eu estiver via wifi , se eu estiver via 3G não funciona , aproposito , meu roteador é um linksys WRT120N ... eu uso ele e um modem adsl.
Eu não sei ao certo o que está errado , porem , acho que não é o meu roteador ... alguém tem mais alguma ideia ?

Obrigado!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boa Tarde, aproveitando o tópico do amigo ai..

Estou desenvolvendo uma aplicação android do estilo da dele acima..  usando a pagina html gerada no arduino, consigo acionar e ver o status de sensores na mesma, e através da aplicação android que implementei, consigo acionar o relê através de uma variável ex: http://meuipoudns.com:8080/ligar, mas o que preciso realmente é conseguir obter o retorno na aplicação android do estado de uma porta OUTPUT.

Pela minha lógica, se conseguisse pegar o texto da pagina HTml na aplicação android, daria para tratar e verificar estado através de um botão refresh, que buscaria o conteúdo a cada click..

Se alguém puder me dar uma luz ai.. Agradeço!!
Logged

Vila Velha - ES - Brasil
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino+Linux+Android = freedom
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá Prezados,
tenho um UNO 2011 + Shield Ethernet, porém o Shield apresenta o seguinte problema, após implementar o código WebServer do exemplo da IDE ele funciona perfeitamente, porém ao desligar o cabo USB, e tentar ligar novamente o Shield não se comunica com o Roteador , ficando com  os dois leds do conector RJ45  ligados e também os leds RX, FULLD, 1ooM, LINK e PWR, e é claro, não consigo pingar no mesmo, os led da porta do roteador também não dá sinal de vida. Tenho que ficar ligando e desligando o cabo USB, até que ele volta a funcionar. O que pode ser ?
Logged

Pages: [1]   Go Up
Jump to: