Menghubungkan perangkat ke dunia: memahami pilihan TCP/IP stack untuk MCU, protokol MQTT dengan publish/subscribe untuk IoT, dan dasar secure communication dengan TLS, ditutup praktik menghubungkan perangkat nyata ke broker dan membaca datanya dari jarak jauh

Perangkat yang tidak terhubung kini langka. Dari smartwatch yang menyinkronkan data, sensor pertanian yang melapor ke cloud, sampai kunci pintu yang bisa dibuka dari ponsel — semuanya membutuhkan satu kemampuan yang belum kita bahas: berkomunikasi lewat jaringan. Episode ini menjembatani dunia MCU dengan dunia networking.
Tantangan utamanya bukan "bisa connect", melainkan bisa connect dengan hemat dan aman di perangkat berresource kecil: TCP/IP penuh berat, TLS mahal dalam RAM dan CPU, dan protokol yang salah pilih membuat perangkat boros baterai. Episode ini membangun pemahaman pilihan protokol, stack, dan pola yang dipakai industri IoT nyata.
Di arsitektur ini, MCU kecil hampir selalu berperan sebagai publisher (mengirim data) atau subscriber (menerima perintah). Jarang sekali MCU menjadi server. Pemahaman ini menentukan protokol yang dipilih — publish/subscribe jauh lebih cocok untuk perangkat kecil daripada model request/response klasik.
MCU dengan WiFi (ESP32) biasanya punya stack TCP/IP bawaan (lwIP). MCU tanpa radio perlu stack eksternal. Pemain utama di dunia MCU:
| Stack | Karakteristik | Cocok untuk |
|---|---|---|
| lwIP | Ringan, banyak dipakai (ESP-IDF) | MCU dengan WiFi/Ethernet |
| Zephyr Net | Bagian dari OS Zephyr, moduler | Board ber-RTOS Zephyr |
| MbedTLS | Bukan stack, tapi crypto/TLS | Lapisan keamanan di atas TCP/IP |
| No stack (LoRa/raw) | Tanpa TCP/IP, frame langsung | LPWAN, sensor jarak jauh |
Aturan praktis: jika perangkat harus berbicara ke internet dengan handshake TCP — pakai lwIP (atau stack bawaan platform). Jika hanya butuh mengirim beberapa byte dalam jarak jauh — pertimbangkan LPWAN (LoRa) yang tidak butuh stack TCP/IP sama sekali.
MQTT (Message Queuing Telemetry Transport) adalah protokol publish/subscribe yang dirancang untuk jaringan kecil, lambat, dan tidak stabil — persis kebutuhan embedded. Prinsip intinya:
rumah/dapur/suhu) atau subscribe ke topic.Sensor -> publish("rumah/dapur/suhu", "26.5") -> Broker
Broker -> "26.5" -> Dashboard (subscribe "rumah/dapur/#")
Broker -> "26.5" -> HP (subscribe "rumah/dapur/suhu")Keunggulan MQTT: koneksi tunggal ke broker bisa melayani banyak topic, payload ringan, dan punya tiga level QoS:
| QoS | Jaminan | Biaya |
|---|---|---|
| 0 | At most once — pesan bisa hilang | Terendah |
| 1 | At least once — pesan pasti tiba, bisa duplikat | Sedang |
| 2 | Exactly once — tidak hilang, tidak duplikat | Tertinggi |
Untuk telemetry biasa (suhu, status), QoS 0 atau 1 sudah cukup; untuk perintah kontrol (buka kunci, nyalakan mesin), pertimbangkan QoS 1 + idempotent handler di sisi penerima.
Contoh koneksi dengan Arduino framework di ESP32:
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SSID_ANDA";
const char* pass = "PASSWORD";
const char* broker = "broker.emqx.io";
WiFiClient wifi;
PubSubClient mqtt(wifi);
void setup() {
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) delay(100);
mqtt.setServer(broker, 1883);
mqtt.connect("sensor-dapur-01");
}
void loop() {
mqtt.loop();
if (!mqtt.connected()) mqtt.connect("sensor-dapur-01");
mqtt.publish("rumah/dapur/suhu", "26.5");
delay(5000);
}Kesalahan umum pemula: memanggil publish tanpa mqtt.loop() di loop() — pesan tidak pernah terkirim karena socket tidak diproses.
Warning
Jangan pernah mengirim data sensor tanpa enkripsi — apalagi di jaringan publik. Port 1883 plaintext bisa dibaca siapa pun di jaringan yang sama. Untuk produksi, selalu gunakan TLS (port 8883, atau 443 untuk WebSocket). Biaya TLS di MCU nyata: RAM tambahan untuk handshake dan energi CPU — pertimbangkan di desain power (episode 13).
TLS (Transport Layer Security) mengamankan data saat transit: enkripsi mencegah pembacaan, dan sertifikat mencegah peniruan server. Di MCU, implementasi paling umum adalah MbedTLS:
Melampaui TLS, praktik keamanan komunikasi yang wajib:
docker run -p 1883:1883 eclipse-mosquitto (atau pakai broker publik EMQX).mosquitto_sub -h localhost -t 'rumah/#' -v dan lihat data mengalir.mqtts://) dan verifikasi data tidak terbaca dengan mosquitto_sub plaintext.mqtt.loop() — socket tidak diproses, publish tidak jalan.Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita menghemat energi: power management — low power modes, optimasi energi, dan memperpanjang umur baterai. Perangkat IoT hidup dari baterai yang harus bertahan berbulan-bulan, dan itu adalah tantangan desain — bukan sekadar tambahan. Sampai jumpa di episode 13!