GRAVAR EM BANCO DE DADOS MENSAGENS ENVIADAS PARA CHIP SIM - SHIELD EFCom SIM900

Prezados,

Este projeto consiste em receber mensagens e armazená-las em um banco de dados localizado no servidor gratuito www.000webhost.com. Ele foi baseado no Tutorial da Arduino e Cia:como acessar a internet com o Arduino GSM Shield SIM900. Segue o link abaixo:

É um artigo bastante didático. Porém devido o mesmo ser de 2015, foi necessário fazer algumas pequenas adaptações, principalmente no código das páginas em PHP.

O problema é que o Arduino (estou usando o arduino Mega 2560) não está conseguindo enviar a mensagem para ser gravada no banco de dados. Seguem abaixo as mensagens do monitor serial do arduino e os códigos usados no arduino e páginas PHP.

Gostaria dos colegas para identificar onde está a falha.

Desde já agradeço a atenção de todos.

Sds,

Mensagens do monitor serial do arduino:

Liga GSM...OK!
Testando GSM Shield SIM900
ATT: OK
RIC:
OK

DB:ELSE
DB:NO RESP
DB:NO RESP
ATT: OK
RIC: AT

OK

DB:CORRECT BR
ATT: OK
RIC: AT

OK

ATT: OK
RIC: AT&F

OK

ATT: OK
RIC: ATE0

OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: +CPMS:
RIC:
+CPMS: 1,50,1,50,1,50

OK

ATT: OK
RIC:
OK

ATT: SHUT OK
RIC:
SHUT OK

status=READY
This method is deprecated! Please use GetSMS in the SMS class.
ATT: +CMGL
RIC:
+CMGL: 10,"REC UNREAD","27360","","15/09/17,12:38:06-12"
Bradesco: Alanex , com o seu Cartao Bradesco Visa Platinum voce tem cobertura exclusiva com o Seguro de Locacao de Veiculos em qualqu

OK
ATT: OK
RIC:
OK

ATT: ERROR
RIC:
ERROR

DB:STARTING NEW CONNECTION
ATT: SHUT OK
RIC:
SHUT OK

DB:SHUTTED OK
ATT: OK
RIC:
OK

DB:APN OK
ATT: OK
RIC:
OK

DB:CONNECTION OK
ATT: ERROR
RIC:
177.109.177.20

DB:ASSIGNED AN IP
status=Conectado...
ATT: OK
RIC:
OK
DB:RECVD CMD
ATT: CONNECT OK
RIC:
OK
ATT: OK
RIC:
CONNECT OK
DB:OK TCP
ATT: >
RIC:

DB:>
ATT: SEND OK
RIC:
SEND FAIL
Failed to send data to the server
0

Código do arduino:

/Programa: Arduino GSM Shield SIM900 - Acesso internet
//Autor: Arduino e Cia

//#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"

InetGSM inet;

boolean started = false;
char smsbuffer[160];
char n[20];

byte valor;

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) {
//Aguarda novo SMS e envia para o servidor web
if (gsm.readSMS(smsbuffer, 160, n, 20)) {
String str(smsbuffer);
envia_GSM(smsbuffer);
delay(10000);
}
delay(1000);
}
}

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(String texto)
{
char temp_string[55];
char msg[10];
int numdata;
if (inet.attachGPRS("timbrasil.br", "tim", "tim"))
Serial.println(F("status=Conectado..."));
else Serial.println(F("status=Nao conectado !!"));
delay(100);
String valor = "MSG_Texto1=" + texto;
valor.toCharArray(temp_string, 55);

numdata=inet.httpPOST("temadre.000webhostapp.com", 80, "/add.php", temp_string,msg, 55);

if (numdata)
{
Serial.println("Data sent to server succesfully!");
}
else
{
Serial.println("Failed to send data to the server");
}

delay(5000);
}

Código das páginas PHP:

index.PHP

