init.httppost gsm/gprs shield SIM 900

Olá colegas,

Estou tentando escrever dados de sensores em um banco de dados, para isso estou usando a função init.httppost. Porém quando ela executa não consegue gravar os dados na tabela do banco de dados e aparece a mensagem abaixo:

ATT: SEND OK
RIC: POST /prueba_arduino/add.php HTTP/1.1
Host: nome do servidor
User-Agent: Arduino
Content-Type: application/x-www-form-urlencoded
Content-Length: 270

DATA_1=2017-02-05&HORA_1=14:00:00&T_MOTOR_1=60

Failed to send data to the server

Alguém poderia ajudar a entender melhor o que está acontecendo ou indicar algum artigo que possa ajudar?

Abraços

Acho que sem dares mais informação não existe ninguém no Mundo que te possa ajudar. Ninguém aqui tem uma bola de cristal ou trabalha para os serviços de espionagem do teu país para ver o que fizeste.

Por isso coloca aqui as seguintes informações e alguém te tentará ajudar:

Como tens os componentes ligados?
Que componentes estás a usar (software e hardware)?
Que código estás a usar? Coloca aqui o código que não está a funcionar.
De onde saiu esse ini.httpPost?? É uma biblioteca? Se sim, coloca o link de onde a tiraste.

ok Faraday,

Primeiro inet.httpPOST(char* server, int port, char* path, *char param, *char risposta, int len_risp) vem de uma biblioteca para o shield GSM/GPRS chamada inetGSM.CPP. O código do arduino segue abaixo, mais 3 add.php(insere os valores das variáveis no banco de dados), connect.php(conecta com o banco de dados) e index.php(apenas mostras os dados contidos no banco de dados). Segue também o código da função inthttpPOST em C.

1-Código do arduino

//Programa: Telemetria - SHIELD SIM 900

#include “SIM900.h”
#include <SoftwareSerial.h>
#include “inetGSM.h”

InetGSM inet;

boolean started = false;

void setup()
{
Serial.begin(9600);
powerUpOrDown();
Serial.println(F(“Testando GSM Shield SIM900”));
if (gsm.begin(2400))
{
Serial.println(F("\nstatus=READY"));
started = true;
}
}

void loop()
{
if (started) {

envia_GSM();
delay(10000);

}

}

void powerUpOrDown()
{
//Liga o GSM Shield
Serial.print(F(“Liga GSM…”));
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
delay(1000);
digitalWrite(6, HIGH);
delay(1000);
Serial.println(F(“OK!”));
digitalWrite(6, LOW);
delay(500);
}

void envia_GSM()
{
char temp_string[300];
char msg[10];
int numdata;
String Valor;

// if (inet.attachGPRS(“tim.br”, “tim”, “tim”))

if (inet.attachGPRS(“eseye.com”, “USER”, “PASS”))

Serial.println(F(“status=Conectado…”));
else Serial.println(F(“status=Nao conectado !!”));
delay(1000);

Valor=“DATA_1=”;
Valor.concat(“2017-02-05”);
Valor.concat("&HORA_1=");
Valor.concat(“14:00:00”);
Valor.concat("&T_MOTOR_1=");
Valor.concat(60.75);
Valor.concat("&P_OLEO_1=");
Valor.concat(12.00);
Valor.concat("&N_OLEO_1=");
Valor.concat(75.00);
Valor.concat("&N_COMB_1=");
Valor.concat(80.00);
Valor.concat("&N_COMB_1=");
Valor.concat(80.00);
Valor.concat("&ACEL_1=");
Valor.concat(50.00);
Valor.concat("&A_VOL_1=");
Valor.concat(00.00);
Valor.concat("&VEL_1=");
Valor.concat(20.00);
Valor.concat("&G_MOTOR_1=");
Valor.concat(1800.00);
Valor.concat("&P_REV_1=");
Valor.concat(0);
Valor.concat("&T_BAT_1=");
Valor.concat(12.00);
Valor.concat("&S_AGUA_1=");
Valor.concat(0);
Valor.concat("&LATITUDE_1=");
Valor.concat(-12.00);
Valor.concat("&LONGITUDE_1=");
Valor.concat(-12.00);
Valor.concat("&P_COMB_1=");
Valor.concat(120.00);
Valor.concat("&IMEI_1=");
Valor.concat(123456789);

Valor.toCharArray(temp_string, 300);

numdata = inet.httpPOST(“temadre.esy.es”, 80, “/prueba_arduino/add.php”,temp_string, msg, 50);
Valor="";
if (numdata)
{
Serial.println(“Data sent to server succesfully!”);
}
else
{
Serial.println(“Failed to send data to the server”);
}
delay(5000);
}

