Pages: [1]   Go Down
Author Topic: Arduino + Ethernet W5100 + php  (Read 2364 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pessoal, boa tarde.

Gostaria de ajuda com o Arduino + PHP.

Tenho um UNO-R3 com Shield Ethernet W5100 (cópia chinesa). Está funcionando beleza.

Minha dúvida é na passagem de valores para um site. Tenho um domínio www.site.com.br, onde em www.site.com.br/arduino tenho um método já programado para inserção de dados em MySQL.

Se fizer direto no browser www.site.com.br/arduino/index.php?variavel=valor, o metodo grava direitinho no MySQL. Entretanto, ao usar o arduino para realizar a tarefa, não tenho muito sucesso. Segue abaixo o sketch (usei um exemplo do arduino.cc - no exemplo passo um valor fixo para testar):

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

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
char serverName[] = "www.site.com.br";

// 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):
EthernetClient client;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    while(true);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println(Ethernet.localIP());
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
 
  if (client.connect(serverName, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /arduino/index.php?t=13");
    Serial.println("Tentativa de Passar Valor");
    client.println();
  }
  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:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    client.println("GET /arduino/index.php?variavel=13");
    Serial.println("Tentativa de Passar Valor");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

Resposta no Monitor

Code:
192.168.1.102
connecting...
connected
Tentativa de Passar Valor
HTTP/1.1 503 Service Unavailable
Server: Varnish
Retry-After: 0
Content-Type: text/html; charset=utf-8
Content-Length: 419
Date: Sat, 17 Nov 2012 16:21:39 GMT
X-Varnish: 1134533171
Age: 0
Via: 1.1 varnish
Connection: close


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>503 Service Unavailable</title>
  </head>
  <body>
    <h1>Error 503 Service Unavailable</h1>
    <p>Service Unavailable</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 1134533171</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>
Tentativa de Passar Valor

disconnecting.


Imagino que seja uma coisa "tosta", mas toda a ajuda é bem vida.

Abraço Pessoal.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3110
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Estás a fazer mal o pedido...

Dá uma vista de olhos aqui...

http://www.opencalais.com/HTTPexamples

e aqui

http://www.jmarshall.com/easy/http/#postmethod

e aqui

http://ruturajv.wordpress.com/2005/12/25/http-post-request/

Tens de usar o post... e fazer o pedido correctamente. Lembra-te também que existem \n e \r para adicionar para o pedido ser considerado correcto.

Se quiseres mais...

http://blog.thiseldo.co.uk/?p=418

Este último exemplo já tem o código do Arduino e um script php para testar. Eu tenho código para isto também, mas está no meu computador em casa... e eu não estou em casa. smiley-sad
Logged

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

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

Fala Bubulindo...

Obrigado pela ajuda, mas mesmo assim, debugando todo o material que enviou, sigo se conseguir enviar os dados. Fiz várias tentativas o usando o GET (o que é mais fácil) mas mesmo assim, sem sucesso. Resolvi seguir seu conselho e usar o POST.

Por favor, dá uma olhada no meu código, e se possível, aponte o que está de errado.

Code:

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

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
char serverName[] = "www.meusite.com.br/arduino/index.php/beta01";

EthernetClient client;

char strURL[70];
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
long interval = 5000; // 10 minutes (10*60*1000) 600000

void setup() {
  Ethernet.begin(mac);
  Serial.begin(9600);
  delay(2000);
  Serial.println("Conectando...");
  if(!client.connect(serverName, 80)){
    Serial.println("Falhou.");
  }
  else {
   
    pegaValor();
   
    client.stop();
  }
}

void loop() {
  currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if(client.connect(serverName, 80)) {

      pegaValor();

    }
    else {
      Serial.println("Falhou em conectar. Tente mais tarde");
    }
    delay(1000);
    client.stop();
  }
}

void pegaValor() {

  String data;
  data+="";
  data+="t=";
  data+=analogRead(A0);

  client.print("POST /passa_valor");
  client.println(" HTTP/1.1");
  client.println("Host: meusite.com.br");
  client.println("Content-Type: application / x-www-form-urlencoded");
  client.println("Connection: close");
  client.print("Content-Length: ");
  client.println(data.length());
  client.println();
  client.print(data);
  client.println();
 
  Serial.print("POST /passa_valor");
  Serial.println(" HTTP/1.1");
  Serial.println("Host: meusite.com.br");
  Serial.println("Content-Type: application / x-www-form-urlencoded");
  Serial.println("Connection: close");
  Serial.print("Content-Length: ");
  Serial.println(data.length());
  Serial.println();
  Serial.print(data);
  Serial.println();

}


Grande  Abraço.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3110
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

O que é "passa_valor"?

não será passa_valor.php?

Olha aqui:
http://www.jfkreuter.com/?p=9

Code:
client.print("GET /writetemplocalserv.php?t");            // send this to apache on server to call the script "writetemplocalserv.php"
client.print(i);                                          // give it the temp on sensor "i" to the script
client.print("=");
client.print(temp);
client.println(" HTTP/1.1");                  //
client.println("Host: www.jfkreuter.com");    //
client.println("User-Agent: Arduino");        // ethernet related stuff
client.println("Accept: text/html");          //
//client.println("Connection: close");        //
client.println();                             //

No teu caso, acho que o que falta é mesmo indicar o ficheiro que estás a pedir ao servidor. :\ Que achas?

Que resposta recebes do servidor? Error 404?

Adiciona isto no final do loop

Code:
while (client.available() > 0) {
   Serial.print(client.read());
}
e vê o que o servidor responde.
Logged

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

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

Fala Bubulindo...

Carinha, vamos lá.

Depois de muita porrada, entendi o que estava acontecendo comigo. O meu servidor, onde tenho hospedado minha página, é dinâmico, ou seja, quando utilizo char serverName[] = "www.meusite.com.br/arduino" ele simplesmente não assume e não conecta, fazendo com que não reconheça o path em - por exemplo:
Code:
client.print("GET /writetemplocalserv.php?t")
Então para funcionar eu preciso declarar a URL inteira:
Code:
client.print("GET http://www.meusite.com.br/arduino/writetemplocalserv.php?t")
Compreendeu ?

Deste jeito, eu consegui fazer a inserção de dados, mas precisei criar uma página em PHP especifica para isso (claro, como era para ser - mas estava tentando rodar usando o FrameWork CodeIgniter - o que não deu certo até agora).

Agora, preciso de ajuda com o CI, pois consigo fazer a inserção direto no browser, mas quando faço o mesmo procedimento com o código simples no ARDUINO, ele não vai.

Achei que pudesse ser alguma configuração do CI, que não estava liberando QUERY_STRING, criei até um novo método para eliminar o famoso "?", mas mesmo assim, nada.

Em vez de utilizar $this->input->get('t', TRUE) para pegar a informação (que já não estava dando certo), utilizei as variáveis globais $_GET['t'], o que também não deu certo. Volto a afirmar, pelo Browser vai, mas quando o ARDUINO envia, o DB não registra.

Conhece algo de CodeIgniter ? consegue indicar uma possível solução ?

Abraço, e obrigado pela ajuda até agora.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3110
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu estou confuso como tudo!!! Tu estás a misturar alhos com bogalhos e assim torna-se difícil.

Primeiro tens de garantir que o Arduino liga ao site. Para isso tens de ler a resposta do servidor. Já fizeste isso?

O site vai para o servidor aqui:

Code:
client.println("Host: www.jfkreuter.com");    //

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

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
char serverName[] = "www.meusite.com.br"; //MUDADO!!!!!!

EthernetClient client;

char strURL[70];
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
long interval = 5000; // 10 minutes (10*60*1000) 600000

void setup() {
  Ethernet.begin(mac);
  Serial.begin(9600);
  delay(2000);
  Serial.println("Conectando...");
  if(!client.connect(serverName, 80)){
    Serial.println("Falhou.");
  }
  else {
    pegaValor();
    client.stop();
  }
}

void loop() {
  currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if(client.connect(serverName, 80)) {
      pegaValor();
    }
    else {
      Serial.println("Falhou em conectar. Tente mais tarde");
    }
    delay(1000);
    client.stop();
  }
}

void pegaValor() {

  String data;
//  data+="";
  data+="Val=";
  data+=analogRead(A0);

  client.print("POST arduino/index.php");
  client.println(" HTTP/1.1");
  client.println("Host: www.meusite.com.br");
  client.println("Content-Type: application / x-www-form-urlencoded");
  client.println("Connection: close");
  client.print("Content-Length: ");
  client.println(data.length());
  client.println();
  client.print(data);
  client.println();
  client.println();
}



E o teu index.php...

Code:
<?
$analog = $_POST["Val"];

echo "Received";
echo $analog;
?>

Experimenta isto.
Logged

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

Pages: [1]   Go Up
Jump to: