#include <stdio.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 "driver/uart.h"
#define URL "mqtt://mqtt.eclipseprojects.io"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
esp_mqtt_client_handle_t client;
#define UART_PORT UART_NUM_0
#define BUF_SIZE 128
void uart_init() {
uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};
uart_param_config(UART_PORT, &uart_config);
uart_set_pin(UART_PORT, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(UART_PORT, BUF_SIZE * 2, 0, 0, NULL, 0);
}
static EventGroupHandle_t wifi_event_group;
const int WIFI_CONNECTED_BIT = BIT0;
static const char *TAG = "wifi station";
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");
}
}
//////////////////////////////////////////////////////////////////////////////////
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;
client = event->client;
int msg_id;
switch ((esp_mqtt_event_id_t)event_id) {
case MQTT_EVENT_CONNECTED:
printf ("MQTT_EVENT_CONNECTED");
msg_id = esp_mqtt_client_publish(client, "/topicc/qos2", "Wokwi Data", 0, 2, 0);
printf ("sent publish successful, msg_id=%d", msg_id);
msg_id = esp_mqtt_client_subscribe(client, "/srktopic/", 2);
printf("sent subscribe successful, msg_id=%d", msg_id);
msg_id = esp_mqtt_client_subscribe(client, "/srktopic/", 2);
printf("sent subscribe successful, msg_id=%d", msg_id);
break;
case MQTT_EVENT_DISCONNECTED:
printf("MQTT_EVENT_DISCONNECTED");
break;
case MQTT_EVENT_SUBSCRIBED:
printf("MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
msg_id = esp_mqtt_client_publish(client, "/topicc/qos2", "Wokwi Data", 0, 2, 0);
printf("sent publish successful, msg_id=%d", msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
printf("MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_PUBLISHED:
printf("MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_DATA:
printf("MQTT_EVENT_DATA");
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
printf("DATA=%.*s\r\n", event->data_len, event->data);
break;
default:
printf("Other event id:%d", event->event_id);
break;
}
}
static void mqtt_app_start(void)
{
esp_mqtt_client_config_t mqtt_cfg = {
.uri = URL,
};
esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
/*int msg_id;
msg_id = esp_mqtt_client_enqueue(client, "/topic/qos1", "data_3", 0, 1, 0, true);
ESP_LOGI(TAG, "Enqueued msg_id=%d", msg_id);
msg_id = esp_mqtt_client_enqueue(client, "/topic/qos2", "QoS2 message", 0, 2, 0, true);
ESP_LOGI(TAG, "Enqueued msg_id=%d", msg_id);*/
esp_mqtt_client_start(client);
}
//////////////////////////////////////////////
void uart_task(void *pvParameters) {
char data[BUF_SIZE]; // Changed from uint8_t to char
char buffer[BUF_SIZE];
int index = 0;
int bufferIndex = 0;
while (1) {
int len = uart_read_bytes(UART_PORT, data + index, 1, 20 / portTICK_PERIOD_MS);
if (len > 0){
for (int i = 0; i < len; i++) {
buffer[bufferIndex++] = data[i];
// Check for newline character
if (data[i] == '\n') {
// Null-terminate the string and print
buffer[bufferIndex] = '\0';
printf("received %s\n", buffer);
int msg_id = esp_mqtt_client_publish(client, "/topicc/qos2", buffer, 0, 2, 0);
// Reset buffer index for next message
bufferIndex = 0;
}
}
}
}
}
void app_main()
{
uart_init();
// 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();
vTaskDelay(3000 / portTICK_PERIOD_MS);
mqtt_app_start();
xTaskCreate(uart_task, "uart_task", 2048, NULL, 10, NULL);
}