2-Códigos PHP

Código ADD

New Document <?php

include(“connect.php”);

$link=Connection();

$DATA = $_POST[“DATA_1”];
$HORA = $_POST[“HORA_1”];
$T_MOTOR = $_POST[“T_MOTOR_1”];
$P_OLEO = $_POST[“P_OLEO_1”];
$N_OLEO = $_POST[“N_OLEO_1”];
$N_COMB = $_POST[“N_COMB_1”];
$ACEL = $_POST[“ACEL_1”];
$A_VOL = $_POST[“A_VOL_1”];
$VEL = $_POST[“VEL_1”];
$G_MOTOR = $_POST[“G_MOTOR_1”];
$P_REV = $_POST[“P_REV_1”];
$T_BAT = $_POST[“T_BAT_1”];
$S_AGUA = $_POST[“S_AGUA_1”];
$LATITUDE = $_POST[“LATITUDE_1”];
$LONGITUDE = $_POST[“LONGITUDE_1”];
$P_COMB = $_POST[“P_COMB_1”];
$IMEI = $_POST[“IMEI_1”];

$query = “INSERT INTO Temadre_lanchas_op (DATA,HORA,T_MOTOR,P_OLEO,N_OLEO,N_COMB,ACEL,A_VOL,VEL,G_MOTOR,P_REV,T_BAT,S_AGUA,LATITUDE,LONGITUDE,P_COMB,IMEI)
VALUES (’$DATA’,’$HORA’,’$T_MOTOR’,’$P_OLEO’,’$N_OLEO’,’$N_COMB’,’$ACEL’,’$A_VOL’,’$VEL’,’$G_MOTOR’,’$P_REV’,’$T_BAT’,’$S_AGUA’,’$LATITUDE’,’$LONGITUDE’,’$P_COMB’,’$IMEI’)”;

if (mysqli_query($link,$query)) {
echo “New record created successfully”;
} else {
echo “Error:” . $query . "
" . mysqli_error($link);
}

mysqli_close($link);

header(“Location: index.php”);

?>

Código Connect.php

New Document <?php function Connection(){

$server=“xxxxxxxxxxxxxx”;
$user=“xxxxxxxxxxxxxxx”;
$pass=“xxxxxxxx”;
$db=“xxxxxxxxxxx”;

$connection = mysqli_connect($server, $user, $pass, $db);

/* check connection */

if (mysqli_connect_errno()) {
die("Connect failed: " . mysqli_connect_error()); }
else
{
echo ‘Connection Ok’;
}

return $connection;

}

?>

Código da funçaõ inet.httpPOST

int InetGSM::httpPOST(const char* server, int port, const char* path, const char* parameters, char* result, int resultlength)
{
boolean connected=false;
int n_of_at=0;
char itoaBuffer[8];
int num_char;
char end_c[2];
end_c[0]=0x1a;
end_c[1]=’\0’;

while(n_of_at<3) {
if(!connectTCP(server, port)) {
#ifdef DEBUG_ON
Serial.println(“DB:NOT CONN”);
#endif
n_of_at++;
} else {
connected=true;
n_of_at=3;
}
}

if(!connected) return 0;

gsm.SimpleWrite(“POST “);
gsm.SimpleWrite(path);
gsm.SimpleWrite(” HTTP/1.1\r\nHost: “);
gsm.SimpleWrite(server);
gsm.SimpleWrite(”\r\n”);
gsm.SimpleWrite(“User-Agent: Arduino\r\n”);
gsm.SimpleWrite(“Content-Type: application/x-www-form-urlencoded\r\n”);
gsm.SimpleWrite(“Content-Length: “);
itoa(strlen(parameters),itoaBuffer,10);
gsm.SimpleWrite(itoaBuffer);
gsm.SimpleWrite(”\r\n\r\n”);
gsm.SimpleWrite(parameters);
gsm.SimpleWrite("\r\n\r\n");
gsm.SimpleWrite(end_c);

switch(gsm.WaitResp(10000, 10, “SEND OK”)) {
case RX_TMOUT_ERR:
return 0;
break;
case RX_FINISHED_STR_NOT_RECV:
return 0;
break;
}

delay(50);
#ifdef DEBUG_ON
Serial.println(“DB:SENT”);
#endif

int res= gsm.read(result, resultlength);
//gsm.disconnectTCP();
return res;
}

