Gateway con agregar controles mediante firebase migracion a OS5
Dependencies: mbed-http ESP01 Pulse RFDecoder
main.cpp
- Committer:
- Thrillex13
- Date:
- 2019-09-15
- Revision:
- 4:8fed3705384e
- Parent:
- 3:5dceee1c49fc
File content as of revision 4:8fed3705384e:
#include "main.h"
#include <string>
// Objects
Serial pc(USBTX, USBRX);
ESP01 wifi(PTC17, PTC16, 115200); //Con este objeto implementamos los metodos que requieren comandos AT del modulo de WIFI
//ESP8266Interface net(PTC17, PTC16); //Con este objeto implementamos todas las funciones de red para la creacion de Sockets
RFDecoder decoder = RFDecoder(D2,D3); //tx rx
Ticker firebasecheck;
// Global variables
char send[128]; // Strings for sending and receiving commands / data send / data receive / command received / status received
char recv[128];
char command[TCPCOMMSBYTESMAX];
char status[TCPSTATSBYTESMAX];
char controlcode[8];
string comandofirebase;
bool firebaseTimeoutExpired = false;
int main()
{
//Inicializacion de los Perifericos
led_azul = OFF;
led_rojo = OFF;
led_verde = OFF;
pc.baud(115200);
esp01_en.mode(PullUp);
esp01_rst.mode(PullUp);
//Inicializacion y Conexion al WiFi
//wifiInit();
//wifi.Quit();
wifiInit();
wifiConnect();
//ESP8266Interface *net = new ESP8266Interface(); //Con este objeto implementamos todas las funciones de red para la creacion de Sockets para HTTPS
//http_demo(net);
//delete net; //Necesario destruir el objeto cuando ya no se use para desocupar la interface de wifi.
ESP8266Interface *net = new ESP8266Interface(); //Con este objeto implementamos todas las funciones de red para la creacion de Sockets para HTTPS
//delete net; //Necesario destruir el objeto cuando ya no se use para desocupar la interface de wifi.
//Tarea para revisar si hay algun comando en firebase, esta tarea se ejecuta cada x segundos.
firebasecheck.attach(&firebaseCheckTimeout, INTERVALFIREBASECHECK);
while(1) {
if(firebaseTimeoutExpired) {
//Leemos la bsae de datos de firebase para revisar si hay algun comando disponible.
comandofirebase = getFirebaseCommand(net);
//Habilitamos el debugeo de la memoria
//print_all_thread_info();
//print_heap_and_isr_stack_info();
if(comandofirebase.compare(AGREGARCONTROL) == 0) {
Timer t;
int tini;
t.start();
tini = t.read_ms();
pc.printf("Comando Agregar Control Recibido\r\n");
putFirebaseCommand(net, WAITING_RF_CODE, 0);
LEDAMARILLO_ON;
while((t.read_ms()- tini) < MAXTIMERXCONTROL) {
if(decoder.available()) {
unsigned long numcode = decoder.getCode();
pc.printf("Codigo Recibido %x \n\r", numcode);
putFirebaseCommand(net, NEW_CONTROL_RESPONSE, numcode);
break;
}
}
LEDVERDE_ON;
firebaseTimeoutExpired = false;
comandofirebase = NINGUNCOMANDO;
} else {
pc.printf("Ningun comando recibido\r\n");
firebaseTimeoutExpired = false;
}
}
}
}
void wifiInit(void)
{
pc.printf("Gateway Sistema de Control de Cotos\r\n");
pc.printf("Resetting WiFi\r\n");
wifi.Reset();
wait(2);
wifi.DisableEcho();
pc.printf("Set mode to Station\r\n");
wifi.SetMode(STATION);
wifi.RcvReply(recv, 3000);
pc.printf("%s", recv);
wait(2);
pc.printf("Configure for multiple sockets\r\n");
wifi.SetMultiple();
wifi.RcvReply(recv, 3000);
pc.printf("%s", recv);
wait(2);
/*
pc.printf("Enable DHCP\r\n");
wifi.EnableDHCP();
wifi.RcvReply(recv, 1500);
pc.printf("%s", recv);
wait(2);
*/
}
void wifiConnect(void)
{
char connCheckCounter = 0;
while(!isConnectedToWifi()) {
if(connCheckCounter > MAXWIFICONNCHECKS) {
//pc.printf("Starting Smart Config\r\n");
led_azul = ON;
wifi.StartSmartConfig();
wifi.RcvReply(recv, 15000);
//pc.printf("%s", recv);
wait(5);
connCheckCounter=0;
}
connCheckCounter++;
pc.printf("Gateway no conectado, intento de reconexion %d\r\n",connCheckCounter);
wait(1);
}
pc.printf("Gateway is already connected to wifi with the following IP address\r\n");
wifi.GetIP(recv);
pc.printf("%s", recv);
led_azul = OFF;
led_verde = ON;
wait(2);
}
bool isConnectedToWifi(void)
{
bool status;
wifi.GetConnStatusCode(recv);
//pc.printf("El estado de la conexion es %s", recv);
if(strcmp(recv,"STATUS:2\r")==0) {
led_azul = OFF;
led_rojo = OFF;
led_verde = ON;
status=true;
} else {
status=false;
}
return status;
}
void startServer(int port)
{
//pc.printf("Iniciando servidor en el puerto %d\r\n",port);
wifi.StartServerMode(port);
wifi.RcvReply(recv, 1000);
//pc.printf("%s", recv);
//wait(2);
}
int getTCPContent(char* espdata, char* command, char* status)
{
char i=0;
char offset=0;
char socket=0;
if((espdata[2]=='+') && (espdata[3]=='I') && (espdata[4]=='P') && (espdata[5]=='D')) {
//Obtenemos en socket de conexion
socket = espdata[7]-'0';
//Buscamos el caracter : para de ahi iniciar el mensaje
for(i=0; i<250; i++) {
if(espdata[i]==':') {
offset = i+1;
break;
}
}
for(i=0; (i<TCPCOMMSBYTESMAX); i++) {
command[i] = espdata[i+offset];
}
command[TCPCOMMSBYTESMAX] = '\0';
status[0] = COMMANDREC;
}
return socket;
}
void convertToCharArray(char *arr, unsigned long number)
{
int i = 0;
for (i = 0; i < 8; ++i) {
arr[i] = (char)((((unsigned long) number) >> (56 - (8*i))) & 0xFFu);
}
}
string getFirebaseCommand(NetworkInterface *network)
{
TLSSocket* socket = new TLSSocket();
string comando = NINGUNCOMANDO;
nsapi_error_t r;
// make sure to check the return values for the calls below (should return NSAPI_ERROR_OK)
r = socket->open(network);
r = socket->set_root_ca_cert(SSL_CA_PEM);
r = socket->connect("https://cotoceiba.firebaseio.com", 443);
//printf("\n----- Conectando con la base de datos de Firebase -----\n");
//HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, "https://cotoceiba.firebaseio.com/Comandos/AppToGateway/Request/Comando.json?auth=ZpXLLURU9KWmW5t1kzBYD2IuBE0V7wdv5vXwDgsH");
HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, "https://cotoceiba.firebaseio.com/Comandos/AppToGateway/Request/Comando.json?");
HttpResponse* get_res = get_req->send();
if (!get_res) {
printf("HttpGetRequest failed (error code %d)\n", get_req->get_error());
comando = NINGUNCOMANDO;
//return 1;
} else {
//printf("\n----- Respuesta de Firebase -----\n");
//printf("Status: %d - %s\n", get_res->get_status_code(), get_res->get_status_message().c_str());
comando = get_res->get_body_as_string();
//pc.printf("%s\r\n",comando.c_str());
//printf("\nBody (%lu bytes):\n\n%s\n", get_res->get_body_length(), get_res->get_body_as_string().c_str());
}
delete get_req;
socket->close();
delete socket;
return comando;
}
void putFirebaseCommand(NetworkInterface *network, char comando, unsigned long numcode)
{
TLSSocket* socket = new TLSSocket();
char body[100];
nsapi_error_t r;
// make sure to check the return values for the calls below (should return NSAPI_ERROR_OK)
r = socket->open(network);
r = socket->set_root_ca_cert(SSL_CA_PEM);
r = socket->connect("https://cotoceiba.firebaseio.com", 443);
//printf("\n----- Enviando datos a la base de datos de Firebase -----\n");
HttpsRequest* post_req = new HttpsRequest(socket, HTTP_PATCH, "https://cotoceiba.firebaseio.com/Comandos/GatewayToApp/Response.json?auth=ZpXLLURU9KWmW5t1kzBYD2IuBE0V7wdv5vXwDgsH");
post_req->set_header("Content-Type", "application/json");
sprintf(body, "{\"Comando\":\"%d\",\"Valor1\":\"%X\"}",comando,numcode);
HttpResponse* post_res = post_req->send(body, strlen(body));
if (!post_res) {
printf("HttpPatchRequest failed (error code %d)\n", post_req->get_error());
}
// printf("\n----- HTTPS PATCH response -----\n");
// dump_response(post_res);
socket->close();
delete socket;
delete post_req;
}
void firebaseCheckTimeout()
{
firebaseTimeoutExpired = true;
}
void http_demo(NetworkInterface *network)
{
TLSSocket* socket = new TLSSocket();
nsapi_error_t r;
// make sure to check the return values for the calls below (should return NSAPI_ERROR_OK)
r = socket->open(network);
r = socket->set_root_ca_cert(SSL_CA_PEM);
r = socket->connect("https://cotoceiba.firebaseio.com", 443);
printf("\n----- HTTPS GET request -----\n");
HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, "https://cotoceiba.firebaseio.com/Condominos/94.json?auth=ZpXLLURU9KWmW5t1kzBYD2IuBE0V7wdv5vXwDgsH");
HttpResponse* get_res = get_req->send();
if (!get_res) {
printf("HttpRequest failed (error code %d)\n", get_req->get_error());
//return 1;
}
printf("\n----- HTTPS GET response -----\n");
dump_response(get_res);
delete get_req;
printf("\n----- HTTPS POST request -----\n");
HttpsRequest* post_req = new HttpsRequest(socket, HTTP_POST, "https://cotoceiba.firebaseio.com/Condominos/52.json?auth=ZpXLLURU9KWmW5t1kzBYD2IuBE0V7wdv5vXwDgsH");
post_req->set_header("Content-Type", "application/json");
const char body[] = "{\"nombre\":\"Posteado por Wifi Perros\",\"numcasa\":\"64\"}";
HttpResponse* post_res = post_req->send(body, strlen(body));
if (!post_res) {
printf("HttpRequest failed (error code %d)\n", post_req->get_error());
//return 1;
}
printf("\n----- HTTPS POST response -----\n");
dump_response(post_res);
delete post_req;
}
void dump_response(HttpResponse* res)
{
printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
printf("Headers:\n");
for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
}
printf("\nBody (%lu bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
}