#include <stdio.
h>
#include <stdint.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 "esp_log.h"
#include "mqtt_client.h"
#define WIFI_SSID "Dai hoc Thuy Loi"
#define WIFI_PASS "Phanhieu@2022"
#define MQTT_BROKER_URI "mqtt://[Link]:1883"
static const char *TAG = "MQTT_EXAMPLE";
static esp_mqtt_client_handle_t client = NULL;
static volatile uint8_t MQTT_CONNECTED = 0;
/* -------------------- WIFI EVENT HANDLER -------------------- */
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) {
switch (event_id) {
case WIFI_EVENT_STA_START:
esp_wifi_connect();
ESP_LOGI(TAG, "Connecting to Wi-Fi...");
break;
case WIFI_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "Wi-Fi disconnected! Reconnecting...");
MQTT_CONNECTED = 0;
esp_wifi_connect();
break;
}
}
else if (event_base == IP_EVENT &&
event_id == IP_EVENT_STA_GOT_IP) {
ESP_LOGI(TAG, "Got IP! Starting MQTT...");
esp_mqtt_client_start(client);
}
}
/* -------------------- MQTT EVENT HANDLER -------------------- */
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;
switch ((esp_mqtt_event_id_t)event_id) {
case MQTT_EVENT_CONNECTED:
ESP_LOGI(TAG, "MQTT CONNECTED");
MQTT_CONNECTED = 1;
// Subscribe để nhận message từ MQTTX
esp_mqtt_client_subscribe(client, "/test/topic1", 0);
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT DISCONNECTED");
MQTT_CONNECTED = 0;
break;
case MQTT_EVENT_DATA: {
ESP_LOGI(TAG, "MQTT DATA RECEIVED");
char incoming_data[256] = {0};
memcpy(incoming_data, event->data, event->data_len);
printf(" %s\n", incoming_data);
break;
}
default:
ESP_LOGI(TAG, "OTHER MQTT EVENT: %d", event->event_id);
break;
}
}
/* -------------------- INIT MQTT CLIENT -------------------- */
static void mqtt_app_start(void)
{
esp_mqtt_client_config_t mqtt_cfg = {
.[Link] = MQTT_BROKER_URI,
};
client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_register_event(client,
ESP_EVENT_ANY_ID,
mqtt_event_handler,
NULL);
}
/* -------------------- WIFI INIT -------------------- */
static void wifi_init(void)
{
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&wifi_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_conf = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
.[Link] = WIFI_AUTH_WPA2_PSK,
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_conf);
esp_wifi_start();
}
/* -------------------- APP MAIN -------------------- */
void app_main(void)
{
// Init 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());
ESP_ERROR_CHECK(nvs_flash_init());
}
wifi_init();
mqtt_app_start();
}