#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include "esp_wifi.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#define LOG_LOCAL_LEVEL ESP_LOG_INFO
#include "esp_log.h"
#include "mqtt_client.h"
#include "driver/gpio.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
esp_mqtt_client_handle_t client;
void wifi_connection(void);
static void wifi_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data);
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data);
static void mqtt_app_start(void);
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
esp_mqtt_event_handle_t event = event_data;
esp_mqtt_client_handle_t client = event->client;
int msg_id;
switch ((esp_mqtt_event_id_t)event_id) {
case MQTT_EVENT_CONNECTED:
printf("Conectado. ");
//msg_id = esp_mqtt_client_publish(client, "1273699/cliente1/ReqEstimate", 0);
break;
case MQTT_EVENT_DISCONNECTED:
break;
case MQTT_EVENT_SUBSCRIBED:
printf("Suscrito exitosamente.\n");
//esp_mqtt_client_subscribe(client, "1273699/cliente1/Estimate", 0);
break;
case MQTT_EVENT_UNSUBSCRIBED:
break;
case MQTT_EVENT_PUBLISHED:
printf("Publicado exitosamente.\n");
break;
case MQTT_EVENT_DATA:
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
printf("DATA=%.*s\r\n", event->data_len, event->data);
break;
case MQTT_EVENT_ERROR:
break;
default:
break;
}
}
static void mqtt_app_start(void)
{
esp_mqtt_client_config_t mqtt_cfg = {
/* Configure el broker aquí */
.broker.address.uri = "mqtt://mqtt.eclipseprojects.io",
};
client = esp_mqtt_client_init(&mqtt_cfg);
/* El último argumento se puede utilizar para pasar datos al controlador de eventos, en este ejemplo mqtt_event_handler */
esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
printf("Iniciando MQTT... \n");
esp_mqtt_client_start(client);
}
void wifi_connection(void)
{
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t wifi_initiation = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&wifi_initiation);
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, wifi_event_handler, NULL);
esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_event_handler, NULL);
wifi_config_t wifi_configuration = {
/* Configure la conexión WiFi aquí */
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_configuration);
esp_wifi_start();
esp_wifi_connect();
}
static void wifi_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
switch (event_id)
{
case WIFI_EVENT_STA_START:
printf("WiFi conectándose...\n");
break;
case WIFI_EVENT_STA_CONNECTED:
printf("WiFi conectado.\n");
break;
case WIFI_EVENT_STA_DISCONNECTED:
printf("WiFi desconectado.\n");
break;
case IP_EVENT_STA_GOT_IP:
printf("WiFi obtuvo IP.\n\n");
break;
default:
printf("ID del evento: %ld\n", event_id);
break;
}
}
//funcion para poder eliminar las , de la cadena
//esta funcion falla, la intente poner por fuera para solo llamarla por el main
void eliminar(char* input){
int c = 0;
int Longitud = strlen(input);
char aux[Longitud];
for(int i = 0; i < Longitud; i++){
if(input[c] != ','){
aux[c] = input[i];
c++;
}
}
aux[c] = '\0';
printf("%s",aux);
}
void app_main(void)
{
nvs_flash_init();
wifi_connection();
vTaskDelay(3000 / portTICK_PERIOD_MS);
mqtt_app_start();
vTaskDelay(3000 / portTICK_PERIOD_MS);
printf("MQTT Iniciado.\n");
int cober = 1;
int casa = 5;
char cadena[20] = "1,5,1,2,3,5,9";
char cadena2[20] = "1,2,3,5,9";
int cantidad = 3;
int cober2 = 2;
int casa2 = 8;
char cadenaa[20] = "2,8,2,4,5,6,7,9,11,12";
char cadenaa2[20] = "2,4,5,6,7,9,11,12";
//debe imprimir despues del numero de la casa 1,2,3,5,9
printf("Cobertura: %d \n", cober);
printf("Cantidad de casas: %d \n", casa);
printf("Ubicacion de las casas: %s \n", cadena);
esp_mqtt_client_subscribe(client, "1273699/cliente1/ReqEstimate", 0);
esp_mqtt_client_publish(client, "1273699/cliente1/ReqEstimate", cadena2, 0, 1, 0);
//esp_mqtt_client_publish(client, "1273699/cliente1/Estimate", cadena2, 0, 1, 0);
/*
La ciudad ABC envía la solicitud “2,8,2,4,5,6,7,9,11,12” por MQTT al proveedor.
Cobertura = 2
Cantidad de casas: 8
dependiendo la cantidad de casas es lo que se imprimira
Ubicación de las casas: 2,4,5,6,7,9,11,12
*/
printf("\n");
eliminar(cadenaa);
printf("\n");
printf("Cobertura: %d \n", cober2);
printf("Cantidad de casas: %d \n", casa2);
printf("Ubicacion de las casas: %s \n", cadenaa);
}
/*
Publique en el tema “<matricula>/cliente1/ReqEstimate” las solicitudes de la ciudad ABC
al proveedor. Las solicitudes tienen el mapa de la ciudad y la cobertura de los
transmisores en el formato que se describe en los Ejemplos 1 y 2. Y matricula es
su matrícula. [15 puntos]
En base al mapa y la cobertura de los transmisores,
determine la cantidad mínima de transmisores que se requieren y dónde se deben
instalar. [35 puntos]
Envíe la cantidad de transmisores y la ubicación por medio de
publicarlos en el tema “<matricula>/cliente1/Estimate”. Donde matricula es su
matrícula. Use el formato de la respuesta de los Ejemplos 1 y 2. [35 puntos]
Para verificar que se hayan enviado correctamente los mensajes,
suscríbase al tema “<matricula>/cliente1/Estimate” e imprima los mensajes
recibidos. [15 puntos]
*/