Onde está a falha, será no servidor?

Pequeno detalhe, a tua variável msg é criada com 10 posições, mas a chamada da função httpPost refere que a variável msg tem 50 posições. Isto pode dar asneira... não acho que explique o problema que tens, mas é uma possibilidade.

Outra coisa que não bate certo foi que o teu resultado indica "nome do servidor", mas no entanto a tua função passa o nome do servidor como "temadre.esy.es". Em que ficamos??

Para testares isto, começa por guardares apenas um valor na base de dados... testa com um browser se consegues guardar os dados assim e depois testa com o Arduino.

Para já o problema que estás a ter é mesmo em ligares ao servidor, basta veres aqui:

  if (!gsm.connectTCP(server, port))
return 0;

E isto leva-me a outra coisa esquisita no teu código... em lado algum eu vejo a declaração da variável gsm...

  if (gsm.begin(2400))

Onde é que isto é declarado, mais concretamente os pinos usados?

Olá amigo, obrigado pelos questionamentos. Assim respondendo aos seus questionamentos:

1-msg ---> Fiz alteração no tamanho, deixando com igual valor porém não alterou em nada o resultado;
2-gsm ---> Trata-se de uma classe da include GSM. que está no cabeçalho da include SIM900.h;
3-temadre.esy.es --> Trata-se do endereço dos arquivos PHP no servidor;
4-por enquanto não tem componentes ligados, estou declarando os valores para teste da função init.httpPost;
5-quanto a conexão com o servidor ---> pelo monitoramento parece que a conexão TCP com o servidor foi realizada.

RIC: AT+CIPSTART="TCP","temadre.esy.es",80

OK

ATT: OK
RIC:
CONNECT OK

DB:OK TCP
ATT: >
RIC: AT+CIPSEND

Recentemente fiz uma versão com apenas duas variáveis, porém aconteceu a mesma falha de envio. Fiz uma versão com comandos AT no código do arduino e aconteceu a mesma falha de envio. Descartando assim, falha na função init.httpPost. Logo parece algum problema com o servidor para atender uma solicitação do arduino, pois já fiz testes do método POST no mesmo servidor e o código add.php deu certo, fiz teste do método POST de outro servidor e deu certo, portando está parecendo alguma falha na rede GSM ? Seria isso?

Já tentaste ligar-te ao Google e pedir o index.html??

Desculpe, mas não entendi?

Estás a fazer uma aplicação relativamente complexa e neste momento testares se o código do Arduino funciona num servidor que está sempre acessível a toda a gente seria uma maneira de perceberes se o código em si tem algum problema ou se o problema será no teu servidor.

No entanto, uma coisa que pensei um pouco mas não tenho tempo agora para ver é a tua variável Valor e a conversão para char array. 300 é suficiente para a string? Porque não converter Valor.length+1 em vez de 300?
O que estou a pensar é que esse 300 pode causar coisas estranhas no buffer.

Imagina que o buffer não está vazio e copias para lá 120 caracteres e a função coloca o fim de string no caracter 299? Isso poderia falhar o pedido de inserção de dados.
Outra maneira que podes experimentar é, antes de chamares o método toCharArray(), fazeres um reset do buffer com memset.

memset(temp_string, '\0', 300);

Isto garante que o que quer que copies para a string "temp_string" terá sempre um terminador.

De resto, sinceramente estou sem ideias para o que poderá ser.