Arduino + Ethernet W5100 + php

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

#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

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.

Estás a fazer mal o pedido...

Dá uma vista de olhos aqui...

e aqui

e aqui

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

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.

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

O que é "passa_valor"?

não será passa_valor.php?

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

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

while (client.available() > 0) {
   Serial.print(client.read());
}

e vê o que o servidor responde.

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: client.print("GET /writetemplocalserv.php?t") Então para funcionar eu preciso declarar a URL inteira: 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.

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:

client.println("Host: www.jfkreuter.com");    //
#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...

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

echo "Received";
echo $analog;
?>

Experimenta isto.