E ai galera, beleza?

Seguinte...Já lí todos os tópicos aqui sobre ethernet shield, avancei bastante lendo-os.

Mas cheguei numa parte que venho tentando a dias e não saiu do lugar, se alguém puder ajudar fico muito grato.

A interface está em php.

Já consigo acionar as saída via LAN( rede local), o problema é que não consigo via WAN(externa).

Estou tentando por dois meios, são eles:

* Via Apache(ja tentei com easyphp e wampserver);

* Hospedando o site.

1.Pelo easyphp eu consigo ver a página php e acionar as saidas normal, pesquisei e ví que tenho que configurar o roteador pra redirecionar toda solicitação pra uma porta(estou usando a 8090)...No meu caso eu tenho modem e roteador, estou fazendo o redirecionamento tanto no modem quanto no roteador, está correto?

1.1Quando vou configurar o easy php tenho que colocar o no-ip ou ddns, mas pra testar estou colocando meu ip externo, é pra funcionar não é? Sempre que coloco outro ip no documento httpd.conf o apache para de funcionar.

2. A hospedagem grátis onde fiz o cadastro só é possível trocar dados pela porta 80( que tudo indica que a minha é bloqueada ), por isso acho que nao to conseguindo.

Vou "anexar" os códigos que estou usando, se puderem dá uma olhada e me ajudar.

sketch

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

//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 177 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,1, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 255, 0 };

// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";

Server server(8090); // Cria o servidor na porta 8081

// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";

void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
}

void loop() {
Client client = server.available();
// SE receber um caracter...
if (client) {
// guarda o caracter na string 'msg'
msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5]; msg[5]=msg[6];
msg[6] = client.read();

if (msg[6]=='#') {
switch(msg[5]) {
case 'R':
// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;
case 'P':
// Caso P#, aciona o pino do portão pequeno por 1s.
digitalWrite(A4,HIGH);
delay(1000);
digitalWrite(A4,LOW);
break;
case 'G':
// Caso G#, aciona o pino do portão pequeno por 1s.
digitalWrite(A5,HIGH);
delay(1000);
digitalWrite(A5,LOW);
break;
case 'L':
// Caso L#, ele copia os 4 bytes anteriores p/ a
// string 'Luz' e cada byte representa um
// dispositivo, onde '1'=ON e '0'=OFF
Luz[0]=msg[1];
Luz[1]=msg[2];
Luz[2]=msg[3];
Luz[3]=msg[4];
if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW);
if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW);
break;

}
}
}
}

fim da sketch

página php

<html>
<head></head>
<body>

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Se conecta ao IP e Porta:
socket_connect($sock,"192.168.1.177", 8090);
// aqui eu coloco o ip que o arduino esta na rede nao é? Ja testei com os dois(local e externo)

// Executa a ação correspondente ao botão apertado.
if(isset($_POST['bits'])) {
$msg = $_POST['bits'];
if(isset($_POST['Fora' ])){ if($msg[0]=='1') { $msg[0]='0'; } else { $msg[0]='1'; }}
if(isset($_POST['Quarto1'])){ if($msg[1]=='1') { $msg[1]='0'; } else { $msg[1]='1'; }}
if(isset($_POST['Quarto2'])){ if($msg[2]=='1') { $msg[2]='0'; } else { $msg[2]='1'; }}
if(isset($_POST['Sala' ])){ if($msg[3]=='1') { $msg[3]='0'; } else { $msg[3]='1'; }}
if(isset($_POST['Pequeno'])){ $msg = 'P#'; }
if(isset($_POST['Grande' ])){ $msg = 'G#'; }
socket_write($sock,$msg,strlen($msg));
}

socket_write($sock,'R#',2); //Requisita o status do sistema.

// Espera e lê o status e define a cor dos botões de acordo.
$status = socket_read($sock,6);
if (($status[4]=='L')&&($status[5]=='#')) {
if ($status[0]=='0') $cor1 = lightcoral;
else $cor1 = lightgreen;
if ($status[1]=='0') $cor2 = lightcoral;
else $cor2 = lightgreen;
if ($status[2]=='0') $cor3 = lightcoral;
else $cor3 = lightgreen;
if ($status[3]=='0') $cor4 = lightcoral;
else $cor4 = lightgreen;

echo "<form method =\"post\" action=\"engenheirando.php\">";
echo "<input type=\"hidden\" name=\"bits\" value=\"$status\">";
echo "<button style=\"width:70; background-color: $cor1 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Fora\">Fora</button></br></br>";
echo "<button style=\"width:70; background-color: $cor2 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto1\">Quarto1</button></br></br>";
echo "<button style=\"width:70; background-color: $cor3 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto2\">Quarto2</button></br></br>";
echo "<button style=\"width:70; background-color: $cor4 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Sala\">Sala</button></br></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\" Name = \"Pequeno\">Portao Pequeno</button></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\" Name = \"Grande\">Portao Grande</button></br></br>";
echo "</form>";
}
// Caso ele não receba o status corretamente, avisa erro.
else { echo "Falha ao receber status da casa."; }
socket_close($sock);
?>

</body>
</html>

Obs,: Os códigos foram tirados do site engenheirando.com

Desde já, muito obrigado.

Exibições: 7057

Anexos

Responder esta

Respostas a este tópico

Poe ai qual é o seu modem e router wifi sabermos e  para poder te mandar como fazer o port foward da porta 8090.

