Merapi menggabungkan MQTT broker v3.1.1/v5.0, remote client, dan dashboard manajemen lengkap โ semuanya dalam satu binary portable tanpa dependensi eksternal.
Tiga komponen utama dalam satu binary: broker, remote client, dan web UI manajemen.
Mendukung MQTT v3.1.1 dan v5.0 secara bersamaan dengan session expiry (MQTT 5) yang bisa dikonfigurasi.
TCP, WebSocket, dan TLS dengan port yang bisa dikonfigurasi per transport layer.
Exactly-once delivery dengan flow control penuh. Retained messages dengan persistensi per-topik.
Hierarchical topic tree dengan dukungan wildcard + dan # serta shared subscriptions.
Username/password authentication dengan ACL per-topik: publish, subscribe, pubsub, atau deny.
Last Will Testament dengan clean & persistent sessions dan connection limit per client.
Hubungkan ke broker MQTT manapun via TCP. Cocok untuk bridge antara jaringan berbeda.
Reconnect otomatis dengan subscription restoration saat koneksi terputus.
Persistent sessions dengan clean_session=false untuk message queuing saat offline.
Subscribe dan publish dengan QoS 0/1/2 dan retain flag yang bisa dikonfigurasi.
Status broker/client, subscriptions aktif, message counters, dan quick publish โ auto-refresh setiap 3 detik.
Web UI tertanam langsung di dalam binary โ tidak perlu file eksternal, tidak perlu web server terpisah.
Theme toggle dengan preferensi persisten ke localStorage. Sidebar collapsible & resizable.
Real-time message streaming via WebSocket events langsung ke UI tanpa polling manual.
CRUD pengguna MQTT dengan enable/disable. ACL management berbasis topik per username.
Opsional PIN untuk akses Web UI. 3 kali gagal = permanent lock, perlu restart untuk reset.
Semua fungsi manajemen tersedia via HTTP API untuk integrasi dengan sistem lain.
| Method | Endpoint | Deskripsi |
|---|---|---|
| GET | /api/broker/status | Statistik broker |
| GET | /api/broker/clients | Daftar client terhubung |
| GET | /api/broker/topics | Topic tree explorer |
| GET | /api/broker/config | Ambil konfigurasi broker |
| PUT | /api/broker/config | Update konfigurasi broker |
| POST | /api/broker/start | Start broker |
| POST | /api/broker/stop | Stop broker |
| POST | /api/publish/local | Publish langsung ke broker lokal |
| GET | /api/client/status | Status koneksi client |
| POST | /api/client/connect | Hubungkan ke broker eksternal |
| POST | /api/client/disconnect | Putus koneksi remote client |
| POST | /api/client/subscribe | Subscribe ke topik |
| POST | /api/client/unsubscribe | Unsubscribe dari topik |
| POST | /api/client/publish | Publish via remote client |
| GET | /api/users | Daftar pengguna MQTT |
| POST | /api/users | Tambah pengguna baru |
| PUT | /api/users/:id | Update data pengguna |
| DELETE | /api/users/:id | Hapus pengguna |
| PUT | /api/users/:id/toggle | Aktifkan / nonaktifkan pengguna |
| GET | /api/acl | Daftar ACL rules |
| POST | /api/acl | Tambah ACL rule baru |
| DELETE | /api/acl/:id | Hapus ACL rule |
| POST | /api/verify-pin | Verifikasi PIN akses Web UI |
| GET | /api/server/info | Info host, port, dan LAN IP |
3 kali gagal = permanent lock. Reset hanya via restart binary.
Password tersimpan terenkripsi. Key file settings-merapi.key di-generate otomatis.
Kontrol akses berbasis topik: publish, subscribe, pubsub, atau deny per username.
Enkripsi end-to-end untuk koneksi MQTT dengan sertifikat kustom.
Database settings-merapi.db untuk users, ACLs, dan konfigurasi broker.
Seluruh konfigurasi dan data otomatis tersimpan dan dimuat saat binary dijalankan ulang.
Retained messages persisten per-topik, bisa diaktifkan/nonaktifkan via konfigurasi.
Pilih binary sesuai platform dari halaman Releases. Tidak perlu instalasi atau runtime tambahan.
Mode interaktif akan meminta port, bind address, dan PIN opsional.
$ ./merapi-mqttbroker-linux-amd64
$ ./merapi-mqttbroker-linux-amd64 \
--non-interactive \
--port 8082 \
--host 0.0.0.0
Akses dashboard manajemen lengkap di browser.
http://localhost:8082
| Flag | Default | Keterangan |
|---|---|---|
--port <PORT> | 8082 | Port Web UI |
--host <HOST> | 0.0.0.0 | Bind address |
--pin <PIN> | kosong | PIN akses (kosong = tanpa PIN) |
--non-interactive | โ | Jalankan tanpa prompt interaktif |
Binary siap pakai untuk semua platform populer, termasuk Android via shared library.
Clean Architecture memisahkan domain logic dari infrastruktur โ mudah diuji dan mudah dikembangkan.
src/ โโโ main.rs // CLI entry point โโโ lib.rs // Library + Android JNI โโโ bootstrap.rs // Dependency injection โ โโโ domain/ โ โโโ models.rs // Entities, value objects โ โโโ ports.rs // Port interfaces (traits) โ โโโ application/ โ โโโ services.rs // Use-case services โ โโโ infrastructure/ โโโ broker.rs // MQTT broker (custom) โโโ client.rs // Remote client (rumqttc) โโโ api.rs // Axum HTTP/WebSocket โโโ persistence.rs // SQLite repositories โโโ crypto.rs // AES-256-GCM
# Rust 1.84+ (stable)
curl --proto '=https' \
--tlsv1.2 -sSf \
https://sh.rustup.rs | sh
Tidak perlu OpenSSL atau C library eksternal โ SQLite sudah terbundel.
cargo build --release
Release build menggunakan opt-level z, LTO, panic=abort, dan stripped symbols untuk ukuran binary sekecil mungkin.
rustup target add aarch64-linux-android
cargo install cargo-ndk
cargo ndk -t arm64-v8a \
-o ../android-app/app/src/main/jniLibs \
build --release
Satu binary. Tanpa dependensi. Langsung jalan di Linux, Windows, macOS, dan Android.