Belajar IoT Engineer - Communication Protocols (MQTT/CoAP)
Episode 5 of 28

Belajar IoT Engineer - Communication Protocols (MQTT/CoAP)

Memahami protokol komunikasi IoT: MQTT dengan model publish/subscribe dan tingkat QoS, CoAP sebagai alternatif ringan untuk perangkat terbatas, HTTP untuk API berbasis permintaan, serta praktik membangun komunikasi MQTT pertama dari ESP32 ke broker.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Setelah di episode 4 firmware kita mampu menjalankan banyak tugas dengan RTOS, pada episode ini kita menghubungkannya ke dunia luar. Semua perangkat IoT — dari sensor suhu sampai smart lock — berkomunikasi dengan protokol tertentu. Memilih protokol yang salah adalah kesalahan desain paling mahal: perangkat yang mengonsumsi baterai terlalu cepat, atau data yang hilang saat sinyal buruk.

Tiga protokol mendominasi dunia IoT: MQTT, CoAP, dan HTTP. Masing-masing dirancang untuk kebutuhan berbeda, dan memahami kapan memakai yang mana adalah kompetensi inti IoT Engineer.

Perbandingan Tiga Protokol

KarakteristikMQTTCoAPHTTP
ModelPublish/subscribeRequest/response (REST)Request/response
TransportTCPUDP (opsional DTLS)TCP
HeaderRingan, binarySangat ringanBerat, text
FormatBebas (JSON/raw)Binary CBOR/JSONJSON/XML
Arah komunikasiOne-to-many (fan-out)One-to-oneOne-to-one
Koneksi persistenYaTidakTidak
Cocok untukTelemetry, commandPerangkat sangat terbatasAPI, integrasi web

Pola praktis: MQTT untuk telemetry dan kontrol dua arah, CoAP untuk perangkat constraint berat (sensor bertenaga baterai dengan RAM kecil), HTTP saat kalian berurusan dengan API web biasa — misalnya mengirim data langsung ke REST endpoint.

MQTT dan Model Publish/Subscribe

MQTT adalah protokol paling penting di dunia IoT. Berbeda dari HTTP yang bersifat request/response, MQTT memakai publish/subscribe:

100%

Peran dalam MQTT:

KomponenPeran
PublisherMengirim pesan ke topik tertentu (tanpa tahu siapa penerimanya)
BrokerPusat komunikasi yang menyalurkan pesan (Mosquitto, EMQX, AWS IoT)
SubscriberMenerima pesan dari topik yang di-subscribe
TopicAlamat ber-hirarki, contoh suhu/ruang1/data
Wildcard+ (satu level) dan # (semua level berikutnya)

Kekuatan MQTT: publisher tidak perlu tahu siapa subscriber. Sepuluh aplikasi bisa subscribe ke topik yang sama tanpa mengubah perangkat. Ini memisahkan producer dan consumer — pola yang sangat cocok untuk sistem IoT yang terus bertumbuh.

Tingkat QoS (Quality of Service)

MQTT mendefinisikan tiga tingkat jaminan pengiriman:

QoSJaminanOverheadDipakai Saat
0Paling satu kali, bisa hilangPaling ringanTelemetry non-kritis (suhu, tiap menit)
1Setidaknya satu kali, bisa duplikatSedangKebanyakan kasus (nilai sama, duplikat tidak fatal)
2Tepat satu kali, tidak duplikatPaling beratPayment, command sekali-jalan

Aturan praktis: QoS 0 untuk data yang selalu terkirim terus-menerus, QoS 1 untuk default, QoS 2 hanya saat duplikasi benar-benar fatal.

CoAP: Protokol Ringan untuk Perangkat Terbatas

CoAP (Constrained Application Protocol) adalah "HTTP untuk perangkat mikro". Berjalan di atas UDP, header-nya hanya 4 byte, dan punya metode seperti HTTP (GET, POST, PUT, DELETE). Contoh request:

Request CoAP ke resource sensor
con GET /temperature
    → 2.05 Content "26.5 C"

Keunggulannya: konsumsi daya dan memori jauh lebih kecil dari MQTT over TCP — cocok untuk sensor dengan RAM puluhan KB yang bertahan berbulan-bulan dengan baterai AA. Kelemahannya: tidak punya model publish/subscribe bawaan dan butuh mekanisme observasi tersendiri (Observe) untuk langganan.

Praktik: MQTT dari ESP32

Mari kirim telemetry suhu dari ESP32 ke broker lokal. Instal library PubSubClient di PlatformIO:

platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
    knolleary/PubSubClient@^2.8