Marcelo, muito obrigado por responder.

Meu modem é o zte zxdsl 831 e meu roteador é o Bright, eu acho que já redirecionei certinho, só nao sei se é preciso redirecionar tanto no modem qto no roteador...Olhe em abaixo 2 imagens de como está aqui.

É isso?

Outra duvida... Se eu digitar localmente o ip do arduino(com a respectiva porta) é para eu ter acesso não é?

Mais uma vez obrigado.

Abraço.PAZ!

Seu modem que está fazendo a conexão com a internet ou o roteador? Caso seja o roteador e o seu modem estiver com bridging, ou seja, seu roteador está fazendo a conexão, acredito que basta liberar a porta apenas no roteador.

Para verificar se a porta esta aberta, você pode utilizar este site http://www.guiadocftv.com.br/modules/ferramentas/pag_nettools.php, onde você deverá digitar o IP ou endereço DNS (caso tenha configurado algum) e as portas que deseja verificar se estão abertas.

Abraço.

Desculpa a demora...Meu modem faz conexão com a internet e o roteador distribui(lol).

Meu modem está modo PPPoE e o roteador Ip dinâmico. 

Fiz o teste pelo site que vc me mando e diz que a porta não está aberta.

Alguma sugestão?

Obrigado.

Abraço

Então... seguinte... tenta deixar seu Roteador no modo PPPoE e não o Modem, pois dessa forma vc terá de abrir portas apenas no Roteador, e não no modem... já a parte do site que te passei, é aconselhável testar se a porta está aberta de uma rede fora da sua, ou seja, nao testar da mesma rede onde vc deseja verificar se as portas estão abertas (nem sempre funciona).

Uma boa forma de realizar o teste, é criar um DNS do seu IP caso ele seja ele dinâmico (vc pode utilizar o no-ip, por exemplo) e, com seu computador ligado e na internet, realizar o teste de uma rede fora da sua (uma lan house, por exemplo).

Qualquer dúvida, fico a disposição.

Abraço

Entendi, aqui já está assim...Modem está modo PPPoE e o roteador Ip dinâmico.

Eu não queria usar ddns nem no-ip por enquanto.

Tem como vc testar ai rapidinho por favor?

189.71.158.41 

porta 8090

Depois eu reinicio o modem ai ele muda esse ip.

Muito obrigado msm brother.Abração.PAZ!


189.71.158.41 resolvido para 189-71-158-41.user.veloxzone.com.br

Resultados do Portscan:

Porta 8090 está fechada.


Portscan executado em 00 minutos e 01 segundos.

Deu como porta fechada ainda...

Antes de mais nada tenho que resolver isso. Alguma sugestão?

Deixei a configuração aqui como está na 1ª imagem(que mostra a pagina do modem e do roteador) que postei.

Muito obrigado

Grande Denis...

Lembrei(vi aqui) que no meu roteador a porta WAM está com problema(comprei outro que chega daqui uns 10 dias), daí eu usava outra porta pra receber do modem, esse poderá ser o problema pelo qual eu nao consigo colocar o roteador em PPoE , amanhã(hoje melhor dizendo) vou pegar um roteador emprestado pra seguir essas dicas que vc me deu e posto aqui pra vc o resultado.

Valeu.

Denis, camarada, qto tempo.Como estão as coisas?

Cara passei um tempo off, fiquei doente, comecei a trabalhar, esperei chegar outro roteador e tive que adiantar um projeto de iniciação cientifica ...Enfim, abandonei esse projeto por um tempo...Mas agora estou de volta.

Com esse novo roteador estou conseguindo deixar o modem em modem bridge e o roteador em pppoe :) , também já estou conseguindo abrir a porta, verifico no site e ta tdo ok(porta aberta).

Pelo que estou vendo o único problema agora é:

Se eu digitar o ip do "arduino" via lan é pra acontecer oq? é pra aparecer a página web?

Pq ao digitar o ip da minha rede seguido de dois pontos e da porta que redireciona o fluxo eu percebo que o navegador e o arduino tentam se comunicar, do mesmo jeito que digitando o ip do arduino via local, mas nada acontece.

Entendeu?Alguma sugestão?

Grato e boa semana a todos.Abraço.paz

vc tem que retear o a porta 8090 no setup do seu modem pro IP que seu roteador recebeu do modem, normalmente o modem nao "ve" o mesmo range de rede que seu roteador ve...

ja a configuraçao do roteador propriamente dito esta certa

Saudações meu caro.

Se o easyphp está na tua máquina (host local) o problema não é em teu roteador nem teu modem, pode ser este código ou o servidor de páginas.

Caso contrário, terás realmente que fazer o NAT e alterar o arquivo PHP no trecho "socket_connect($sock,"192.168.1.177", 8090); " para algo como: "socket_connect($sock,"IP_DO_TEU_ROTEADOR_COM_NAT", 8090); " ou caso esteja usando nome de domínio, o endereço DNS correto.

Estás usando algum tipo de DNS dinâmico? como o ddns ou coisa assim?

Neste trecho: "socket_connect($sock,"192.168.1.177", 8090); " tu indicas o retorno para um endereço local(192.168.1.77), como se o servidor de páginas estivesse em tua própria máquina.

 

Faz o seguinte, me manda o fluxo do processo como um todo. Onde está o servidor de páginas com ser respectivo endereço IP, o IP onde está o programa e o endereço de tua rede local.

 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço