Go Down

Topic: Arduino webclient + php (Read 11631 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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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++)


Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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