Go Down

Topic: Arduino webclient + php (Read 13864 times) previous topic - next topic

gabryelribeiro

Bom galera, esse é o meu primeiro post no forum mas venho acompanho a bastante tempo.

Bem eu estou tentando fazer um datalogger com o ethernet shield gravando num pc como servidor com o wamp server instalado.
Eu fiz um codigo php no dreamweaver para captar o dado enviado pelo arduino e depois esse codigo grava em um arquivo txt.

A principio percebo que a conexão está certa mas o dado que o arduino envia não vai pro php ou então o arduino não está enviando o dado.
E tambem comecei usando um txt pq é mais facil de se ver o resultado, depois penso em colocar os dados num banco mysql.

E ae galera me deem um help já estou ficando frustrado e achando que esse ethernet shield já nem me tem tanta utilidade mais assim.

bubulindo

#1
Jan 19, 2011, 01:48 pm Last Edit: Jan 19, 2011, 03:17 pm by bubulindo Reason: 1
Se incluísses algum código aqui no post, seria mais fácil perceber o que estava a correr mal...
Já experimentaste correr o php ligado por um ficheiro .html para ver se o código php está correcto?

Se o código .php estiver correcto, então o problema pode estar na maneira como o Arduino está a aceder ao servidor.

Estás a utilizar o protocolo HTTP correctamente para fazer o pedido ao servidor?
A maneira de fazer isto é, ligares-te ao servidor php e depois enviar uma mensagem deste género:

POST /test.php HTTP/1.1;
Host: O_Nome_do_teu_host
Content-Length: (tamanho da mensagem sem parêntesis) Content-Type: application/x-www-form-urlencoded
Connection: Close
dado1=teste&dado2=ethernet

Neste caso, o tamanho da mensagem seria 26.

Depois no ficheiro .php deves fazer isto

$dado1 = $_POST["dado1"];
$dado2 = $_POST["dado2"];

para passares os valores do arduino para o .php.

Podes utilizar o método get, mas não será tão seguro... eu como estou a utilizar um servidor externo, prefiro POST.

Depois convém ler o que o script php gerou, se é que gera algo, para ver o que se passou.  

Existem exemplos disto na net também. :\

Se meteres o código aqui, certamente será mais fácil de ajudar.
This... is a hobby.

nofxx

#2
Jan 19, 2011, 05:29 pm Last Edit: Jan 19, 2011, 05:30 pm by nofxx Reason: 1
Gabriel, abre um wireshark e ve se ta sendo enviado ou ñ.

Bubu, tanto get qto post vão em plain text, sem SSL a segurança eh a mesma.
O que muda eh quantidade de dados, 65k por post e ne me lembro mais qts chars por get....

Bruno Soares

Pode ser que este post te ajude:
http://blog.bsoares.com.br/php/controlling-arduino-with-php

gabryelribeiro

Valeu a força gente, eu não postei o codigo pq estou no trabalho quando chegar em casa a noite eu posto o codigo que estou usando e aproveito e testo esse codigo que o bubu passou.

Quanto ao wireshark, como que eu uso isso nofxx?

valeu a força pessoal

nofxx

#5
Jan 19, 2011, 08:49 pm Last Edit: Jan 19, 2011, 08:49 pm by nofxx Reason: 1
Wireshark eh um dumper de pacotes. Coloque um filtro tcp , na porta q vc o servidor ta escutando e o arduino enviando.
Vc verá tudo q tá acontecendo.

nofxx

#6
Jan 19, 2011, 08:57 pm Last Edit: Jan 19, 2011, 09:03 pm by nofxx Reason: 1
Uma outra opção (a q uso aqui), somente essas linhas de Ruby:

module DuinServer
 def receive_data(data)
   puts "Recebi #{data}. Posso fazer o q eu quiser agora fácil..."
  end
end

EM.run do
 EM.start_server 'localhost', 5000, DuinServer
end

Isso liga um servidor tcp ruby na porta 5000, e imprime qql coisa q vc enviar do arduino.
Nao precisa de apache/nginx, server nenhum...
Nao tem q preocupar com header html e nada, soh dados.

Outra opção excelente eh a mesma coisa com node.js, quiser posto o codigo.
Tanto node qto ruby são alternativas pra lá de superiores à php.
Se vc ver como grava e le dados de qql banco com ruby entao, vc apaixona. Veja o "ActiveRecord".

gabryelribeiro

#7
Jan 19, 2011, 10:06 pm Last Edit: Jan 19, 2011, 10:37 pm by gabryelribeiro Reason: 1
O codigo que estou usando é este aqui

Code: [Select]
#include <SPI.h>

#include <Ethernet.h>


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168, 254,8 };
byte server[] = { 192,168,254,4 };

// variaveis a serem usadas para gravação
int valor = 10;

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
 // start the Ethernet connection:
 Ethernet.begin(mac, ip);
 Serial.begin(9600);
 delay(500);
 Serial.print("connecting...");

 // if you get a connection, report back via serial:
 if (client.connect()) {
   
   Serial.println("connected");
   delay(00);
   // Make a HTTP request:
   
 }
 else {
   // kf you didn't get a connection to the server:
   Serial.println("connection failed");
 }
}

void loop()
{
 // if there are incoming bytes available
 // from the server, read them and print them:
 for (int i = 0; i < 3; i++){
   if (client.connected()) {
     client.print("GET http://localhost/index1.php?dado=");
     client.print(valor);
     client.print(" HTTP/1.1");
     client.println();
   }
 }
 Serial.println("disconnecting.");
 client.stop();
 for(;;)
 ;
}


e o php
Code: [Select]
<?php
      $VALOR 
$_GET['dado'];
      
