Bom dia.

Preciso de ajuda para fazer com que o Arduino me envie um POST ou GET para o PHP que vai popular o Banco MYSQL'.Já fiz varios testes e nada até agora.

Estou usando:

Arduino uno;

Ethernet Shield;

E estou usando o WAMPSERVER onde estam os arquivos .PHP e o BANCO MYSQL

Obrigado!!!

Exibições: 5709

Responder esta

Respostas a este tópico

Aqui está a parte dos client.print

EthernetClient client;
if (client.connect("192.168.2.102",8080))
{
Serial.println("Conexao estabelecida..."); //Isso não é necessário, apenas para o gabarito
Serial.println();

Serial.print ("Temperatura: ");
Serial.println(buf_temperatura);
Serial.print ("Umidade: ");
Serial.println(buf_humidade);

txData4 = "BUTTON_STATE="+ (String(buf_temperatura));
Serial.println(txData4);
//client.println("Refresh: 2");
client.print("POST arduino/teste.php HTTP/1.1\n");
client.print("Host: 192.168.2.102:8080\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(txData4.length());
client.print("\n\n");
client.print(txData4); // after all of the required junk we send the data --depois de todo o lixo que nós necessário enviar os dados
client.print("Connection: close\n");
}
else
{
Serial.println("Falha na conexao."); // Mais uma vez a série é para o gabarito.
Serial.println();
}

teu sketch está fazendo alguma requisição errada.

veja o log:

192.168.2.150 - - [07/Mar/2015:13:17:11 -0300] "POST arduino/teste.php HTTP/1.1" 400 984 "-" "-"

aquele código 400 no final significa Erro 400 = Bad request (Solicitação Imprópria)

se estivesse certo, deveria aparecer igual aquilo que te falei, ou seja:

192.168.0.157 - - [07/Mar/2015:12:11:43 -0300] "POST /sites/intranet/testes/test-105.php HTTP/1.1" 200 5 "-" "-"

veja ali no final aparece código 200, ou seja, tudo OK

Agora veja um sketch básico, sem "perfumarias" que eu adaptei pra testar:

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x9D };
byte ip[] = { 192, 168, 0, 157 };
byte gateway[] = { 192, 168, 0, 1 };
byte subnet[] = { 255, 255, 255, 0 };