New Document <?php include("connect.php"); $link=Connection(); $result=mysqli_query($link,"SELECT * FROM `SMS_Recebidos` ORDER BY `TimeStamp` DESC"); ?> Arduino e Cia - GSM Shield ![Arduino e Cia|540x69](upload://eCizgWA1wl8n1Khl7sA7h6OuujT.png)

GSM Shield SIM900 - Registro de SMS

<?php if($result!==FALSE){ while($row = mysqli_fetch_array($result)) { printf("",$row["TimeStamp"], $row["SMS_Texto"]); } mysqli_free_result($result); mysqli_close($link); } ?>
 Data e Hora   Mensagem 
 %s  %s 

add.php

New Document <?php

include("connect.php");

$link=Connection();

$MSG_Texto=$_POST["MSG_Texto1"];

$query = "INSERT INTO SMS_Recebidos (TimeStamp, SMS_Texto)
VALUES (current_timestamp,$MSG_Texto)";

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

mysqli_close($connection);

header("Location: index.php");

?>

connect.php

New Document <?php function Connection(){ $server="localhost"; $user="id1250889_alanex"; $pass="pEdroj85"; $db="id1250889_temadre";

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

/* check connection */

if (mysqli_connect_errno()) {
die("Connect failed: " . mysqli_connect_error());

}

return $connection;

}

?>

Hikari2017:
Prezados,

Este projeto consiste em receber mensagens SMS em cartão SIM instalado no Shield e armazená-las em um banco de dados localizado no servidor gratuito www.000webhost.com. Ele foi baseado no Tutorial da Arduino e Cia:como acessar a internet com o Arduino GSM Shield SIM900. Segue o link abaixo:

http://www.arduinoecia.com.br/2015/11/acessar-internet-arduino-gsm-shield-sim-900.html

É um artigo bastante didático. Porém devido o mesmo ser de 2015, foi necessário fazer algumas pequenas adaptações, principalmente no código das páginas em PHP.

O problema é que o Arduino (estou usando o arduino Mega 2560) não está conseguindo enviar a mensagem para ser gravada no banco de dados. Seguem abaixo as mensagens do monitor serial do arduino e os códigos usados no arduino e páginas PHP.

Gostaria dos colegas para identificar onde está a falha.

Desde já agradeço a atenção de todos.

Sds,

Mensagens do monitor serial do arduino:

Liga GSM...OK!
Testando GSM Shield SIM900
ATT: OK
RIC:
OK

DB:ELSE
DB:NO RESP
DB:NO RESP
ATT: OK
RIC: AT

OK

DB:CORRECT BR
ATT: OK
RIC: AT

OK

ATT: OK
RIC: AT&F

OK

ATT: OK
RIC: ATE0

OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: OK
RIC:
OK

ATT: +CPMS:
RIC:
+CPMS: 1,50,1,50,1,50

OK

ATT: OK
RIC:
OK

ATT: SHUT OK
RIC:
SHUT OK

status=READY
This method is deprecated! Please use GetSMS in the SMS class.
ATT: +CMGL
RIC:
+CMGL: 10,"REC UNREAD","27360","","15/09/17,12:38:06-12"
Mensagem de teste

OK
ATT: OK
RIC:
OK

ATT: ERROR
RIC:
ERROR

DB:STARTING NEW CONNECTION
ATT: SHUT OK
RIC:
SHUT OK

DB:SHUTTED OK
ATT: OK
RIC:
OK

DB:APN OK
ATT: OK
RIC:
OK

DB:CONNECTION OK
ATT: ERROR
RIC:
177.109.177.20

DB:ASSIGNED AN IP
status=Conectado...
ATT: OK
RIC:
OK
DB:RECVD CMD
ATT: CONNECT OK
RIC:
OK
ATT: OK
RIC:
CONNECT OK
DB:OK TCP
ATT: >
RIC:

DB:>
ATT: SEND OK
RIC:
SEND FAIL
Failed to send data to the server
0

Código do arduino:

/Programa: Arduino GSM Shield SIM900 - Acesso internet
//Autor: Arduino e Cia

//#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"

InetGSM inet;

boolean started = false;
char smsbuffer[160];
char n[20];

byte valor;

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) {
//Aguarda novo SMS e envia para o servidor web
if (gsm.readSMS(smsbuffer, 160, n, 20)) {
String str(smsbuffer);
envia_GSM(smsbuffer);
delay(10000);
}
delay(1000);
}
}

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(String texto)
{
char temp_string[55];
char msg[10];
int numdata;
if (inet.attachGPRS("timbrasil.br", "tim", "tim"))
Serial.println(F("status=Conectado..."));
else Serial.println(F("status=Nao conectado !!"));
delay(100);
String valor = "MSG_Texto1=" + texto;
valor.toCharArray(temp_string, 55);

numdata=inet.httpPOST("temadre.000webhostapp.com", 80, "/add.php", temp_string,msg, 55);

if (numdata)
{
Serial.println("Data sent to server succesfully!");
}
else
{
Serial.println("Failed to send data to the server");
}

delay(5000);
}

