Mengapa Gateway IoT Kami Menggunakan Go
Gateway Go dalam satu berkas: kompilasi ARM, penyimpanan lokal, pembaruan jarak jauh, dan tanggung jawab keamanan yang tetap perlu dijadwalkan.
Untuk Tim Teknis

Daftar isi
Gateway adalah perangkat penghubung sensor dan MCB di lokasi dengan server Anda. Perangkat ini biasanya bekerja bertahun-tahun dengan perangkat keras murah dan jarang diperiksa langsung. Go cocok karena programnya dapat dikemas menjadi satu berkas biner, tanpa memasang lingkungan eksekusi terpisah. Program dapat dikompilasi untuk ARM dari laptop dengan ukuran sekitar 10 MB. Namun, Anda tetap perlu membangun ulang program untuk memasukkan pembaruan keamanan.
Kemudahan penerapan itu perlu disertai jadwal pemeliharaan. Artikel ini membahas pekerjaan lapangan yang dipermudah Go, sekaligus tanggung jawab pembaruan yang tetap harus ditangani tim.
Pekerjaan harian gateway
Gateway menjalankan empat pekerjaan berulang: membaca perangkat melalui RS485, Modbus, MQTT, atau protokol TCP vendor; menyimpan data lokal saat internet putus; mengirimnya ketika koneksi pulih; serta menerima perintah dan melaporkan hasilnya. Untuk perintah mematikan MCB, misalnya, laporan harus membedakan penerimaan perintah dari perubahan kondisi MCB.
Pekerjaan itu biasanya ringan dari sisi komputasi, tetapi kondisi lokasi menyulitkan pemeliharaan. Perangkat berada di ruang panel atau di atas plafon, dengan listrik yang naik-turun dan koneksi modem 4G yang lemah. Perangkat bisa berbulan-bulan tidak diperiksa. Saat terjadi gangguan, perbaikan jarak jauh tetap bergantung pada koneksi yang sama.
Karena itu, gateway harus kembali bekerja setelah listrik padam, memakai sedikit memori, dan dapat diperbarui dari jauh. Programnya juga perlu berjalan tanpa komponen tambahan yang mungkin tidak tersedia di perangkat.
Mengapa satu berkas biner membantu di lapangan?
Bandingkan nasi bungkus dengan masakan yang harus dimasak di dapur orang. Program Python atau Node.js itu yang kedua. Perangkatnya harus punya interpreter yang pas, paket yang pas, pustaka sistem yang pas, baru kode Anda bisa jalan. Masing-masing bisa hilang, beda versi, atau rusak gara-gara pembaruan OS.
Program Go itu nasi bungkus. Kompiler membungkus kode Anda, pustaka, dan lingkungan eksekusinya jadi satu berkas. Salin ke kotak, jalankan. Selesai, tidak ada yang perlu dipasang lagi.
Angkanya kami ukur dari alat yang kami bangun: pengendali untuk satu keluarga MCB
pintar. Di dalam satu berkas itu ada klien MQTT, mesin basis data SQLite,
server HTTP, dan dasbor web untuk teknisi. Dikompilasi dengan
CGO_ENABLED=0 lalu dibuang informasi debug, ukurannya 10,5 MB untuk ARM 64-bit dan
10,7 MB untuk ARMv7 32-bit. Perintah file menyebutnya "statically linked":
tidak ada satu pun pustaka bersama di perangkat yang ikut dipakai.
Ini bukan kekhawatiran di atas kertas. Node.js 20 sudah berhenti didukung per 30 April 2026. Perangkat yang dikirim dengan Node 20 sekarang hanya punya dua pilihan: lingkungan eksekusinya diperbarui di lapangan dan semua paket dites ulang, atau jalan terus tanpa perbaikan. Berkas biner Go membawa lingkungan eksekusinya sendiri. Versi lingkungan eksekusinya tidak berubah terpisah dari aplikasi. Perbaikan keamanan tetap memerlukan kompilasi dan penerapan ulang.
Mengompilasi program ARM dari laptop
Istilahnya cross-compile: membuat program untuk jenis chip yang berbeda dari chip komputer yang sedang Anda gunakan. Di Go, cukup variabel lingkungan untuk sistem operasi dan arsitektur chip:
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -trimpath -ldflags="-s -w" -o dist/gw-arm64 .
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -trimpath -ldflags="-s -w" -o dist/gw-armv7 .
Go 1.26 mengenal 47 kombinasi sistem operasi dan chip lewat
go tool dist list. Tiga belas di antaranya untuk Linux saja, termasuk ARM,
MIPS yang banyak dipakai di router, dan RISC-V. Kompilasi pengendali MCB tadi
memerlukan 7 sampai 14 detik di laptop biasa. Tanpa papan ARM, tanpa emulator,
tanpa image Docker.
Kapan kompilasi lintas arsitektur menjadi sulit?
Saat ada cgo, jembatan yang membuat kode Go bisa memanggil kode C. Dokumentasi cgo menyebutnya terang-terangan: cgo mati secara bawaan saat cross-compile. Begitu satu dependensi butuh C, Anda perlu compiler C untuk tiap chip tujuan. Build yang tadinya mudah langsung hilang.
Saya menemui perbedaan ini pada agen eksekusi jarak jauh yang kami rilis. Kode dasarnya sama, tetapi kebutuhan kompilasi versi desktop dan versi tanpa antarmuka berbeda.
Aturan kami untuk apa pun yang jalan di gateway: hanya pustaka pure Go.
modernc.org/sqlite untuk SQLite, bukan driver yang berbasis C. Eclipse
Paho untuk MQTT. Pustaka standar untuk HTTP. Lalu tetapkan CGO_ENABLED=0 di
CI, alur kompilasi otomatis Anda. Kalau ada dependensi yang diam-diam menyelipkan C, kompilasi gagal di CI sehingga masalah dapat ditangani sebelum program diterapkan.
Seperti apa isi gateway yang ditulis dengan Go?
Tiap koneksi perangkat dapat satu goroutine, semacam pekerja ringan yang hanya makan beberapa kilobyte. Gateway bisa menjalankan ratusan goroutine tanpa pusing soal thread. Kalau satu meter macet, pekerjanya yang menunggu. Yang lain tetap membaca.
Dua kebiasaan rancangan berikut sama pentingnya dengan pilihan bahasa.
Anggap setiap perintah bisa hilang. Gateway MCB yang kami integrasikan
mengirim perintah dengan MQTT QoS 0, artinya lempar lalu lupakan: kalau
gateway sedang offline, perintahnya lenyap begitu saja. Pengendali kami
menunggu balasan 15 detik, lalu menandai perintah itu gagal. Pengendali juga
memantau laporan status dari MCB-nya sendiri. Gateway menjawab "OK" dan
relay benar-benar bergerak itu dua kejadian yang berbeda. Timeout lewat
context di Go membuat pola ini pendek ditulis. Namun keputusan untuk
menulisnya tetap di tangan Anda.
Simpan dulu, baru kirim. Data masuk ke basis data lokal lebih dulu, baru berangkat dari sana. Saat koneksi ke server putus, pengiriman tertunda selama buffer lokal masih cukup dan media penyimpanannya utuh. Seberapa besar buffer-nya, ada di daftar pemeriksaan titik gagal tunggal untuk gateway.
Paket embed di Go juga memasukkan HTML halaman teknisi ke dalam berkas biner.
Halaman itu ikut terkirim dan ikut diperbarui bersama programnya. Dengan begitu, halaman dan program diterapkan dalam versi yang sama.
Memperbarui gateway yang berjarak 500 km
Dengan satu berkas biner, pembaruan cukup tukar berkas:
- Unduh berkas biner baru ke berkas sementara di disk yang sama.
- Cocokkan checksum SHA-256-nya, semacam sidik jari berkas, dengan nilai yang diterbitkan melalui jalur yang dipercaya. Verifikasi tanda tangan paket atau manifest; checksum saja tidak membuktikan asal berkas jika berkas dan nilainya sama-sama dapat diganti penyerang.
- Salin berkas biner yang sedang jalan ke
gw.prev, lalu rename berkas baru menimpa yang lama. Rename di filesystem yang sama itu atomic: kotaknya melihat berkas lama atau berkas baru, tidak pernah setengah-setengah. - Restart service-nya. Di systemd, pengelola service bawaan Linux, ini satu baris.
- Kalau berkas biner baru gagal health check (tes otomatis "saya masih sehat?") dalam beberapa menit, rename
gw.prevkembali lalu restart lagi.
Tanam nomor versi ke dalam berkas biner saat kompilasi lewat
-ldflags "-X main.version=1.4.2". Dengan begitu gw --version langsung
menjawab versi apa yang sedang jalan di lapangan. Berkas unduhan cukup ditulis
sekali, jangan ditulis ulang terus. Storage murah di kotak seperti ini
aus karena penulisan data.
Tanggung jawab yang tetap perlu ditangani tim
Perbaikan keamanan jadi tanggung jawab Anda. Di server biasa, celah di OpenSSL atau Python diperbarui melalui pengelola paket OS. Berkas biner Go yang statis membawa salinan runtime dan pustakanya sendiri. Celahnya tetap ada sampai Anda membangun dan menerapkannya ulang.
Kebijakan rilis Go hanya mendukung tiap versi mayor sampai muncul dua versi yang lebih baru. Go 1.27 rilis 19 Agustus 2026, dan di hari yang sama Go 1.25 mendapat perbaikan terakhirnya, 1.25.14. Gateway yang dikompilasi dengan Go 1.25 pada tahun 2025 dan tidak pernah dibangun ulang sudah di luar dukungan sejak tanggal itu.
Tangani risiko ini melalui jadwal pemeliharaan. Bangun ulang program setiap ada rilis minor Go, jalankan govulncheck—pemindai celah resmi tim Go—di CI, lalu kirim pembaruan melalui prosedur di atas. Jika prosedurnya sulit dijalankan, perbaiki jalur pembaruan lebih dahulu.
Mikrokontroler itu dunia lain. Berkas biner 10 MB mengandaikan kotak kelas Linux: PC industri, router, board sekelas Raspberry Pi. Chip di dalam sensornya sendiri tetap menggunakan C atau SDK dari vendornya.
Tim tetap harus bisa membacanya. Go mudah dipelajari. Namun gateway yang ditulis dalam bahasa yang tidak dikuasai siapa pun di tim akan jadi sistem yang dihindari semua orang. Soal bahasa sebaiknya diputuskan bersama pilihan stack lainnya, bukan sendirian.
Kapan Python atau Node masih pilihan yang tepat?
Kalau gateway-nya kebanyakan menjalankan model machine learning, pustaka Python menang telak, dan lingkungan eksekusinya harga yang pantas dibayar. Kalau vendor hanya menyediakan SDK Python, membungkusnya lebih murah daripada menulis ulang. Untuk pilot dua minggu di satu lokasi, gunakan apa saja yang paling cepat mengalirkan data.
Pertimbangkan Go ketika jumlah gateway bertambah atau kunjungan ke lokasi mulai membebani biaya operasional. Bandingkan biaya pemeliharaan dengan manfaat memakai bahasa yang sudah dikuasai tim.
Daftar pemeriksaan kompilasi gateway
CGO_ENABLED=0di CI, supaya dependensi C menggagalkan build, bukan perangkat.- Satu hasil kompilasi per chip tujuan (
arm,arm64,amd64) dari commit yang sama. - Nomor versi tertanam di berkas biner dan dilaporkan ke server setiap kali terhubung.
- Pembaruan dengan verifikasi checksum dan tanda tangan, penggantian berkas, serta mulai ulang; simpan berkas biner lama.
- Setiap perintah punya timeout dan hasil yang tercatat.
- Data disimpan sementara di perangkat sebelum dikirim.
- Bangun ulang tiap rilis minor Go, dengan
govulncheckdi pipeline.
Apa yang perlu diminta sebelum membeli gateway?
Minta daftar chip yang didukung, hasil uji saat listrik dan internet putus, serta prosedur kembali ke versi lama setelah pembaruan gagal. Sepakati siapa yang membangun ulang perangkat lunak saat perbaikan keamanan terbit. Berkas biner yang kecil membantu pengiriman; bukti pemulihan dan masa dukungan menentukan biaya operasionalnya.
Artikel Terkait
Perlu bantuan menerapkan solusi ini?
Pengembangan Sistem Pemantauan Perangkat IoT
Satukan data meter, sensor, dan perangkat lain dalam satu dasbor. Pantau pembacaan terbaru, riwayat data, dan gangguan sesuai kebutuhan operasional.
Lihat layanan terkaitCeritakan kendala operasional Anda agar kita dapat membahas langkah yang sesuai.