MQTT (Message Queuing Telemetry Transport) adalah protokol jaringan ringan yang dirancang khusus untuk komunikasi mesin ke mesin (M2M). Protokol ini banyak digunakan dalam aplikasi Internet of Things (IoT) karena sifatnya yang hemat daya, bandwidth, dan skalabel.

Karakteristik Utama MQTT:

  • Publish-subscribe: Pesan dipublikasikan ke topik, dan klien yang berlangganan topik tersebut akan menerima pesan

  • Ringan: Paket data MQTT memiliki overhead yang kecil, membuatnya ideal untuk perangkat dengan sumber daya terbatas.

  • Efisien: MQTT menggunakan TCP/IP untuk koneksi yang andal dan terjamin.
  • Skalabilitas tinggi: MQTT dapat menangani banyak klien dan pesan secara bersamaan.

  • Keamanan: MQTT mendukung autentikasi dan enkripsi untuk komunikasi yang aman.

Arsitektur MQTT: Arsitektur MQTT terdiri dari tiga komponen utama:

  • Broker: Server pusat yang bertanggung jawab untuk merutekan pesan antara klien.
  • Publisher: Klien yang menerbitkan pesan ke topik.
  • Subscriber: Klien yang berlangganan topik dan menerima pesan yang diterbitkan.

Cara Kerja MQTT:

Publisher menerbitkan pesan ke topik tertentu. Broker menerima pesan dan meneruskan ke semua subscriber yang berlangganan topik tersebut. Subscriber menerima pesan dan memprosesnya sesuai kebutuhan.

Kelebihan MQTT:

  • Hemat daya dan bandwidth: Cocok untuk perangkat dengan sumber daya terbatas.
  • Efisien dan skalabel: Dapat menangani banyak klien dan pesan secara bersamaan.
  • Sederhana dan mudah digunakan: Memiliki API yang mudah dipahami.
  • Aman: Mendukung autentikasi dan enkripsi untuk komunikasi yang aman.

Kekurangan MQTT:

  • Kompleksitas tambahan: Dibandingkan dengan protokol sederhana seperti HTTP.

  • Ketergantungan pada broker: Memerlukan broker pusat untuk beroperasi.

Contoh Implementasi Penggunaan Umum MQTT:

  • Otomatisasi rumah: Mengontrol perangkat pintar seperti lampu, termostat, dan kunci pintu.
  • Telemetri industri: Memantau dan mengontrol peralatan industri.
  • Pelacakan aset: Melacak lokasi dan status aset.
  • Kota pintar: Mengumpulkan data dari sensor untuk mengoptimalkan operasi kota.
  • Kesehatan dan kebugaran: Memantau data kesehatan pasien dan kebugaran individu.

Kali ini kita akan coba melakukan percobaan komunikasi antara 2 mesin melalui protokol MQTT secara lokal, dimana MQTT Broker hanya akan diinstall di laptop lokal. kita akan mensimulasikan bagamaina ESP32 mengirimkan pesan dan akan di tampung oleh MQTT Broker dan sebaliknya.

Parts

  • ESP32 DOIT DEVKIT V1 Board
  • DHT11 Sensor
  • 1x 4k7 Ohm resistor
  • Breadboard
  • Jumper wires

Skema

enter image description here

Install Library

MQTT Libraries

Untuk menggunakan MQTT dengan ESP32 kita perlu menginstall Library Async MQTT Client pada Arduino IDE. Instalasi Library Async MQTT Client

  • Klik disini untuk download Async MQTT client library.
  • Extract file zip dan ganti nama foldernya menjadi async-mqtt-client
  • Pindahkan folder async_mqtt_client ke folder Library Arduino IDE enter image description here Atau dapat juga dengan cara mengakses menu Sketch > Include Library > Add . ZIP library dan pilih library dalam bentuk zip yang telah didownload.

Instalasi Async TCP Library

Untuk menggukanan MQTT pada ESP32, dibutuhkan juga library Async TCP.

Cara lain dengan mengakses Menu Sketch > Include Library > Add . ZIP library dan pilih library async yg telah didownload. enter image description here

DHT Sensor Libraries

Untum membaca data dari DHT sensor, kita membutuhkan library DHT dari adafruit.

  1. Dari menu Sketch > Include Library > Manage Libraries.
  2. Cari dan install DHT library dari Adafruit
  3. Installkan juga Library “Adafruit Unified Sensor” enter image description here

Install MQTT Broker lokal

Disini untuk MQTT Broker kita akan menggunakan mosquitto Mosquitto merupakan MQTT Broker yang bersifat open source, jadi bebas untuk digunakan. mosquitto dapat berjalan di linux maupun windows, berhubung laptop yang saya gunakan adalah windows, maka saya akan menggunakan versi windows pada project ini, untuk versi server online di project berikutnya saya akan menggunakan versi linux. enter image description here Setelah didownload, lakukan instalasi seperti umumnya menginstal aplikasi pada windows. Bila telah selesai instalasi, kita coba jalankan msquittonya dengan cara, buka command promt, jalankan sebagai Administrator, kemudian masuk ke direktori mosquitto, dan ketik net start mosquitto enter image description here