$novoarquivo fopen("..\www\dados.txt""w+");
      
$quebra chr(13).chr(10);              
    fwrite
($novoarquivo$VALOR.$quebra);
      
fwrite($novoarquivo"DONE!".$quebra);
      
fclose($novoarquivo);
?>



acho estranho pq eu já vi um monte de codigos, faço tudo igual mas não dá certo.

nofxx - achei interessante esse ruby, o codigo simples e interessante, mas como ficaria o codigo no arduino para acessar o codigo do ruby. Eu vou estudar sobre essa linguagem, principalmente essa parte mesmo de banco de dados. Onde tem bons tutoriais nessa area para essa linguagem?

bruno - na verdade cara eu queria um acesso como o bubu postou e não por serial. Eu estou usando o ethernet shield e queria usar o arduino como web client.

gabryelribeiro

Rapaz o ruby já tá rodando aqui no pc, eu não conhecia esse tipo linguagem não, tive até dificuldades de visualizar como seriam os codigos e tudo mais.
Eu já sou formado em programação mas não conhecia esse tipo não, eu estou acostumado a programar no codeblocks, devcpp esses que tem uma interface. Mas vou me acostumar pq achei muito interessante.

Vou começar a estudar essa parte de manipular o db pelo ruby, depois eu acho que a comunicação com o arduino é mais simples do que com servidor e http.

valeu a dica ae nofxx, é mt bom que agora eu agrego mais conhecimento. E quem sabe eu me aprofunde mais nessa linguagem.
E como que fica o arquivo .pde do arduino?

bubulindo

Os IPs estão correctos?

Estás a utilizar um servidor caseiro, né?

Experimenta colocar um echo "ok"; no php e depois de teres feito o request no Arduino, vê se existe uma resposta do script php e envia a resposta por porta série.

Que é isto?

Quote
delay(00);


E para que fazes 3 pedidos?

Quote
for (int i = 0; i < 3; i++)


This... is a hobby.

nofxx

#10
Jan 21, 2011, 09:15 am Last Edit: Jan 21, 2011, 09:25 am by nofxx Reason: 1
O meu code é pra lib do WiServer (wifi), ñ usei ethernet ainda. Teu shield eh Wiznet?
Esse code seu funciona tb, nao eh mais necessário print GET, HTTP.. enfim headers.
O protocolo é todo seu.

E adicionando às perguntas do bubu:
Pq conectar no setup?
Vc deveria conectar em cada request...e desconectar depois.
Eh melhor trabalhar com tcp sem que o socket fique conectado:
Handshake -> request -> response -> fecha conexão.
Faz isso toda hora, nao rola handshake no setup e ficar enviando no loop!
Ai seria um 'websocket', stream... ou seja, ñ fecha.
Pra isso melhor usando node/erlang/eventmachine no ruby...

Como eu faco p/ 5 em 5 segundos:

Code: [Select]
void loop() {
 if (millis() >= updateTime) {
   post_stuff.submit(); // aqui q envia o post
   updateTime += 5000;
 }
}


gabryelribeiro

Vamos lá

quanto ao delay(00) foi um erro que eu não havia reparado. E o for é pq eu estava fazeno somente um teste, então queria que escrevesse no txt 3 vezes. E os ips estão certinhos.

Agora quanto ao shield é o wiznet sim, é um shield que comprei da dfrobot.
Essa questão da conexão no setup eu não tinha pensado nisso. Eu vou mudar ela pro loop mesmo.
Agora eu achei o ruby interessante, vou tentar aprender mais sobre ele e fazer a conexão por ele.

E uma outra pergunta, eu vejo sempre esses logs pelo ethernet shield a galera usando um tempo de 5 em 5 seg, 10 em 10 seg, etc. Para o meu uso isso seria muito lento e eu não tinha parado para pensar nisso. Será que um log pelo ethernet shield me daria uma taxa de amostragem grande o suficiente, tipo uns 10 a 20 amostras por segundo.
Já está a caminho um datalogger shield da adafruit ele deve me servir melhor, mas mesmo assim vou ver se uso o ethernet shield para descarregar os dados

bubulindo

Quote
tipo uns 10 a 20 amostras por segundo.


Provavelmente queres uma ligação UDP... mas isso envolve muito mais do lado do servidor.
This... is a hobby.

nofxx

#13
Jan 22, 2011, 12:19 am Last Edit: Jan 22, 2011, 12:20 am by nofxx Reason: 1
Realmente, em udp vc necessita de mto menos pacotes, logo dá pra trabalhar numa frequencia maior.

Mas tcp mantendo o socket aberto pode ser uma opcão tb.
Do lado do server é mamão com eventmachine ou node.js.
Agora do lado do arduino tem q ver se ele mantem o socket aberto, roda tudo e consegue voltar no loop imprimindo mais...

Depois conta p/ gente se funcionou ! =D

gabryelribeiro

#14
Jan 22, 2011, 02:59 pm Last Edit: Jan 22, 2011, 03:56 pm by gabryelribeiro Reason: 1
Valeu pessoal, agora tenho bastante informações, final de semana vai ser bom  ;D

Agora qto ao udp eu fico pensando na integridade dos dados, eu acho que ele não dá a confiabilidade do tcp, mas vou fazer testes, pq nesse caso eu preciso de uma taxa de amostragem boa.

Qd conseguir algum progresso eu posto aqui

atualizando ... 12:50

nofxx - consegui fazer o arduino se comunicar com o ruby e enviar dados, coisa que eu não tinha conseguido com php. Agora me animei é um pequeno progresso mas já foi suficiente pra me fazer animar.

agora é estudar essa parte udp e tentar aplicar ao que estou precisando. Depois eu passo ao mysql.

valeu

Go Up