Belajar Firmware Engineer - Communication & Networking
Episode 12 of 28

Belajar Firmware Engineer - Communication & Networking

Menghubungkan firmware ke jaringan: peran TCP/IP stack (lwIP) di MCU, protokol MQTT dengan publish/subscribe dan QoS, koneksi aman dengan TLS dan mTLS, batasan sumber daya jaringan di embedded, serta praktik firmware MQTT over TLS pertama di ESP32.

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

Pendahuluan

Setelah di episode 11 firmware kita belajar berhemat daya, pada episode ini ia belajar berbicara dengan dunia luar. Sebuah perangkat tanpa konektivitas adalah pulau; dengan jaringan, ia jadi bagian dari sistem — mengirim telemetry, menerima perintah, dan diperbarui dari jauh (fondasi episode 13).

Mengapa networking penting di 2026? Karena hampir semua produk baru — smart home, sensor industri, wearables — butuh koneksi. Dan di firmware, networking berbeda dari server: sumber daya terbatas, koneksi harus tahan putus-putus, dan keamanan (TLS) bukan lagi opsional. Episode ini membangun fondasi yang akan kita lengkapi dengan keamanan di episode 18–19.

TCP/IP Stack di MCU

MCU tidak menjalankan Linux — ia butuh TCP/IP stack ringan yang berjalan di atas RTOS. Yang paling umum: lwIP (lightweight IP), dipakai oleh ESP-IDF, STM32, dan Zephyr.

100%

Yang perlu kalian pahami di embedded TCP/IP:

  • Socket APIsocket/connect/send/recv mirip BSD, berjalan async lewat RTOS task.
  • Buffer pools — lwIP memakai pbuf dengan memori dari pool statis; buka RAM/heap terbatas.
  • DHCP/DNS — butuh koneksi ke server; timeout harus ditangani.
  • Keep-alive & reconnect — jaringan seluler/WiFi tidak stabil; firmware harus punya strategi sambung ulang.

MQTT: Protokol Telemetry

MQTT (episode 12 dari series IoT, tapi mari rekap intinya) adalah protokol publish/subscribe di atas TCP — ringan, berorientasi data, ideal untuk telemetry dan command:

Komponen MQTT
Publisher (sensor) --publish--> Broker <--subscribe-- Subscriber (dashboard)
Topic: perangkat_01/suhu   QoS: 0, 1, atau 2

Fitur yang sering dipakai firmware:

FiturFungsi
QoS 0/1/2Jaminan pengiriman vs overhead
Retained messageBroker menyimpan nilai terakhir untuk subscriber baru
LWT (Last Will)Broker memberi tahu saat perangkat mati mendadak
Wildcard +, #Subscribe kelompok topik

TLS: Koneksi Aman

Data dari sensor bisa jadi sensitif — dan perintah yang diubah attacker bisa berbahaya (misal perintah ke smart lock). Maka TLS (Transport Layer Security) wajib:

  • TLS 1.2/1.3 menjaga kerahasiaan (encrypt) dan integritas (MAC) data di jalan.
  • Server certificate diverifikasi firmware → cegah man-in-the-middle.
  • Client certificate (mTLS) membuktikan identitas perangkat ke broker.
  • Certificates: firmware menyimpan root CA, dan kadang client cert + private key (di secure storage/secure element).
Praktik keamanan TLS di firmware
✓ Verifikasi sertifikat server - jangan pernah "verify off"
✓ Pakai MQTT over TLS (port 8883), bukan plain 1883
✓ Private key disimpan terenkripsi / secure element
✓ Rotasi sertifikat dengan masa berlaku; rencanakan update
✓ Jangan hardcode credential di source (baca dari NVS/secure storage)

Warning

Aturan tanpa kompromi: jangan pernah men-disable verifikasi sertifikat ("verify off") hanya agar cepat jalan. Itu sama saja mengirim kunci rumah lewat pos tanpa amplop. Kalau handshake gagal karena CA tidak dikenali, tambahkan root CA yang benar — bukan mematikan verifikasi.

Praktik: Firmware MQTT over TLS di ESP32

Gunakan ESP-IDF/PlatformIO + ESP32. Ini inti firmware-nya:

main.cpp - MQTT over TLS (konsep ESP-IDF)
#include "mqtt_client.h"
#include "esp_tls.h"
 
static esp_mqtt_client_handle_t mqtt;
 
static void mqtt_event(void *arg, esp_event_base_t base,
                       int32_t id, void *data) {
    // handle MQTT_EVENT_CONNECTED, MQTT_EVENT_DATA, dsb.
}
 
void network_init(void) {
    esp_mqtt_client_config_t cfg = {};
    cfg.broker.address.uri = "mqtts://broker.example.com:8883";
    cfg.broker.verification.certificate = (const char *)root_ca_pem;
    cfg.credentials.client_id = "dev-001";
    mqtt = esp_mqtt_client_init(&cfg);
    esp_mqtt_client_register_event(mqtt, ESP_EVENT_ANY_ID, mqtt_event, NULL);
    esp_mqtt_client_start(mqtt);
}
 
// publish telemetry
void publish_temp(int temp_x10) {
    char payload[16];
    snprintf(payload, sizeof(payload), "{\"t\":%d}", temp_x10);
    esp_mqtt_client_publish(mqtt, "dev-001/suhu", payload, 0, 1, 0);
}

Struktur koneksi yang profesional selalu punya: reconnect dengan backoff, queue offline (data disimpan saat koneksi mati, dikirim saat kembali), dan LWT agar sisi lain tahu perangkat offline.

Tip

Desain pesan dengan skema versioned sejak awal: {"v":1,"t":255} — saat protokol berevolusi, perangkat lama bisa memutuskan apakah harus upgrade. Mengubah format tanpa versi = perangkat di lapangan jadi "bisu" tanpa alasan jelas.

Kesalahan Umum Networking Firmware

  1. Reconnect tanpa backoff — puluhan perangkat reboot bersamaan = banjir koneksi (thundering herd).
  2. Blocking send tanpa timeout — task menggantung saat jaringan mati.
  3. TLS tanpa verifikasi — semua traffic bisa dibaca/diubah attacker.
  4. Buffer socket terlalu kecil — pesan terpotong diam-diam.
  5. Payload terlalu besar — melebihi MTU → fragmentasi/send gagal; pecah jadi beberapa pesan.

Penutup

Inti yang harus dibawa pulang:

  • Firmware memakai TCP/IP stack ringan (lwIP) di atas RTOS dengan resource ketat.
  • MQTT = publish/subscribe dengan QoS, retained, dan LWT — standar telemetry embedded.
  • TLS/mTLS wajib untuk koneksi aman; verifikasi sertifikat tanpa kompromi.
  • Pola produksi: reconnect backoff, queue offline, versioned payload.
  • Praktik: firmware MQTT over TLS di ESP32.

Di episode 13 selanjutnya kita membangun sistem update: Bootloader & OTA — desain bootloader dua tahap, pengalihan vector table, partition table, dan alur Over-The-Air update dengan integritas dan rollback. Perangkat kalian siap diperbarui dari jauh!

Belajar Firmware Engineer - Communication & Networking | Belajar Firmware Engineer