Saludos a todo el foro, estoy trabajando en un pequeño proyecto; un Dataloger basado en ESP32 que en su momento subira datos a una "nube" de internet.
Tengo dudas sobre como obtener de mejor manera o "elegante", pero con seguridad, datos que vienen en una cadena obtenida via http.
Para ejemplificar, dejo el codigo, quiero obtener la Hora en formato Unix desde la siguiente Api:
http://worldtimeapi.org/api/ip
Como podran comprobar, si logro mi cometido, de echo ya en dos sentencias:
String respuesta = http.getString();
long unixtime ((respuesta.substring(respuesta.indexOf("\"unixtime\":")+11,respuesta.indexOf("\"utc_datetime\":")-1).toInt()));
Lo que no estoy seguro si este metodo de usar las funciones indexOF y subtring son la mejor manera.
¿Ustedes que opinan? quizas me puedan ayudar a mejorar mi codigo.
Como siempre, mucho apreciare sus comentarios.
Tengo dudas sobre como obtener de mejor manera o "elegante", pero con seguridad, datos que vienen en una cadena obtenida via http.
Para ejemplificar, dejo el codigo, quiero obtener la Hora en formato Unix desde la siguiente Api:
http://worldtimeapi.org/api/ip
C++:
/*Obtener la hora en formato UNIX Time
* desde un servidor ntp y la API correspondiente
* */
#include <WiFi.h>
#include <HTTPClient.h>
// Datos de la red WiFi que sera utilizada
const char* ssid = "Mi antena"; //Nombre de la antena del router
const char* password = "6U3GCU84T11X";//Contraseña del router
void setup(){
//iniciamos comunicacion serial para monitorear el programa
Serial.begin(115200);
// Comenzamos por conectarnos al servicio Wifi que da servicio de Internet
Serial.println();
Serial.print("Conectandose a ");
Serial.println(ssid);
//Solicitamos servicio al Enrutador Wifi
WiFi.begin(ssid, password);
// El ciclo continuara hasta se obtenga el servicio
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//Una vez conectado (obtenemos la direccion IP Local obtenida via DCHP)
Serial.println("");
Serial.println("Direccion IP Local: ");
Serial.println(WiFi.localIP());
}
void loop() {
datos();//llamamos a la subrutina datos
delay(5000);// este delay es meramente por depuracion.
}
void datos(){
//Verificamos el estatus de la conexion WiFi
if(WiFi.status()== WL_CONNECTED){
//Iniciamos el cliente Wifi
WiFiClient client;
HTTPClient http;
//Declaramos las constantes tanto para el servidor NTP y La API
const char *ntpServer = "pool.ntp.org";
const char *timeApiUrl = "http://worldtimeapi.org/api/ip";
//iniciamos la peticion de la API
http.begin(timeApiUrl);
//Obtenemos el codigo http de respuesta (si es 200 entonces tendremos una conexion valida)
int httpCode = http.GET();
if (httpCode != 200){
Serial.println("No se logro obtener datos\r\n");
configTime(0, 0, ntpServer);
return;
}
//obtenemos la cadena de respuesta de la API y la asignamos nuestra variable respuesta
String respuesta = http.getString();
//terminamos la sesion http
http.end();
/* monitoreamos el string y rastremos tanto el inicio y final de la informacion que requerimos,
en este caso buscamos el dato que viene despues de "unixtime", como podemos ver la cadena es similar a esto:
{"abbreviation":"CDT","client_ip":"189.216.207.201","datetime":"2022-06-19T23:34:24.927078-05:00","day_of_week":0,"day_of_year":170,"dst":true,"dst_from":"2022-04-03T08:00:00+00:00","dst_offset":3600,"dst_until":"2022-10-30T07:00:00+00:00","raw_offset":-21600,"timezone":"America/Mexico_City","unixtime":1655699664,"utc_datetime":"2022-06-20T04:34:24.927078+00:00","utc_offset":"-05:00","week_number":24}
Nota.- Es una cadena json, sin embargo no interesa procesar todas las variables o datos, solo lo que interesa.
Nos valemos de la funcion indexOF y subtring para "enfocarnos" con precision
*/
Serial.println("Cadena Obtenida de la API:");
Serial.println(respuesta);
Serial.println("Posicion inicial de la cadena buscada");
Serial.println(respuesta.indexOf("\"unixtime\":")+11);
Serial.println("Posicion Final de la cadena buscada");
Serial.println (respuesta.indexOf("\"utc_datetime\":")-1);
Serial.println("Imprimimos la extraccion de la cadena;");
Serial.println (respuesta.substring(respuesta.indexOf("\"unixtime\":")+11,respuesta.indexOf("\"utc_datetime\":")-1));
//una vez que conocemos el principio y fin de la informacion que requerimos la declaramos y convertimos desde la cadena obtenida
long unixtime ((respuesta.substring(respuesta.indexOf("\"unixtime\":")+11,respuesta.indexOf("\"utc_datetime\":")-1).toInt()));
//Monitoreamos la variable ya convertida a long
Serial.println(unixtime);
}
}
Como podran comprobar, si logro mi cometido, de echo ya en dos sentencias:
String respuesta = http.getString();
long unixtime ((respuesta.substring(respuesta.indexOf("\"unixtime\":")+11,respuesta.indexOf("\"utc_datetime\":")-1).toInt()));
Lo que no estoy seguro si este metodo de usar las funciones indexOF y subtring son la mejor manera.
¿Ustedes que opinan? quizas me puedan ayudar a mejorar mi codigo.
Como siempre, mucho apreciare sus comentarios.