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:
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.