
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
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
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.
- Klik disini untuk mendownload Async TCP client library.
- Extract file zip yang telah di download, kemudian di ganti nama foldernya menjadi AsyncTCP
- Pindahkan folder tersebut ke folder library instalasi Arduino IDE
Cara lain dengan mengakses Menu Sketch > Include Library > Add . ZIP library dan pilih library async yg telah didownload.
DHT Sensor Libraries
Untum membaca data dari DHT sensor, kita membutuhkan library DHT dari adafruit.
- Dari menu Sketch > Include Library > Manage Libraries.
- Cari dan install DHT library dari Adafruit
- Installkan juga Library “Adafruit Unified Sensor”
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.
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
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 :
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).
Buka service firewall dengan menuliskan firewall.cpl
Pilih menu Allow an app or feature through Windows Defender Firewall
Pilih button Allow another app
Browse mosquitto.exe, dan klik add
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
Buka services Firewall
Selanjutnya pilih Inbound Rules dan klik New Rule
Pilih Port, kemudian klik Next
ketikkan port "1883", dan Klik Next.
Pilih Allow the connection, dan klik next
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
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.
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
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).