Konfigurasi Mosquitto

Oleh karena kita akan manfaatkan Mosquitto ini sebagai Broker yang akan berkomunikasi dengan ESP32 pada jaringan Local (Local Area Network), maka kita perlu melakukan konfigurasi mossquitto agar dapat di akses dari luar. Pertama kita harus mengetahui terlebih dahulu IP yang akan di pakai oleh mosquitto. pada command promt kita ketikkan

ip a

ini untuk mengetahui IP komputer kita yang diberikan oleh Router Wifi yang kita pakai : enter image description here

pada gambar diatas, IP laptop kita adalah 192.168.2.105 Selanjutnya kita buka file mosquitto.conf yang ada pada folder instalasi mosquitto kita perlu menambahkan beberapa configurasi

listener 1883 192.168.2.105
allow_anonymous true

ini berarti IP mosquitto (MQTT Broker) akan jalan pada 192.168.2.105 dengan port 1883 dan allow_anonymous true , ini adalah untuk mengizinkan koneksi ke MQTT Broker tanpa butuh authorisasi (user dan password), karna ini masih dalam percobaan Local saja maka ini masih aman, tapi tdk disarankan bila sudah dilakukan pada server public, sebaiknya menggunakan opsi allow_anonymous false, dengan menggunakan user dan password untuk melakukan koneksivitas antar server/client.

Setting Firewall Windows

selain konfigurasi pada mosquitto, agar supaya perangkat lain dari luar bisa melakukan koneksi, maka kita perlu membuat rule pada Firewall Windows, agar koneksi ke port mosquitto (port 1883) tidak akan di blok oleh Defender (Windows). enter image description here Buka service firewall dengan menuliskan firewall.cpl

enter image description here Pilih menu Allow an app or feature through Windows Defender Firewall

enter image description here Pilih button Allow another app

enter image description here Browse mosquitto.exe, dan klik add enter image description here Kita lihat pada daftar sudah ada mosquitto, terakhir klik Ok.

Rule Port Firewall

kita juga perlu membuat firwall inbound dan outbound untuk port 1883. Konfigurasi firewall dengan rule port bertujuan agar firewall windows defender memberi izin message broker mosquitto dengan port 1883 dapat diakses dari luar.

Terdapat dua jenis rule port yang harus dikofigurasi, yaitu:

Port — Inbound Rule dan Port— Outbound Rule

Konfigurasi Inbound Port

enter image description here Buka services Firewall

enter image description here Selanjutnya pilih Inbound Rules dan klik New Rule

enter image description here Pilih Port, kemudian klik Next

enter image description here ketikkan port "1883", dan Klik Next.

enter image description here Pilih Allow the connection, dan klik next enter image description here Berikan nama rule dan deskripsinya. dan klik Finish untuk mengakhiri konfigurasi

Konfigurasi Outbound Port

Untuk Konfigurasi Outbound Port pada dasarnya sama saja dengan konfigurasi Inbound Port, hanya disini kita memilih menu Outbound Port, dan langkah selanjutnya ulangi seperti mengkonfigurasi Inbound Port.

Install MQTT Explorer

enter image description here

Untuk MQTT Explorer hanya berupa protable jadi tdk perlu proses instalasi.

