#include "mqtt.h" #include "config.h" #include "esp_log.h" #include "esp_timer.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include #include #include static const char *TAG = "mqtt"; static esp_mqtt_client_handle_t client; /** * @brief Obsługa zdarzeń MQTT */ 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 (event->event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, "MQTT connected!"); esp_mqtt_client_subscribe(event->client, SUB_TOPIC, 1); break; case MQTT_EVENT_DATA: { char topic[event->topic_len + 1]; char data[event->data_len + 1]; memcpy(topic, event->topic, event->topic_len); topic[event->topic_len] = '\0'; memcpy(data, event->data, event->data_len); data[event->data_len] = '\0'; ESP_LOGI(TAG, "MQTT Msg received | Topic: %s | Data: %s", topic, data); // Echo wiadomości do PUB_TOPIC tylko jeśli timestamp jest // sensowny char *endptr; long long ts = strtoll(data, &endptr, 10); if (endptr != data && *endptr == '\0' && ts > 0 && ts < 1e13) { esp_mqtt_client_publish(event->client, PUB_TOPIC, data, 0, 1, 0); } else { ESP_LOGW(TAG, "Nieprawidłowe dane, ignorowane: %s", data); } break; } case MQTT_EVENT_DISCONNECTED: ESP_LOGW(TAG, "MQTT disconnected"); break; case MQTT_EVENT_ERROR: ESP_LOGE(TAG, "MQTT error occurred"); break; default: break; } } /** * @brief Uruchamia klienta MQTT */ void mqtt_app_start(void) { esp_mqtt_client_config_t mqtt_cfg = { .broker.address.uri = MQTT_URI, }; client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); esp_mqtt_client_start(client); ESP_LOGI(TAG, "MQTT client started"); }