Gateway con agregar controles mediante firebase migracion a OS5
Dependencies: mbed-http ESP01 Pulse RFDecoder
main.cpp
- Committer:
- Thrillex13
- Date:
- 2019-06-11
- Revision:
- 3:5dceee1c49fc
- Parent:
- 2:bc3973471585
- Child:
- 4:8fed3705384e
File content as of revision 3:5dceee1c49fc:
#include "main.h" // 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 // Global variables char send[250]; // Strings for sending and receiving commands / data send / data receive / command received / status received char recv[250]; char command[TCPCOMMSBYTESMAX]; char status[TCPSTATSBYTESMAX]; char controlcode[8]; int main() { //Inicializacion de los Perifericos led_azul = OFF; led_rojo = OFF; led_verde = OFF; pc.baud(115200); //Inicializacion y Conexion al WiFi wifiInit(); //wifi.Quit(); 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. //Iniciamos el servidor startServer(SERVER_PORT); while(1) { //Revisamos si hay un dato por TCP disponible if(wifi.TCPDataAvailable(recv)) { pc.printf("%s", recv); int socket = getTCPContent(recv,command,status); //Comando para registrar control if(command[0] == NEW_CONTROL_REGISTER) { Timer t; t.start(); LEDAMARILLO_ON; while(t.read_ms() < 30000) { if(decoder.available()) { unsigned long numcode = decoder.getCode(); pc.printf("Codigo Recibido %x \n\r", numcode); convertToCharArray(&controlcode[0],numcode); send[0] = CONTROL_REGISTER_INFO; send[1] = controlcode[4]; send[2] = controlcode[5]; send[3] = controlcode[6]; wifi.SendTCPData(socket,TCPCOMMSBYTESMAX,send); wifi.SendTCPData(socket,TCPCOMMSBYTESMAX,send); break; } } LEDVERDE_ON; command[0] = 0x00; } //Evaluar otros comandos if(command[0] == HEARBEAT_REQUEST) { send[0] = HEARBEAT_RESPONSE; wifi.SendTCPData(socket,TCPCOMMSBYTESMAX,send); wifi.SendTCPData(socket,TCPCOMMSBYTESMAX,send); command[0] = 0x00; } } } } 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, 1000); pc.printf("%s", recv); wait(2); pc.printf("Configure for multiple sockets\r\n"); wifi.SetMultiple(); wifi.RcvReply(recv, 1000); pc.printf("%s", recv); wait(2); pc.printf("Enable DHCP\r\n"); wifi.EnableDHCP(); wifi.RcvReply(recv, 1000); pc.printf("%s", recv); wait(2); } void wifiConnect(void) { Timer t; if(isConnectedToWifi()) { 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); } else { pc.printf("Starting Smart Config\r\n"); led_azul = ON; wifi.StartSmartConfig(); wifi.RcvReply(recv, 15000); pc.printf("%s", recv); wait(5); t.start(); while(!isConnectedToWifi()) { //Timeout para hacer la conexion /* if(t.read_ms() > 30000) { led_azul = OFF; led_rojo = ON; pc.printf("No se pudo conectar al Wifi\r\n"); while(1); break; } */ } } } bool isConnectedToWifi(void) { bool status; wifi.GetConnStatusCode(recv); //pc.printf("%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); } } 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()); }