src/main.cpp - publish telemetry via MQTT
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
 
const char *ssid = "NAMA_WIFI";
const char *pass = "PASSWORD_WIFI";
const char *mqttHost = "192.168.1.10";
const int mqttPort = 1883;
 
WiFiClient espClient;
PubSubClient mqtt(espClient);
 
void connectMqtt() {
    while (!mqtt.connected()) {
        Serial.print("konek MQTT... ");
        if (mqtt.connect("esp32-sensor-01")) {
            Serial.println("ok");
        } else {
            Serial.println("gagal, coba lagi");
            delay(2000);
        }
    }
}
 
void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) delay(500);
 
    mqtt.setServer(mqttHost, mqttPort);
    connectMqtt();
}
 
void loop() {
    if (!mqtt.connected()) connectMqtt();
    mqtt.loop();
 
    float t = 26.5 + (rand() % 10) / 10.0f;
    char payload[64];
    snprintf(payload, sizeof(payload), "{\"temp\":%.1f}", t);
    mqtt.publish("ruang1/temperature", payload);   // QoS 0 default
    delay(5000);
}

Di sisi lain, subscribe di terminal:

Subscribe topik telemetry
mosquitto_sub -h 192.168.1.10 -t "ruang1/temperature" -v
Output broker
ruang1/temperature {"temp":26.5}
ruang1/temperature {"temp":26.9}

mqtt.publish() mengirim payload JSON ke topik ruang1/temperature. mqtt.loop() harus dipanggil rutin agar library memproses pesan masuk dan menjaga koneksi tetap hidup.

Important

Payload di atas tidak terenkripsi — siapa pun di jaringan yang sama bisa membaca topik. Untuk produksi, wajib memakai MQTT over TLS (port 8883) dan identitas perangkat; detailnya kita bahas di episode 11 dan 19. Jangan pernah membawa kredensial WiFi atau broker tanpa proteksi ke lapangan.

Command dari Cloud ke Perangkat

MQTT dua arah: selain mengirim telemetry, perangkat bisa menerima command. Firmware subscribe ke topik ruang1/command, misalnya untuk menyalakan relay:

Callback command - menyalakan relay
void mqttCallback(char *topic, byte *payload, unsigned int len) {
    String msg;
    for (unsigned int i = 0; i < len; i++) msg += (char)payload[i];
 
    if (String(topic) == "ruang1/command") {
        if (msg == "ON") {
            digitalWrite(RELAY_PIN, HIGH);
            Serial.println("relay: ON");
        } else if (msg == "OFF") {
            digitalWrite(RELAY_PIN, LOW);
            Serial.println("relay: OFF");
        }
    }
}
Daftarkan callback di setup
mqtt.setCallback(mqttCallback);
mqtt.subscribe("ruang1/command");

Sekarang kalian bisa mengirim command dari mana saja:

Kirim command dari terminal
mosquitto_pub -h 192.168.1.10 -t ruang1/command -m "ON"

Kesalahan Umum

  1. Melupakan mqtt.loop() — pesan tidak pernah diterima dan koneksi putus karena keepalive tidak terkirim.
  2. Payload JSON format salah — gunakan library seperti ArduinoJson untuk menyusun payload agar tidak rentan error parsing.
  3. Menempatkan connect di loop — memblokir eksekusi; pakai pola reconnect dengan backoff dan panggil mqtt.loop() terpisah.
  4. Topic terlalu berlebihan — desain topik ber-hirarki sejak awal (mis. lokasi/perangkat/jenis) karena sulit diubah di produksi.
  5. QoS 2 untuk semua pesan — membuang overhead; pakai QoS yang sesuai kebutuhan.

Penutup

Inti yang harus dibawa pulang:

  • Tiga protokol utama: MQTT (pub/sub, TCP), CoAP (ringan, UDP), HTTP (request/response).
  • MQTT memisahkan producer dan consumer lewat broker dan topik.
  • QoS 0/1/2 mengontrol jaminan pengiriman — pilih sesuai risiko duplikasi vs overhead.
  • Firmware ESP32 bisa publish telemetry dan subscribe command lewat PubSubClient.
  • Produksi wajib TLS + identitas perangkat; JSON disusun dengan library aman.

Di episode 6 selanjutnya, kita akan membahas wireless IoT — bagaimana memilih antara WiFi, BLE, Zigbee, LoRaWAN, dan seluler (NB-IoT) berdasarkan jangkauan, bandwidth, dan daya, plus praktik koneksi WiFi/BLE dari ESP32. Perangkat kalian akan semakin mandiri!