Hola comunidad, buen día, solicito de su ayuda ya que tengo más de un mes intentando enviar petición HTTP a una API a través de un módulo SIM808 utilizando los comandos AT. Lo eh intentado de manera directa (es decir, ingreso los comandos desde el Monitor Serial que tiene por comunicación PC-Arduino y todo funciona correctamente, tanto peticiones GET como POST), pero cuando intento automatizar el proceso para que ejecute los comandos al realizar una venta y mande los datos a la API, sufre algo que no comprendo, al momento de mandar el comando de AT+HTTPPARA="URL","miAPI..."
no escribe correctamente el comando y por lo tanto no conecta con la api, y en ocasiones me resetea el código que incluso me vuelve a ejecutar el void setup()
.
Si alguien pudiera apoyarme con esto, de antemano estaría muy agradecido. Comparto el código para mejor comprensión y una imagen del resultado.
tengo partido el proyecto en 3 archivos.ino
Main.ino
unsigned long miliPrevioGaspar = 0;
unsigned long miliActualoGaspar = 0;
const long intervaloGaspar = 10;
unsigned long miliPrevioGPS = 0;
unsigned long miliActualoGPS = 0;
const long intervaloGPS = 10000;
String url = "http://mi.api.net:8025/controlador/ard"; // esta api no existe, solo por privacidad la cambio.
#include <ArduinoJson.h>
String json;
String latitudGuardada = "-1.0";
String longitudGuardada = "-1.0";
String datosEnGET;
String datosThingSpeakGET;
/* *************** VARIABLES DEL GASPAR *************** */
int i = 0;
char delimitador[] = "\r";
char *strtok(char *datos, const char *delimitador);
char *resultado = NULL;
//Clave-Valor
char *valores = NULL;
char delimitadorV[] = ":";
char delimitadorEspacio[] = " ";
int cv;
String dataValores[12];
/* *************** VARIABLES DEL GPS *************** */
#include <TinyGPS.h>
TinyGPS gps;
String latitudString="0", longitudString="0";
String datosAenviar;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // espera a que el puerto serie se conecte. Necesario para el puerto USB nativo solamente
}
Serial.println("El serial esta habilitado.");
Serial1.begin(9600); // serialGaspar
Serial2.begin(19200); // serialSIM 19200 | 115200
// Serial2.println("AT+CGPSOUT=0");
iniciarSIM808();
delay(2000);
Serial.print("Simple TinyGPS library v. ");
Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println("LISTO!");
Serial.println();
}
void loop() {
miliActualoGaspar = millis();
miliActualoGPS = millis();
/* *************** SECCIÓN DEL GASPAR *************** */
if (miliActualoGaspar - miliPrevioGaspar >= intervaloGaspar) {
miliPrevioGaspar = miliActualoGaspar;
// Serial1.listen();
while (Serial1.read() > 0) {
Serial.println("Datos de SerialGaspar:");
obteniendoDatos();
Serial.println();
// comandosATEnviarDatos();
// enviarPeticionPOST();
// enviarPOST();
// enviarGET();
// enviarGET3();
// enviarPOSTsimple();
// enviarGETxTCP();
thing();
}
}
/* *************** SECCIÓN DEL GPS *************** */
if (miliActualoGPS-miliPrevioGPS >= intervaloGPS) {
miliPrevioGPS = miliActualoGPS;
obteniendoGPS();
// Serial.print("latitudString: ");Serial.println(latitudString);
// Serial.print("latitudGuardada: ");Serial.println(latitudGuardada);
// Serial.print("longitudString: ");Serial.println(longitudString);
// Serial.print("longitudGuardada: ");Serial.println(longitudGuardada);
if ((latitudString != latitudGuardada) || (longitudString != longitudGuardada)) {
latitudGuardada = latitudString;
longitudGuardada = longitudString;
}
}
}
void thing()
{
Serial2.println("AT+CGPSOUT=1");
delay(1000);
float h = 20;
float t = 10;
delay(100);
Serial.print("Temperature = ");
Serial.print(t);
Serial.println(" °C");
Serial.print("Humidity = ");
Serial.print(h);
Serial.println(" %");
if (Serial2.available())
Serial.write(Serial2.read());
Serial2.println("AT");
delay(1000);
Serial2.println("AT+CPIN?");
delay(1000);
Serial2.println("AT+CREG?");
delay(1000);
Serial2.println("AT+CGATT?");
delay(1000);
Serial2.println("AT+CIPSHUT");
delay(1000);
Serial2.println("AT+CIPSTATUS");
delay(2000);
Serial2.println("AT+CIPMUX=0");
delay(2000);
ShowSerialData();
Serial2.println("AT+CSTT=\"internet.itelcel.com\"");//start task and setting the APN,
delay(1000);
ShowSerialData();
Serial2.println("AT+CIICR");//bring up wireless connection
delay(3000);
ShowSerialData();
Serial2.println("AT+CIFSR");//get local IP adress
delay(2000);
ShowSerialData();
Serial2.println("AT+CIPSPRT=0");
delay(3000);
ShowSerialData();
Serial2.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");
// Serial2.println("AT+CIPSTART=\"TCP\",\"mi.api.net\",\"8025\"");
delay(6000);
ShowSerialData();
Serial2.println("AT+CIPSEND");
delay(4000);
ShowSerialData();
// String str="GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE&field1=" + String(t) +"&field2="+String(h);
String str="GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE"+datosThingSpeakGET; //ACTUALMENTE ENVIO LOS DATOS A ThingSpeak, pero no es lo deseado, sino mandarlo directamente a mi API, lo hice solo para darme cuenta de que el codigo si funciona, "ESTE CODIGO"
// String str="GET http://mi.api.net:8025/controlador/ard?p=11.15&t=211.85&l=19.00&s=2178&f=27/09/21 10:15:59&la=25.1234567&lo=-103.1234567"; // esta api no existe, solo por privacidad la cambio.
Serial.println(str);
Serial2.println(str);
delay(4000);
ShowSerialData();
Serial2.println((char)26);
delay(5000);
Serial2.println();
ShowSerialData();
Serial2.println("AT+CIPSHUT");
delay(100);
ShowSerialData();
}
void ShowSerialData()
{
while(Serial2.available()!=0)
Serial.write(Serial2.read());
delay(5000);
}
Despues tenemos Gaspar.ino
/* *************** FUNCIONES DEL GASPAR *************** */
void obteniendoDatos() {
// Serial.println("-------DATOS PUROS---------");
// Serial.println(Serial.readString());
// Serial.println("-------DATOS PUROS---------");
char str[350] = "";
memset(str, '\0', sizeof(str));
Serial1.readString().toCharArray(str, 350);
obtenerRenglones(str);
}
void obtenerRenglones(char *str) {
// Serial.println("-------DATOS GASPAR---------");
String datos[12];
i = 0;
resultado = strtok(str, delimitador);
while (resultado != NULL) {
// Serial.println(resultado);
datos[i] = resultado;
resultado = strtok(NULL, delimitador);
i++;
}
obtenerValores(str, datos);
}
// void obtenerValores(float latitud, float longitud) {
void obtenerValores(char *str, String datos[12]) {
// Serial.println("-----EL FOR-----");
for (int f = 0; f < i; f++) {
if (datos[f].indexOf(":") > 0) {
bool hayDato = false;
// Serial.println("Hay puntos señores");
// if (datos[f].indexOf("UNIDAD") > 0) {
// hayDato = true;
// }
if (datos[f].indexOf("PRECIO") > 0) {
hayDato = true;
cv = 0;
Serial.println("Hay Precio");
}
if (datos[f].indexOf("IMPORTE") > 0) {
hayDato = true;
cv = 1;
Serial.println("Hay importe");
}
if (datos[f].indexOf("LITROS") > 0) {
hayDato = true;
cv = 2;
Serial.println("Hay litros");
}
// if (datos[f].indexOf("MEDIDOR") > 0) {
// hayDato = true;
// }
if (datos[f].indexOf("SERVICIO") > 0) {
hayDato = true;
cv = 3;
Serial.println("Hay servicio");
}
if (datos[f].indexOf("FECHA") > 0) {
hayDato = true;
cv = 4;
Serial.println("Hay fecha");
}
if (hayDato) {
datos[f].toCharArray(str, 350);
if (cv == 4) {
valores = strtok(str, delimitadorEspacio);
} else {
valores = strtok(str, delimitadorV);
}
int v = 0;
while (valores != NULL) {
if (v == 1) {
dataValores[cv] = valores;
break;
}
while (cv >= 4) {
if (v > 0 && v < 3) {
dataValores[cv] = valores;
cv++;
}
v++;
valores = strtok(NULL, delimitadorEspacio);
if (v > 3) {
break;
}
}
valores = strtok(NULL, delimitadorV);
v++;
}
}
}
}
// Serial.println("-----AL JSON-------");
float precio_gas = dataValores[0].toFloat();
float total = dataValores[1].toFloat();
float litros = dataValores[2].toFloat();
int servicio = dataValores[3].toInt();
String fecha = dataValores[4];
String hora = dataValores[5];
Serial.println("-----EL JSON-------");
// String jj = "";
// jj = "{\"precio_gas\":";
// jj += precio_gas;
// jj += ",\"total\":";
// jj += total;
// jj += ",\"litros\":";
// jj += litros;
// jj += ",\"servicio\":";
// jj += servicio;
// jj += ",\"fecha\":\"";
// jj += fecha;
// jj += " ";
// jj += hora;
// jj += "\",\"latitud\":";
// jj += latitudGuardada;
// jj += ",\"longitud\":";
// jj += longitudGuardada;
// jj += "}";
// Serial.println(jj);
// datosEnGET = "";
// datosEnGET = "p=";
// datosEnGET += precio_gas;
// datosEnGET += "&t=";
// datosEnGET += total;
// datosEnGET += "&l=";
// datosEnGET += litros;
// datosEnGET += "&s=";
// datosEnGET += servicio;
// datosEnGET += "&f=";
// datosEnGET += fecha;
// datosEnGET += " ";
// datosEnGET += hora;
// datosEnGET += "&la=";
// datosEnGET += latitudGuardada;
// datosEnGET += "&lo=";
// datosEnGET += longitudGuardada;
// Serial.println(datosEnGET);
datosThingSpeakGET = "";
datosThingSpeakGET = "&field1=";
datosThingSpeakGET += precio_gas;
datosThingSpeakGET += "&field2=";
datosThingSpeakGET += total;
datosThingSpeakGET += "&field3=";
datosThingSpeakGET += litros;
datosThingSpeakGET += "&field4=";
datosThingSpeakGET += servicio;
datosThingSpeakGET += "&field5=";
datosThingSpeakGET += fecha;
datosThingSpeakGET += " ";
datosThingSpeakGET += hora;
datosThingSpeakGET += "&field6=";
datosThingSpeakGET += latitudGuardada;
datosThingSpeakGET += "&field7=";
datosThingSpeakGET += longitudGuardada;
// Serial.println(datosThingSpeakGET);
serializeObject(precio_gas, total, litros, servicio, fecha, hora, latitudGuardada, longitudGuardada);
}
void serializeObject(float p, float t, float l, int s, String f, String h, String lat, String lon) {
StaticJsonDocument<1024> datosGaspar;
datosGaspar["precio_gas"] = p;
datosGaspar["total"] = t;
datosGaspar["litros"] = l;
datosGaspar["servicio"] = s;
datosGaspar["fecha_hora"] = f+" "+h;
datosGaspar["latitud"] = lat;//.toFloat();
datosGaspar["longitud"] = lon;//.toFloat();
serializeJson(datosGaspar, json);
Serial.println(json);
}
}
Y POR ÚLTIMO, PASA POR SIM808.ino en este punto, ya me guardo los datos en la variable json. el metodo void iniciarSIM()
se ejecuta en el void setup()
/*
AT ----------------> Sirve para verificar si el módulo está funcionando adecuadamente para entrar en modo comando.
ABRE GPS ----------> AT+CGPSPWR=1
CHECAR STATUS -----> AT+CGPSSTATUS?
CIERRA GPS --------> AT+CGPSPWR=0
COORDENADAS -------> AT+CGPSOUT=32
CONECTARSE A RED --> AT+CGATT=1
*/
/* *************** INICIALIZANDO MODULO SIM808 Y GPS *************** */
void iniciarSIM808() {
int respuesta = 0;
if (enviarAT("AT","OK",2000) == 0) {
delay(2000);
while (respuesta == 0) {
// Ciclarse mientras conecta GPS
// Sirve para verificar si el módulo está funcionando adecuadamente para entrar en modo comando.
respuesta = enviarAT("AT","OK",2000);
Serial2.println(respuesta);
}
}
Serial.println("GPS conectado");
while (enviarAT("AT+CGPSPWR=1","OK",1000) == 0)
; // Ciclarse mientras enciende el GPS
Serial.println("GPS encendido");
// while (enviarAT("AT+CGPSOUT=1","OK",3000) == 0)
// ; // Ciclarse mientras se configura la salida de datos del GPS en desactivada
/* ------------------ COMANDOS PARA CONECTAR A INTERNET ------------------*/
// enviarAT("AT+CGATT=1","OK\r\n",1000);//Conectarse a la red
// for (int i=0; i < 2; i++) {enviarAT("AT+HTTPTERM\r\n","OK",1000);}//Finalizar sesión HTTP
// // Serial.println("");
// for (int i=0; i < 2; i++) {enviarAT("AT+SAPBR=0,1\r\n","OK",1000);}//Cerrar el servicio HTTP
// Serial.println("");
// while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",3000) == 0)
// ; // Ciclarse mientras establece parámetro de portador
// // Serial.println("");
// while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",3000) == 0)
// ; // Ciclarse mientras establece contexto de portador
// // Serial.println("");
// while (enviarAT("AT+SAPBR=1,1\r\n","OK",3000) == 0)
// ; // Ciclarse mientras activa contexto de portador
// // Serial.println("");
// while (enviarAT("AT+SAPBR=2,1\r\n","OK",3000) == 0)
// ; // Ciclarse mientras lee parámetro de portador
// Serial.println("");
// Serial2.println("AT+CIPSTATUS"); //Consultar el estado actual de la conexión
// delay(2000);
// Serial2.println("AT+CIPMUX=0"); //comando configura el dispositivo para una conexión IP única o múltiple 0=única
// delay(3000);
// mostrarDatosSeriales();
// Serial2.println("AT+CSTT=\"internet.itelcel.com\",\"webgprs\",\"webgprs2003\""); //comando configura el APN, nombre de usuario y contraseña."gprs.movistar.com.ar","wap","wap"->Movistar Arg.
// delay(1000);
// mostrarDatosSeriales();
// Serial2.println("AT+CIICR"); //REALIZAR UNA CONEXIÓN INALÁMBRICA CON GPRS O CSD
// delay(3000);
/* ------------------ COMANDOS PARA CONECTAR A INTERNET ------------------*/
while (enviarAT("AT+CGPSOUT=32\r\n","OK",1000) == 0)
; // Ciclarse mientras se configura la salida de datos del GPS
Serial.println("GPS activo");
Serial.println();
}
int enviarAT(String comandoAT, char* respuestaCorrecta, unsigned int tiempo) {
int x = 0;
bool correcto = 0;
char respuesta [100];
unsigned long anterior;
memset(respuesta, '\0', 100);
delay(100);
while(Serial2.available() > 0) Serial2.read();
Serial2.println(comandoAT);
x = 0;
anterior = millis();
do {
if (Serial2.available() != 0) {
respuesta[x] = Serial2.read();
x++;
if (strstr(respuesta, respuestaCorrecta) != NULL) {
correcto = 1;
}
}
} while ((correcto == 0) && ((millis() - anterior) < tiempo));
Serial.println(respuesta);
return correcto;
}
int enviarPeticion(String comandoAT, char* respuestaCorrecta, unsigned int tiempo, int longitud) {
// Serial.print("longitud:");Serial.println(longitud);
int x = 0;
bool correcto = 0;
char respuesta [longitud]; //longitud | 100
unsigned long anterior;
memset(respuesta, '\0', longitud); //longitud | 100
delay(100);
while(Serial2.available() > 0) Serial2.read();
Serial2.flush();
Serial2.println(comandoAT);
x = 0;
anterior = millis();
do {
if (Serial2.available() != 0) {
respuesta[x] = Serial2.read();
x++;
Serial.print("respuesta: "); Serial.println(respuesta);
if (strstr(respuesta, respuestaCorrecta) != NULL) {
correcto = 1;
}
}
} while ((correcto == 0) && ((millis() - anterior) < tiempo));
// Serial.print("correcto: "); Serial.println(correcto);
// Serial.print("respuesta FINAL: ");
Serial.println(respuesta);
return correcto;
}
// int enviarData(String comandoAT, char* respuestaCorrecta, unsigned int tiempo, int longitud) {
// int x = 0;
// // Serial2.flush();
// bool correcto = 0;
// bool dataJson = 0;
// char respuesta [longitud];
// char respuestaJson [json.length()];
// unsigned long anterior;
// memset(respuesta, '\0', longitud);
// delay(100);
// while(Serial2.available() > 0) Serial2.read();
// Serial2.println(comandoAT);
// x = 0;
// anterior = millis();
// do {
// if (Serial2.available() != 0) {
// respuesta[x] = Serial2.read();
// x++;
// Serial.print("respuesta url: "); Serial.println(respuesta);
// Serial.print("respuestaCorrecta url: "); Serial.println(respuestaCorrecta);
// if (strstr(respuesta, "DOWNLOAD") != NULL) {
// Serial.println("DOWNLOAD...");
// json.toCharArray(respuestaJson, json.length());
// Serial.print("respuestaJSON: "); Serial.println(respuestaJson);
// Serial.print("respuestaJSON: "); Serial.println(respuestaJson);
// dataJson = 1;
// }
// if (dataJson) {
// if (strstr(respuesta, respuestaCorrecta) != NULL) {
// correcto = 1;
// }
// }
// }
// } while ((correcto == 0) && ((millis() - anterior) < tiempo));
// Serial.println(respuesta);
// return correcto;
// }
/* *************** INICIALIZANDO MODULO SIM808 Y GPS *************** */
/* *************** FUNCIONES DEL GPS *************** */
void obteniendoGPS() {
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
// Durante un segundo, analizamos los datos del GPS e informamos algunos valores clave.
for (unsigned long start = millis(); millis() - start < 1000;) {
while (Serial2.available()) {
char c = Serial2.read();
// Serial.write(c); // Descomente esta línea si desea ver el flujo de datos GPS
if (gps.encode(c)) // ¿Ha entrado una nueva sentencia válida?
newData = true;
}
}
if (newData) {
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
latitudString = String(flat,7);
longitudString = String(flon,7);
}
gps.stats(&chars, &sentences, &failed);
if (chars == 0)
Serial.println("** No se han recibido caracteres del GPS: compruebe el cableado **");
}
/*
// void comandosATEnviarDatos() {
// while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
// ;// Cerrar los datos que envia el GPS
// Serial.println("Ejecutando comandos para enviar datos a la API...");
// Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
// delay(1000);
// Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
// delay(2000);
// while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
// ;//Revisar conexión del SIM
// while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
// ;//
// while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
// ;//
// while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
// ;//Se inicia el servicio HTTP
// while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
// ;//Para llamar HTTP
// // Serial.println();
// // String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
// String peticion = "AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n";
// // Serial2.println("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n");//Configurar el encabezado para enviar json y enseguida enviar JSON
// // Serial2.println(peticion);
// // mostrarDatosSeriales();
// // delay(1000);
// // while (enviarAT("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n","OK",2000) == 1)
// // // ;// URL de peticion
// enviarAT(peticion, NULL,1000);
// // ;//
// String httpData = "AT+HTTPDATA="+(String)json.length()+",10000\r\n";
// Serial2.println(httpData);//Configurar el encabezado para enviar json y enseguida enviar JSON
// mostrarDatosSeriales();
// Serial2.println(json);
// mostrarDatosSeriales();
// // delay(10000);
// while (enviarAT("AT+HTTPACTION=1\r\n","OK",2000) == 0)
// ;// Indicando tipo de peticion HTTP (0=GET | 1=POST)
// while (enviarAT("AT+HTTPREAD\r\n","OK",2000) == 0)
// ;// Configurar el encabezado para enviar json: longitud de caracteres a enviar
// while (enviarAT("AT+HTTPTERM\r\n","OK",2000) == 0)
// ;// Configurar el encabezado para enviar json: longitud de caracteres a enviar
// Serial2.println("AT+CGPSOUT=32");
// delay(500);
// Serial.println("DATOS ENVIADOS.");
// }
// void enviarPeticionPOST() {
// while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
// ;// Cerrar los datos que envia el GPS
// Serial.println("Ejecutando comandos para enviar datos a la API...");
// Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
// delay(1000);
// Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
// delay(2000);
// while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
// ;//Revisar conexión del SIM
// while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
// ;//
// while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
// ;//
// while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
// ;//Se inicia el servicio HTTP
// while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
// ;//Para llamar HTTP
// // Serial2.println("AT+CGPSOUT=1\r\n");
// // mostrarDatosSeriales();
// // delay(1500);
// // Serial.println("Ejecutando comandos para enviar datos a la API...");
// // Serial2.println("AT+HTTPTERM\r\n");
// // mostrarDatosSeriales();
// // delay(1500);
// // Serial2.println("AT+SAPBR=0,1\r\n");
// // mostrarDatosSeriales();
// // delay(1500);
// // Serial2.println("AT+CGATT=1\r\n");
// // mostrarDatosSeriales();
// // delay(1500);
// // Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n");
// // mostrarDatosSeriales();
// // delay(2500);
// // Serial2.println("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n");
// // mostrarDatosSeriales();
// // delay(2500);
// // Serial2.println("AT+HTTPINIT\r\n");
// // mostrarDatosSeriales();
// // delay(2500);
// // Serial2.println("AT+HTTPPARA=\"CID\",1\r\n");
// // mostrarDatosSeriales();
// // delay(2500);
// String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
// // Serial2.println("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n");
// // enviar_de_Serial1_a_Serial2();
// // Serial2.println(peticion);
// // mostrarDatosSeriales();
// enviarAT("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"","OK",10000);
// //Para llamar HTTP
// // while(Serial2.available() > 0) Serial2.read();
// // Serial2.println(comandoAT);
// delay(2000);
// String httpData = "AT+HTTPDATA="+(String)json.length()+",5000\r\n";
// // Serial2.println(httpData);
// // // enviar_de_Serial1_a_Serial2();
// // mostrarDatosSeriales();
// // while (enviarData(httpData,"DOWNLOAD",1000) == 0)
// ;//Para llamar HTTP
// // delay(2500);
// // enviarAT(json," ",1000);
// // Serial.println(json);
// // enviar_de_Serial1_a_Serial2();
// Serial2.println((char)26);
// // mostrarDatosSeriales();
// delay(2500);
// Serial2.println("AT+HTTPACTION=1\r\n");
// mostrarDatosSeriales();
// delay(2500);
// Serial2.println("AT+HTTPREAD\r\n");
// mostrarDatosSeriales();
// delay(2500);
// Serial2.println("AT+HTTPTERM\r\n");
// mostrarDatosSeriales();
// delay(2500);
// Serial2.println("AT+CGPSOUT=32\r\n");
// mostrarDatosSeriales();
// delay(2500);
// Serial.println("DATOS ENVIADOS.");
// }
*/
void mostrarDatosSeriales() { //Muestra los datos que va entregando el sim
while(Serial2.available()!=0)
Serial.write(Serial2.read());
Serial.println();
}
void enviar_de_Serial1_a_Serial2(int inter) {
unsigned long miliPrevio = 0;
unsigned long miliActual = millis();
const long intervalo = inter;
while (miliActual - miliPrevio >= intervalo){
miliPrevio = miliActual;
if (Serial.available() > 0)
Serial2.write(Serial.read());
if (Serial2.available() > 0)
Serial.write(Serial2.read());
}
}
void enviarPOST() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
;//Se inicia el servicio HTTP
while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
;//Para llamar HTTP
// url = "http://dev.teubi.co/hola.php";
String peticion = "AT+HTTPPARA=\"URL\",\"" + url;
// Serial2.println(peticion);
// while (enviarPeticion(peticion,"OK",3000, peticion.length()) == 0)
while (enviarAT(peticion,"OK",6000) == 0)
;
// // Serial.write(Serial.read());
// // enviar_de_Serial1_a_Serial2();
// //Para llamar HTTP
// // delay(2000);
enviarAT("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n","OK",1000);
String httpData = "AT+HTTPDATA="+(String)json.length()+",5000";
// // Serial.println(httpData);
// // enviar_de_Serial1_a_Serial2();
// // mostrarDatosSeriales();
// // Serial.println(httpData.length());
enviarPeticion(httpData,"OK",2000, httpData.length());
// // enviarData(httpData,"OK",2000, httpData.length());
// //Para llamar HTTP
// delay(2500);
// enviarAT(json," ",1000);
// // Serial2.println(json);
// // enviar_de_Serial1_a_Serial2();
Serial2.println((char)26);
// // mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPACTION=1\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarPOSTsimple() {
// Cerrar los datos que envia el GPS
Serial2.println("AT+CGPSOUT=1\r\n");
delay(1000);
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
//Revisar conexión del SIM
Serial2.println("AT+CGATT=1\r\n");
delay(1000);
Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n");
delay(1000);
Serial2.println("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n");
delay(1000);
//Se inicia el servicio HTTP
Serial2.println("AT+HTTPINIT\r\n");
delay(1000);
//Para llamar HTTP
Serial2.println("AT+HTTPPARA=\"CID\",1\r\n");
delay(1000);
//Parametros
String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
// String peticion = "AT+HTTPPARA=\"URL\",\"http://dev.teubi.co/hola.php\"\r\n";
// Serial2.println(peticion);
Serial2.println(peticion);
delay(2500);
Serial2.println("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n");
delay(1000);
String httpData = "AT+HTTPDATA="+(String)json.length()+",10000";
Serial2.println(httpData);
delay(4000);
Serial2.println(json);
Serial2.println((char)26);
delay(2500);
Serial2.println("AT+HTTPACTION=1\r\n");
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
// Serial2.println("AT+HTTPREAD\r\n");
// delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGET() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
;//Se inicia el servicio HTTP
while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
;//Para llamar HTTP
String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"";
Serial.println(peticion);
// while (enviarPeticion(peticion,"OK",20000, peticion.length()) == 0)
while (enviarAT(peticion,"OK",20000) == 0)
; //nada
// Serial.write(Serial.read());
// enviar_de_Serial1_a_Serial2();
//Para llamar HTTP
// delay(2000);
delay(2500);
Serial2.println("AT+HTTPACTION=0\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGET2() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
;//Se inicia el servicio HTTP
while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
;//Para llamar HTTP
String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"";
Serial.println(peticion);
// while (enviarPeticion(peticion,"OK",20000, peticion.length()) == 0)
// ;
int u = 0;
int r = 0;
char urlGet [peticion.length()];
char urlRespuesta [2];
peticion.toCharArray(urlGet,peticion.length());
Serial.print("urlGET: ");Serial.println(urlGet);
while(u <= peticion.length()){
// Serial.write(urlGet[u]);
Serial2.write(urlGet[u]);
u++;
}
while (r < 2) {
urlRespuesta[r] = Serial2.read();
Serial.print("respuestaaaa: ");Serial.println(urlRespuesta);
r++;
}
delay(5000);
// enviar_de_Serial1_a_Serial2();
//Para llamar HTTP
// delay(2000);
delay(2500);
Serial2.println("AT+HTTPACTION=0\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGET3() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
delay(1000);
while (enviarAT("AT+CIPSHUT\r\n","OK",1000) == 0)
; //cerrar conexion del SIM
delay(1000);
while (enviarAT("AT+CGATT=0\r\n","OK",1000) == 0)
; //cerrar conexion del SIM
Serial.println("Ejecutando comandos para enviar datos a la API...");
while (enviarAT("AT+CPIN?\r\n","OK",1000) == 0)
;//verificar si necesita algun PIN
delay(1000);
while (enviarAT("AT+CFUN?\r\n","OK",1000) == 0)
;//verifica que toda la funcionalidad este disponible
delay(1000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
enviarAT("AT+CSTT=\"internet.itelcel.com\",\"""\",\"""\"\r\n","OK",1000)
;//nos conectamos a nuestra APN
delay(1000);
while (enviarAT("AT+CIICR\r\n","OK",1000) == 0)
;//Habilitar conexiones Wireless
enviarAT("AT+CIFSR\r\n","OK",1000)
;//Obtener IP local
delay(1000);
/*envio de peticion GET*/
// enviarAT("AT+CIPSTART=\"TCP\",\"mi.api.net\",8025\r\n","CONNECT OK",1000)
enviarAT("AT+CIPSTART=\"TCP\",\"dev.teubi.co\",80\r\n","CONNECT OK",1000)
;//creando una conexion tipo TCP al servidro X con puerto X
delay(1000);
enviarAT("AT+CIPSEND",">",1000); // Habilitamos la opcion de enviar
// String peticion = "GET /controlador/ard?" + datosEnGET + " HTTP/1.1\r\n"+
String peticion = "GET /hola.php\r\nHost: dev.teubi.co\r\nConnection: Keep-Alive\r\n\r\n\x1A";
// "Host: mi.api.net\r\n"+
// Serial.println(peticion);
// enviarPeticion(peticion,"OK",7000,peticion.length())
enviarAT(peticion,"OK",7000)
; // Enviando peticion
delay(5000);
while (enviarAT("AT+CIPCLOSE\r\n","OK",20000) == 0)
;
delay(1000);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGETsimple() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
delay(1000);
while (enviarAT("AT+CIPSHUT\r\n","OK",1000) == 0)
; //cerrar conexion del SIM
delay(1000);
while (enviarAT("AT+CGATT=0\r\n","OK",1000) == 0)
; //cerrar conexion del SIM
Serial.println("Ejecutando comandos para enviar datos a la API...");
while (enviarAT("AT+CPIN?\r\n","OK",1000) == 0)
;//verificar si necesita algun PIN
delay(1000);
while (enviarAT("AT+CFUN?\r\n","OK",1000) == 0)
;//verifica que toda la funcionalidad este disponible
delay(1000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
enviarAT("AT+CSTT=\"internet.itelcel.com\",\"""\",\"""\"\r\n","OK",1000)
;//nos conectamos a nuestra APN
delay(1000);
while (enviarAT("AT+CIICR\r\n","OK",1000) == 0)
;//Habilitar conexiones Wireless
enviarAT("AT+CIFSR\r\n","OK",1000)
;//Obtener IP local
delay(1000);
/*envio de peticion GET*/
// enviarAT("AT+CIPSTART=\"TCP\",\"mi.api.net\",8025\r\n","CONNECT OK",1000)
enviarAT("AT+CIPSTART=\"TCP\",\"dev.teubi.co\",80\r\n","CONNECT OK",1000)
;//creando una conexion tipo TCP al servidro X con puerto X
delay(1000);
enviarAT("AT+CIPSEND",">",1000); // Habilitamos la opcion de enviar
// String peticion = "GET /controlador/ard?" + datosEnGET + " HTTP/1.1\r\n"+
String peticion = "GET /hola.php\r\nHost: dev.teubi.co\r\nConnection: Keep-Alive\r\n\r\n\x1A";
// "Host: mi.api.net\r\n"+
// Serial.println(peticion);
// enviarPeticion(peticion,"OK",7000,peticion.length())
enviarAT(peticion,"OK",7000)
; // Enviando peticion
delay(5000);
while (enviarAT("AT+CIPCLOSE\r\n","OK",20000) == 0)
;
delay(1000);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGETxTCP() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
if (Serial2.available())
Serial.write(Serial2.read());
delay(1000);
Serial2.println("AT");
delay(1000);
Serial2.println("AT+CPIN?");
delay(1000);
Serial2.println("AT+CREG?");
delay(1000);
Serial2.println("AT+CGATT?");
delay(1000);
Serial2.println("AT+CIPSHUT"); //cerrar conexion del SIM
delay(1000);
Serial2.println("AT+CIPSTATUS");
delay(2000);
Serial2.println("AT+CIPMUX=0");
delay(2000);
mostrarDatosSeriales();
Serial2.println("AT+CSTT=\"internet.itelcel.com\"");
delay(1000);
mostrarDatosSeriales();
Serial2.println("AT+CIICR");
delay(3000);
mostrarDatosSeriales();
Serial2.println("AT+CIFSR"); //optener IP local
delay(2000);
mostrarDatosSeriales();
Serial2.println("AT+CIPSPRT=0");
delay(3000);
mostrarDatosSeriales();
// http://mi.api.net:8025/controlador/ard
// GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE&field1=0
Serial2.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\""); // Iniciamos la conexion a la api
delay(6000);
Serial2.println("AT+CIPSEND");
delay(4000);
mostrarDatosSeriales();
String peticion = "GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE"+datosThingSpeakGET;
Serial.println(peticion);
Serial2.println(peticion);
delay(400);
mostrarDatosSeriales();
Serial2.println((char)26); //[Enter] | enviando peticion
delay(500);
Serial2.println();
mostrarDatosSeriales();
Serial2.println("AT+CIPSHUT"); //Cerrar conexión
delay(100);
mostrarDatosSeriales();
Serial.println("DATOS ENVIADOS.");
}
void obtenerLocalizacion() {
// datosAenviar = "?lat="+latitudString + "&lon="+longitudString;
// datosAenviar = "{\"latitud\":"+(String)latitudGuardada + ",\"longitud\":"+(String)longitudGuardada + "}";
Serial.println(datosAenviar);
}
el metodo enviarAT es completamente igual a enviarPeticion solo que quise experimentar con Serial.print()
para poder ver que estaba pasando exclusivamente con esa parte.
void enviarPOST() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
;//Se inicia el servicio HTTP
while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
;//Para llamar HTTP
String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
// Serial.println(peticion);
while (enviarPeticion(peticion,"OK",3000, peticion.length()) == 0)
; //**Aqui es donde se detiene el proceso**
enviarAT("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n","OK",1000);
String httpData = "AT+HTTPDATA="+(String)json.length()+",5000";
Serial2.println(httpData);
delay(100);
Serial2.println(json);
Serial2.println((char)26);
delay(2500);
Serial2.println("AT+HTTPACTION=1\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void enviarGET() {
while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
;// Cerrar los datos que envia el GPS
Serial.println("Ejecutando comandos para enviar datos a la API...");
Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
delay(1000);
Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
delay(2000);
while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
;//Revisar conexión del SIM
while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
;//
while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
;//Se inicia el servicio HTTP
while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
;//Para llamar HTTP
String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"\r\n";
Serial.println(peticion);
while (enviarPeticion(peticion,"OK",10000, peticion.length()) == 0)
;
delay(2500);
Serial2.println("AT+HTTPACTION=0\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPREAD\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+HTTPTERM\r\n");
mostrarDatosSeriales();
delay(2500);
Serial2.println("AT+CGPSOUT=32\r\n");
mostrarDatosSeriales();
delay(2500);
Serial.println("DATOS ENVIADOS.");
}
void mostrarDatosSeriales() { //Muestra los datos que va entregando el sim
while(Serial2.available()!=0)
Serial.write(Serial2.read());
Serial.println();
}
si ven ambos metodos POST y GET son iguales, solo cambia la parte de la URL y pues en el PST se le agregan los parametros de CONTENT y DATA.
Adjunto imagen de como es que se pierde la url en metodo GET