#include <stdio.h>
#include "driver/gpio.h"
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "mqtt_client.h"
#include <stdlib.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define led GPIO_NUM_13
bool on= false;
static EventGroupHandle_t wifi_event_group;
const int WIFI_CONNECTED_BIT = BIT0;
static const char *TOPIC = "srkv99/LED STATUS/feeds/ledone";
static const char *TOPIC2 ="srkv99/feeds/time-day";
static const char *message ="Hello1";
char *str;
int num;
static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
{
esp_mqtt_client_handle_t client = event->client;
int msg_id;
switch(event->event_id){
case MQTT_EVENT_CONNECTED:
ets_printf("MQTT_EVENT_CONNECTED");
msg_id = esp_mqtt_client_subscribe(client,TOPIC,0);
ets_printf("Sent Subscribe Successful, msg_id = %d",msg_id);
esp_mqtt_client_publish(client,TOPIC2,message,strlen(message),0,false);
esp_mqtt_client_publish(client,TOPIC,message,strlen(message),0,false);
break;
case MQTT_EVENT_DISCONNECTED:
ets_printf("MQTT EVENT DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
ets_printf("MQTT EVENT SUBSCRIBED msg_id= %d",event->msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
ets_printf("MQTT EVENT UNSUBSCRIBED msg_id = %d",event->msg_id);
break;
case MQTT_EVENT_DATA:
ets_printf("MQTT_EVENT_DATA");
ets_printf("Topic: %d %s\n", event->topic_len, event->topic);
//ets_printf("Data: %d %s\n", event->data_len, event->data);
ets_printf("DATA\t %s",event->data);
str=event->data;
if(*str=='1' || *str=='0')
{
if(*str=='1')
{
on=true;
led_on_off(on);
}
else{
on=false;
led_on_off(on);
}
}
break;
case MQTT_EVENT_ERROR:
ets_printf("MQTT_EVENT_ERROR");
break;
default:
ets_printf("Other event id:%d", event->event_id);
break;
}
return ESP_OK;
}
void led_on_off(bool b1)
{
ets_printf("inside led\n");
if(b1==true)
{
on=1;
gpio_set_level(led,1);
ets_printf("inside led ON \n");
}
else if(b1==false){
on=0;
gpio_set_level(led,0);
ets_printf("inside led OFF \n");
}
}
static void mqtt_app_start(void)
{
const esp_mqtt_client_config_t mqtt_cfg={
.uri="mqtt://io.adafruit.com",
.event_handle=mqtt_event_handler_cb,
.username="srkv99",
.password="aio_PgaK15CdWbOGNbg5URFSuJgwtpkz",
};
esp_mqtt_client_handle_t client=esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(client);
}
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect();
xEventGroupClearBits(wifi_event_group, WIFI_CONNECTED_BIT);
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT);
}
}
void wifi_init_sta(void)
{
wifi_event_group = xEventGroupCreate();
tcpip_adapter_init();
esp_event_loop_create_default();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
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_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
esp_wifi_start();
ets_printf( "wifi_init_sta finished.\n");
wifi_config_t current_config;
EventBits_t bits = xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT) {
esp_wifi_get_config(ESP_IF_WIFI_STA, ¤t_config);
ets_printf( "Wi-Fi connected\n");
ets_printf("Connected to SSID: %s, Password: %s", current_config.sta.ssid, current_config.sta.password);
} else {
ets_printf("Failed to connect to Wi-Fi");
}
}
void app_main()
{
gpio_pad_select_gpio(led);
gpio_set_direction(led, GPIO_MODE_OUTPUT);
int on=0;
// Initialize NVS.
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ret;
ets_printf("ESP_WIFI_MODE_STA\n");
wifi_init_sta();
esp_event_loop_create_default();
mqtt_app_start();
}