void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
}
void loop()
{
txData4 = "BUTTON_STATE=";
txData4.concat(22);

EthernetClient client;
if (client.connect("192.168.0.64", 80))
{
Serial.println("Conexao estabelecida...");
Serial.println();
client.print("POST /sites/intranet/testes/test-105.php HTTP/1.1\n");
client.print("Host: 192.168.0.64\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(txData4.length());
client.print("\n\n");
client.print(txData4);
client.print("Connection: close\n");
}
else
{
Serial.println("Falha na conexão.");
Serial.println();
}
delay(5000);
}

aqui funcionou corretamente, mas eu uso o apache na porta 80 (padrão). A lógica do meu sketch está exatamente a mesma que no seu sketch, e aqui funciona. Então sugiro vc verificar melhor a questão da porta

Ali no seu sketch, vale a pena testar também se funciona inserir a "/" antes do caminho:

client.print("POST /arduino/teste.php HTTP/1.1\n");

Reparei uma coisa nessa linha:

client.print("POST arduino/teste.php HTTP/1.1 \n");

Quando eu removo o \n do final o log avança para a próxima requisição, ou seja ele imprime client.print("Host: 192.168.2.102 \n");

Onde está o \n dá o Request 400. 

O problema é que se remover o \n dessas linhas, não estabelece a conexão. 

o problema é esse \n

ao retirar o \n não dá o error 400 (bad request) porque simplesmente a requisição não chegou até o apache, e não porque o erro foi solucionado ao retirar o \n... veja o access log e verá que não foi gerado log algum, indicando justamente que não chegou nada

esse \n significa pular linha

vc precisa pular uma linha obrigatoriamente ao final dessa string

portanto vc tem 2 opções:

opção 1: usar  client.print("POST arduino/teste.php HTTP/1.1 \n");

opção 2: usar client.println("POST arduino/teste.php HTTP/1.1");

vc experimentou colocar a barra antes da palavra arduino ("POST  /arduino/teste.php .......") ?

Olha esse log:

192.168.2.150 - - [07/Mar/2015:15:41:05 -0300] "Content-Type: application/x-www-form-urlencoded POST arduino/teste.php HTTP/1.1 Host: 192.168.2.102:8080 Content-Length: 17BUTTON_STATE=33.1" 400 980 "-" "-"

Agora olha o sketch e compara  pra você ver:

client.print("Content-Type: application/x-www-form-urlencoded ");
client.print("POST arduino/teste.php HTTP/1.1 ");
client.print("Host: 192.168.2.102:8080 ");
client.print("Content-Length: ");
client.print(txData4.length());
client.print(txData4); // after all of the required junk we send the data --depois de todo o lixo que nós necessário enviar os dados
client.println("\n\n");
client.print("Connection: close");

ele não passa da linha \n\n

aí que está dando erro e se eu remover ela, não conecta e se por "println" nas de cima, não gera log.

chegamos ao problema.

vc não deve retirar o \n. As strings devem ser enviadas cada conjunto em linha separada. Se vc retirar o \n fica tudo numa linha só e aí que vai dar bad request mesmo

Sua meta é fazer a requisição chegar até o apache e ainda fazer chegar corretamente

Teu log já mostra de cara que chegou tudo numa linha única

Já te mostrei como seria um log de acesso bem sucedido.

vc não poderia rodar o apache na porta 80, ao invés de 8080? 

Obrigadão imhugo, parece que estamos no caminho certo.

Alterei a porta do apche para 80 e então funcionou o log veja:

192.168.2.150 - - [08/Mar/2015:12:38:01 -0300] "POST /arduino/teste.php HTTP/1.1" 200 545 "-" "-"

Depois disso alterei a variável POST BUTTOM_STATE do Sketch para TEMPERATURA e então acredite amigo, funcionou de boa. 

Agora eu peguei e adicionei mais um txdata para enviar a Umidade fiz como o procedimento anterior, dai não funciona; o log do apache retorna novamente para 400. 

Veja o Sketch e o PHP:

Repare que nesse php não mando gravar logs apenas para imprimir os dados, mas ele não identifica as variáveis TEMPERATURA e UMIDADE. Já se eu mandar gravar logs dai grava um log com o valor da TEMPERATURA a UMIDADE não.

Não entendo como pode gerar apenas uma linha mesmo enviando duas linhas.

E no php grava o log mas se eu mandar um echo $_POST['TEMPERATURA'] não mostra nada.

companheiro, se vc tem dificuldade com método post, faça através do método get. Tente entender como são enviadas informações via método get, mais especificamente sobre a questão de enviar várias variáveis numa única requisição. Depois transporte essa técnica pro método post.

O que quero dizer com isso? se sua intenção é enviar duas variáveis pro servidor, não é pra vc fazer duas conexões uma atrás da outra. O correto é vc juntar as duas variáveis numa única requisição.

Obrigado Imhugo você me ajudou muito. 
já fiz o que você disse de tentar enviar as variáveis em uma única conexão, mas não consegui.

Também não consigo imprimir esse valor no browser, usando um echo $_POST['TEMPERATURA'] e não aparece nada.

no Log e erro do php diz que o servidor não identificou  a variável $_POST['TEMPERATURA']. 

Mas a dúvida é: como não identificou se grava o log?

imhugo, obrigado mais uma vez!

Desculpe se estou atrapalhando seu trabalho, minha intenção não é essa.

Ali onde vc diz:

Mas a dúvida é: como não identificou se grava o log?

que log é esse? log de acesso do apache? log de erro do apache? cole aqui pra sabermos do que se trata

ali onde vc diz:

já fiz o que você disse de tentar enviar as variáveis em uma única conexão, mas não consegui

cole aqui pra sabermos como vc fez teu sketch (cole somente a parte do client.print). Talvez vc tenha construído a requisição incorretamente

txData3 = "TEMPERATURA="+ (String(buf_temperatura));
txData4 = "UMIDADE=" + (String(buf_humidade));

EthernetClient client;
if (client.connect("192.168.2.102", 80))
{
Serial.println("Conexao estabelecida...");
Serial.println();

client.print("POST /arduino/teste.php HTTP/1.1\n");
client.print("Host: 192.168.2.102\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Connection: close\n");
client.print("Content-Length: ");
client.print(txData3.length());
client.print("\n\n");
client.print(txData3);
client.print("\n\n");
client.print(txData4.length());
client.print("\n\n");
client.print(txData4);

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço