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.

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.
| Karakteristik | MQTT | CoAP | HTTP |
|---|---|---|---|
| Model | Publish/subscribe | Request/response (REST) | Request/response |
| Transport | TCP | UDP (opsional DTLS) | TCP |
| Header | Ringan, binary | Sangat ringan | Berat, text |
| Format | Bebas (JSON/raw) | Binary CBOR/JSON | JSON/XML |
| Arah komunikasi | One-to-many (fan-out) | One-to-one | One-to-one |
| Koneksi persisten | Ya | Tidak | Tidak |
| Cocok untuk | Telemetry, command | Perangkat sangat terbatas | API, 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 adalah protokol paling penting di dunia IoT. Berbeda dari HTTP yang bersifat request/response, MQTT memakai publish/subscribe:
Peran dalam MQTT:
| Komponen | Peran |
|---|---|
| Publisher | Mengirim pesan ke topik tertentu (tanpa tahu siapa penerimanya) |
| Broker | Pusat komunikasi yang menyalurkan pesan (Mosquitto, EMQX, AWS IoT) |
| Subscriber | Menerima pesan dari topik yang di-subscribe |
| Topic | Alamat 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.
MQTT mendefinisikan tiga tingkat jaminan pengiriman:
| QoS | Jaminan | Overhead | Dipakai Saat |
|---|---|---|---|
| 0 | Paling satu kali, bisa hilang | Paling ringan | Telemetry non-kritis (suhu, tiap menit) |
| 1 | Setidaknya satu kali, bisa duplikat | Sedang | Kebanyakan kasus (nilai sama, duplikat tidak fatal) |
| 2 | Tepat satu kali, tidak duplikat | Paling berat | Payment, 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 (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:
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.
Mari kirim telemetry suhu dari ESP32 ke broker lokal. Instal library PubSubClient di PlatformIO:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
knolleary/PubSubClient@^2.8#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:
mosquitto_sub -h 192.168.1.10 -t "ruang1/temperature" -vruang1/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.
MQTT dua arah: selain mengirim telemetry, perangkat bisa menerima command. Firmware subscribe ke topik ruang1/command, misalnya untuk 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");
}
}
}mqtt.setCallback(mqttCallback);
mqtt.subscribe("ruang1/command");Sekarang kalian bisa mengirim command dari mana saja:
mosquitto_pub -h 192.168.1.10 -t ruang1/command -m "ON"mqtt.loop() — pesan tidak pernah diterima dan koneksi putus karena keepalive tidak terkirim.connect di loop — memblokir eksekusi; pakai pola reconnect dengan backoff dan panggil mqtt.loop() terpisah.lokasi/perangkat/jenis) karena sulit diubah di produksi.Inti yang harus dibawa pulang:
PubSubClient.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!