1. #!trpst#trp-gettext data-...
  2. #!trpst#trp-gettext data-...
  3. ESP-IDF / ESP32
  4. IoT ve Kablosuz Haberleşm...
  5. ESP-IDF ile MQTT İstemcisi ve IoT Bulutuna Güvenli Veri Gönderimi

ESP-IDF ile MQTT İstemcisi ve IoT Bulutuna Güvenli Veri Gönderimi

Print

Nesnelerin İnterneti (IoT) ekosisteminde sensör verilerini AWS IoT, HiveMQ, EMQX veya yerel bir Mosquitto broker’ına aktarmanın küresel standardı MQTT (Message Queuing Telemetry Transport) protokolüdür. Hafif yayınla/abone ol (Publish/Subscribe) mimarisi ve düşük bant genişliği tüketimi sayesinde ESP-IDF MQTT istemcisi (esp-mqtt), ESP32 tabanlı endüstriyel cihazların güvenilir ve iki yönlü bulut iletişimini sağlar.

Bu rehberde; MQTT mimarisini ve QoS (Quality of Service) seviyelerini, mqtt_client yapılandırmasını, olay işleyicisini (event handler), konu dinlemeyi (subscribe) ve sensör telemetri verilerini JSON formatında yayınlamayı (publish) adım adım inşa edeceğiz.


MQTT Mimarisi ve QoS Seviyeleri

MQTT, istemcilerin bir aracı (Broker) üzerinden belirli konulara (Topics) mesaj gönderdiği bir protokoldür:

  • Topic Hiyerarşisi: Örn: ahakan/fabrika1/sicaklik veya cihazlar/esp32_01/durum
  • QoS 0 (En Fazla Bir Kez – At most once): Onay beklenmez. Mesaj kaybolabilir ama en hızlısıdır.
  • QoS 1 (En Az Bir Kez – At least once): PUBACK onayı beklenir. Mesajın ulaştığı garanti edilir ancak çift gidebilir.
  • QoS 2 (Tam Bir Kez – Exactly once): Dört aşamalı el sıkışma yapılır. Mesaj tam bir kez ulaşır (En yavaşı).

Adım 1: MQTT İstemci Yapılandırması (esp-mqtt)

ESP-IDF’in resmi esp-mqtt bileşeni otomatik yeniden bağlanma (auto-reconnect), arka plan FreeRTOS görevi ve TLS desteği içerir:

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "esp_event.h"
#include "mqtt_client.h"

static const char *TAG = "MQTT_CLIENT";
static esp_mqtt_client_handle_t client = NULL;

// MQTT Olaylarını İşleyen Fonksiyon
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;

    switch ((esp_mqtt_event_id_t)event_id) {
        case MQTT_EVENT_CONNECTED:
            ESP_LOGI(TAG, "MQTT Broker'a Başarıyla Bağlanıldı!");
            // Bağlanınca komut dinlemek için bir konuya abone ol (Subscribe)
            esp_mqtt_client_subscribe(client, "ahakan/esp32/komut", 1);
            break;

        case MQTT_EVENT_DISCONNECTED:
            ESP_LOGW(TAG, "MQTT Bağlantısı koptu! Yeniden bağlanılıyor...");
            break;

        case MQTT_EVENT_SUBSCRIBED:
            ESP_LOGI(TAG, "Konuya abone olundu! Msg ID: %d", event->msg_id);
            break;

        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "Gelen Mesaj -> Konu: %.*s, Veri: %.*s",
                     event->topic_len, event->topic,
                     event->data_len, event->data);
            
            // Eğer gelen veri "ROLE_ON" ise röleyi aç
            if (strncmp(event->data, "ROLE_ON", event->data_len) == 0) {
                ESP_LOGI(TAG, "Röle Açılıyor...");
            }
            break;

        case MQTT_EVENT_ERROR:
            ESP_LOGE(TAG, "MQTT Hatası oluştu!");
            break;

        default:
            break;
    }
}

Adım 2: İstemciyi Başlatmak

Wi-Fi rehberimizde gördüğümüz gibi Wi-Fi bağlantısı kurulup IP alındıktan sonra MQTT istemcisi başlatılır:

void mqtt_app_start(void) {
    esp_mqtt_client_config_t mqtt_cfg = {
        .broker.address.uri = "mqtt://broker.hivemq.com:1883", // Veya yerel Mosquitto: "mqtt://192.168.1.50:1883"
        // Kimlik doğrulama gerekiyorsa:
        // .credentials.username = "kullanici_adi",
        // .credentials.authentication.password = "sifre",
    };

    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);
}

Adım 3: Telemetri Verisini JSON Olarak Yayınlamak (Publish)

Sensörden okunan verileri JSON dizesine dönüştürüp buluta göndermek için:

void send_sensor_telemetry(float temperature, float humidity, int battery) {
    char payload[128];
    // JSON dizesi oluştur
    snprintf(payload, sizeof(payload), 
             "{\"temp\": %.1f, \"hum\": %.1f, \"bat\": %d}", 
             temperature, humidity, battery);

    // QoS 1 ile yayınla (retain: 0)
    int msg_id = esp_mqtt_client_publish(client, "ahakan/esp32/telemetri", payload, 0, 1, 0);
    ESP_LOGI(TAG, "Veri yayınlandı (Msg ID: %d): %s", msg_id, payload);
}

TLS / MQTTS (Port 8883) ile Güvenlik

Üretim ortamlarında MQTT trafiğini şifrelemek zorunludur:

esp_mqtt_client_config_t mqtt_cfg = {
    .broker.address.uri = "mqtts://mqtt.ahakan.com:8883",
    .broker.verification.certificate = (const char *)server_cert_pem_start, // Root CA Sertifikası
};

Özet

esp-mqtt, ESP32 projelerinde bulut haberleşmesinin omurgasıdır. Olay güdümlü mimarisi, QoS garantisi ve otomatik bağlantı kurtarma mekanizmasıyla endüstriyel kalitede telemetri ve uzaktan kontrol sistemleri geliştirebilirsiniz.

Tags , , , , ,

How can we help?