Código das páginas PHP:

index.PHP

New Document <?php include("connect.php"); $link=Connection(); $result=mysqli_query($link,"SELECT * FROM `SMS_Recebidos` ORDER BY `TimeStamp` DESC"); ?> Arduino e Cia - GSM Shield ![Arduino e Cia|540x69](upload://eCizgWA1wl8n1Khl7sA7h6OuujT.png)

GSM Shield SIM900 - Registro de SMS

<?php if($result!==FALSE){ while($row = mysqli_fetch_array($result)) { printf("",$row["TimeStamp"], $row["SMS_Texto"]); } mysqli_free_result($result); mysqli_close($link); } ?>
 Data e Hora   Mensagem 
 %s  %s 

add.php

New Document <?php

include("connect.php");

$link=Connection();

$MSG_Texto=$_POST["MSG_Texto1"];

$query = "INSERT INTO SMS_Recebidos (TimeStamp, SMS_Texto)
VALUES (current_timestamp,$MSG_Texto)";

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

mysqli_close($connection);

header("Location: index.php");

?>

connect.php

New Document <?php function Connection(){ $server="localhost"; $user="id1250889_alanex"; $pass="pEdroj85"; $db="id1250889_temadre";

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

/* check connection */

if (mysqli_connect_errno()) {
die("Connect failed: " . mysqli_connect_error());

}

return $connection;

}

?>

Quando tem 2 coisas deste tipo (Arduino de um lado, PHP do outro, ou Java de um lado, PHP etc...) a dificuldade principal vem do fato que é complicado saber onde esta o problema.
Então precisa simplificar bastante um lado, a fim de testar outro lado.
Em PHP, vc tem um código complicado.
Minha ideia seria criar um código PHP bastante simples, deste tipo:

<?php $MSG_Texto=$_POST["MSG_Texto1"]; $handle=fopen("test.txt","a+"); // Abrir documento para escrever fwrite($handle, $MSG_Texto); // Escrever fclose($handle); // Fechar ?>

Nada mais.

Vc pode testar o codigo:

  1. usa $_GET ao inves de $_POST
  2. digita no seu navegador http://temadre.000webhostapp.com/add.php?MSG_Texto1=MeuTest
  3. da uma olhada no servidor e vc deve ver o documento test.txt com a palavra "MeuTest"

Depois disso, vc sabe que o código PHP é coreto e vc pode corrigir o código Arduino.

Abraço
PL

Prezado ansb,

Quando digitei o http://temadre.000webhostapp.com/add.php?MSG_Texto1=MeuTest acrescentou na tabela uma linha com data e hora porém em branco, ou seja, sem dado de mensagem.

Porém, Já consegui testar o código PHP com POST mesmo, criei uma outra página que chama a add.php e e envia o valor da variável MSG_Texto1

Como Pegar Dados do Formulario via POST com PHP

Enviando dados via POST

Funcionou, logo acredito que o problema está na função init.HTTPPOST, na conexão GSM/GPRS ou na conexão com o banco de dados? Vamos por parte:

1-O banco de dados pode rejeitar uma conexão externa como essa? Se sim, o que devo fazer ou como posso testar uma conexão externa ao banco de dados?

2-Como posso testar se a conexão gsm/gprs está ok?

Desde já agradeço a ajuda de todos.

Sds,

Estou com o mesmo problema, o que tudo indica é que o modulo não consegue fazer a conexão com o GPRS ( segundo as luzes indicativas NET, o sistema encontra a rede mas não tem conexão GPRS). Alguma novidade no desenvolvimento?

Boa noite,
Estou enfrentando o mesmo problema, consigo inserir dados diretamente pela url porém não consigo postar pelo Arduíno, nem via comandos AT nem http.POST, ALGUMA NOVIDADE?

status=Conectado...
ATT: OK
RIC:
OK

DB:RECVD CMD
ATT: CONNECT OK
RIC:
OK

ATT: OK
RIC:
CONNECT OK

DB:OK TCP
ATT: >
RIC:

DB:>
ATT: SEND OK
RIC:
SEND FAIL

Estou tendo o mesmo problema, no mesmo ponto.
Também criei uma página php só pra testar essa comunicação com o servidor post no servidor, e também tive sucesso fazendo isso.

Hikari2017:
1-O banco de dados pode rejeitar uma conexão externa como essa? Se sim, o que devo fazer ou como posso testar uma conexão externa ao banco de dados?

2-Como posso testar se a conexão gsm/gprs está ok?

1 - O que eu soube é que esses servidores compartilhados tem algum tipo de bloqueio. Porém, no forum do webhost, os moderadores disseram que tem como fazer a comunicação (mas não detalharam nada)
2 - A comunicação pode ser acompanhada pelo serial monitor. Ela conecta ao servidor (esse "tcp ok"), mas falha na hora do post. É isso o que tem me causado a maior dúvida. Estou tentando achar alguma modificação a ser feita na biblioteca, relacionado ao html, mas não achei nada que solucionasse o problema ainda.

Alguém dentre vocês teve algum avanço?

Ola,
Faz muito tempo desde a primeira resposta. Mas vamos lá:

  • Se vc tenta conectar a traves de uma pagina PHP (ao seja chamar uma pagina PHP), não deve ter problema tipo "rejeitar conexão". No contrario, se vc quer chamar diretamente MySQL ou outro tipo de motor de dados a partir de uma conexão externa, por exemplo fazendo o mysql_connect com o Arduino, a conexão vai ser rejeitada: em 99% dos casos, somente um script que esta no servidor mesmo pode acessa no SQL.

  • A partir do momento onde vc acessa no PHP sem navegador, vc não pode mas ver os mensagem que vc vai imprimir usando "print". Por isso, vc deve escrever os mensagem num documento (imposivel fazer o sql_connect, mostrar o query que vc envia etc...). A fim da conta somente um erro no nome de uma variável e suficiente para não ter o resultado esperado. E como vc não acessa com um navegador, podemos disser que vc é cego, o que complica bastante :slight_smile:

  • Precisa testar com GET e com POST. Mas não precisa esquecer fazer um URLEncode sobre os dados. Por exemplo, enviar "Ola meu amigão" usando:
    Custom Application Development Software for Business - Salesforce.com meu amigão
    não da certo.
    Vc deve enviar:
    Custom Application Development Software for Business - Salesforce.com

Veja aqui: URL Decoder/Encoder

  • Se a conclusão é que, na chegada no PHP, tem nada no POST ou no GET, pode ser que o "header" HTTP enviado não esta coreto. A pagina PHP deve receber um HTTP Status com valor 200.
    Possível ler este valor em php com http_response_code();

Ontem, eu gastei muito tempo com uma ligação entre uma pagina web e um pequeno servidor em Java porque meu servidor Java (no Android) enviei dados errados, com resultado ter um http_response_code() = 0 no navegador e nenhuma info no POST nem no GET. Para resolver isso, eu precisei colocar um elemento de header a mas, (lado do servidor). Aqui meu codigo Java. Isso pode dar uma ideia do conteúdo do header que precisa enviar:

os = new PrintWriter(socket.getOutputStream(), true);
String response = "Ola";
os.print("HTTP/1.1 200 OK" + "\r\n"); // para indicar que tudo da certo
os.print("Access-Control-Allow-Origin: *" + "\r\n"); // Sem esta linha POST=GET=nada!
os.print("Content-type: text/plain" + "\r\n"); // Conteudo = texto puro
os.print("Content-length: " + response.length() + "\r\n"); // Tamanho do conteudo
os.print("\r\n");
os.print(response + "\r\n");
os.flush(); // Limpar para enviar
socket.close();

Espero que isso vai poder ajudar vc.

Um forte abraço
Pierre

Boa noite, amigo.

Vi no seu site "http://temadre.000webhostapp.com" que conseguiu comunicar corretamente o arduino via gprs com o 000webhost.

Você teria como me enviar seus arquivos add.php, connect.php e index.php?

Agradeço desde já. Meu e-mail é: gustavovargas93@gmail.com

Consegui fazer funcionar. Porém, as minhas mensagens estão indo em branco. Porque isso?

Tentei enviar por aqui:
http://larm.000webhostapp.com/add.php?MSG_Texto1=TESTE

Mas mesmo assim elas vão em branco.

Como você fez pra elas não irem em branco?

gustavo, seu banco e php estao funcionando, mas infelizmente os meus não estão, te enviei um e-mail, me responda lá por favor

Gustavo e Danilo verifiquei que vocês conseguiram enviar informações ao banco mysql e constatar o recebimento pelo index.php as informações. Você poderiam disponibilizar aqui a modificações necessárias para o funcionamento. Obrigado.