Upload Kode

    /*
      Rui Santos
      Complete project details at https://RandomNerdTutorials.com/esp32-mqtt-publish-dht11-dht22-arduino/

      Permission is hereby granted, free of charge, to any person obtaining a copy
      of this software and associated documentation files.

      The above copyright notice and this permission notice shall be included in all
      copies or substantial portions of the Software.
    */

    #include "DHT.h"
    #include <WiFi.h>
    extern "C" {
      #include "freertos/FreeRTOS.h"
      #include "freertos/timers.h"
    }
    #include <AsyncMqttClient.h>

    #define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
    #define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

    // Windows  Mosquitto MQTT Broker
    #define MQTT_HOST IPAddress(192, 168, 2, XXX)
    // For a cloud MQTT broker, type the domain name
    //#define MQTT_HOST "example.com"
    #define MQTT_PORT 1883

    // Temperature MQTT Topics
    #define MQTT_PUB_TEMP "esp32/dht/temperature"
    #define MQTT_PUB_HUM  "esp32/dht/humidity"

    // Digital pin connected to the DHT sensor
    #define DHTPIN 4  

    // Uncomment whatever DHT sensor type you're using
    #define DHTTYPE DHT11   // DHT 11
   // #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)   

    // Initialize DHT sensor
    DHT dht(DHTPIN, DHTTYPE);

    // Variables to hold sensor readings
    float temp;
    float hum;

    AsyncMqttClient mqttClient;
    TimerHandle_t mqttReconnectTimer;
    TimerHandle_t wifiReconnectTimer;

    unsigned long previousMillis = 0;   // Stores last time temperature was published
    const long interval = 10000;        // Interval at which to publish sensor readings

    void connectToWifi() {
      Serial.println("Connecting to Wi-Fi...");
      WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    }

    void connectToMqtt() {
      Serial.println("Connecting to MQTT...");
      mqttClient.connect();
    }

    void WiFiEvent(WiFiEvent_t event) {
      Serial.printf("[WiFi-event] event: %d\n", event);
      switch(event) {
        case SYSTEM_EVENT_STA_GOT_IP:
          Serial.println("WiFi connected");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
          connectToMqtt();
          break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
          Serial.println("WiFi lost connection");
          xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
          xTimerStart(wifiReconnectTimer, 0);
          break;
      }
    }

    void onMqttConnect(bool sessionPresent) {
      Serial.println("Connected to MQTT.");
      Serial.print("Session present: ");
      Serial.println(sessionPresent);
    }

    void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
      Serial.println("Disconnected from MQTT.");
      if (WiFi.isConnected()) {
        xTimerStart(mqttReconnectTimer, 0);
      }
    }

    /*void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
      Serial.println("Subscribe acknowledged.");
      Serial.print("  packetId: ");
      Serial.println(packetId);
      Serial.print("  qos: ");
      Serial.println(qos);
    }
    void onMqttUnsubscribe(uint16_t packetId) {
      Serial.println("Unsubscribe acknowledged.");
      Serial.print("  packetId: ");
      Serial.println(packetId);
    }*/

    void onMqttPublish(uint16_t packetId) {
      Serial.print("Publish acknowledged.");
      Serial.print("  packetId: ");
      Serial.println(packetId);
    }

    void setup() {
      Serial.begin(115200);
      Serial.println();

      dht.begin();

      mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
      wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));

      WiFi.onEvent(WiFiEvent);

      mqttClient.onConnect(onMqttConnect);
      mqttClient.onDisconnect(onMqttDisconnect);
      //mqttClient.onSubscribe(onMqttSubscribe);
      //mqttClient.onUnsubscribe(onMqttUnsubscribe);
      mqttClient.onPublish(onMqttPublish);
      mqttClient.setServer(MQTT_HOST, MQTT_PORT);
      // If your broker requires authentication (username and password), set them below
      //mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
      connectToWifi();
    }

    void loop() {
      unsigned long currentMillis = millis();
      // Every X number of seconds (interval = 10 seconds) 
      // it publishes a new MQTT message
      if (currentMillis - previousMillis >= interval) {
        // Save the last time a new reading was published
        previousMillis = currentMillis;
        // New DHT sensor readings
        hum = dht.readHumidity();
        // Read temperature as Celsius (the default)
        temp = dht.readTemperature();
        // Read temperature as Fahrenheit (isFahrenheit = true)
        //temp = dht.readTemperature(true);

        // Check if any reads failed and exit early (to try again).
        if (isnan(temp) || isnan(hum)) {
          Serial.println(F("Failed to read from DHT sensor!"));
          return;
        }

        // Publish an MQTT message on topic esp32/dht/temperature
        uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str());                            
        Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
        Serial.printf("Message: %.2f \n", temp);

        // Publish an MQTT message on topic esp32/dht/humidity
        uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());                            
        Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
        Serial.printf("Message: %.2f \n", hum);
      }
    }

Ujicoba MQTT - ESP32

Setelah MQTT Broker telah siap, langkah terakhir kita mengupload Kode Program ke ESP32, dengan sebtelumnya melakukan penyesuaian pada :

#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

Kita sesuaikan nama SSID dan Password Wifi sesuai Hotspot kita

// Windows  Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 2, 105)
#define MQTT_PORT 1883

dan Juga untuk IP Address kita Sesuaikan dengan IP address dari MQTT Broker dalam hal ini IP address Laptop kita.

enter image description here pada MQTT Explorer, kita lakukan koneksi ke MQTT Broker Buat Koneksi Baru, isikan IP Address 192.168.0.105 dan port 1883, kemudian klik Connect

enter image description here Ketika ESP32 sudah dihidupkan, kita pantau melalui serial Monitor, maka akan terlihat seperti pada gambar diatas.

Kesimpulan

MQTT adalah protokol jaringan yang ideal untuk aplikasi IoT yang membutuhkan komunikasi yang hemat daya, bandwidth, dan skalabel. Protokol ini mudah digunakan, aman, dan dapat menangani banyak klien dan pesan secara bersamaan.

Next Project kita akan menggunakan MQTT Broker (Server Online) dan akan menampilkan secara visual data logging menggunakan Node Red (dashboard).