Broadcast (Gambar & GPS)
Menyiarkan snapshot gambar dan koordinat GPS dari perangkat bergerak ke banyak penonton lewat WebSocket, tanpa encoder video.
Pengenalan
Tidak semua sumber bisa (atau perlu) mengirim video kontinu. Body-cam, ponsel petugas, atau drone di jaringan seluler yang lemah lebih cocok mengirim snapshot JPEG berkala plus posisi GPS. Fitur Broadcast menerima keduanya lewat HTTP biasa dan meneruskannya seketika ke semua klien WebSocket yang berlangganan channel yang sama. Aktifkan dengan --broadcast-on (ENABLE_BROADCAST=true).
Tidak ada penyimpanan: pesan yang tidak ada penerimanya dibuang, dan request tetap dijawab sukses. Ini fitur fan-out real-time, bukan arsip.
Format pesan kompatibel dengan layanan lama mobile-hub. Endpoint natif berada di port 9080; port 9994 hanya ada pada image yang masih menyertakan sidecar mobile-hub untuk kompatibilitas mundur (tidak dibangun secara default).
Cara Menggunakan
Berlangganan sebagai penonton
Channel penuh adalah {channel}/{stream_id}, misalnya live/mobile/unit_07:
const ws = new WebSocket("ws://<host-liodra>:9080/ws/v1/broadcast/receives/live/mobile/unit_07");
ws.binaryType = "blob";
ws.onmessage = (event) => {
if (event.data instanceof Blob) {
img.src = URL.createObjectURL(event.data); // frame JPEG/PNG
return;
}
const msg = JSON.parse(event.data);
if (msg.type === "welcome") console.log("connected", msg.data.client_id);
else if (msg.lat !== undefined) updateMap(msg.lat, msg.long, msg.timestamp); // GPS
};Kirim gambar dari perangkat
curl -X POST http://<host-liodra>:9080/api/v1/broadcast/img/live/mobile \
-F "[email protected]" \
-F "stream_id=unit_07" \
-F "timestamp=2026-09-15T10:30:00Z"channel pada path boleh bertingkat (live, live/mobile, live/drone); stream_id di form melengkapinya menjadi channel penuh.
Kirim posisi GPS
curl -X POST http://<host-liodra>:9080/api/v1/broadcast/gps/live/mobile \
-H 'Content-Type: application/json' \
-d '{ "lat": "-6.200000", "long": "106.816666", "stream_id": "unit_07", "timestamp": "2026-09-15T10:30:00Z" }'Pantau channel aktif
curl http://<host-liodra>:9080/api/v1/broadcast/status/live/mobile # channel dengan prefix live/mobile
curl http://<host-liodra>:9080/api/v1/broadcast/status/ # semua channelRespons menyebut active_streams, total_clients (selalu global), dan per channel client_count, created_at, last_activity.
Fitur Utama
Tiga jenis pesan di satu koneksi
| Pesan | Format | Kapan |
|---|---|---|
| Welcome | JSON { type: "welcome", data: { client_id, stream_id, message }, timestamp } | Sekali saat terhubung |
| Gambar | Frame biner mentah (JPEG/PNG apa adanya, maks. 10 MB) | Setiap POST /broadcast/img |
| GPS | JSON datar { lat, long, stream_id, timestamp } | Setiap POST /broadcast/gps |
Gambar dikirim sebagai frame biner, bukan base64, sehingga overhead minimal dan browser bisa langsung memakainya sebagai Blob.
Channel bertingkat dan filter status
Karena channel adalah path, satu organisasi bisa memisahkan live/mobile/patroli, live/mobile/pengawas, live/drone/... dan memfilter status per prefix. Penonton selalu berlangganan channel penuh; tidak ada wildcard.
Tanpa state, tanpa disk
Channel dibuat saat klien pertama terhubung atau pesan pertama tiba, dan dihapus saat kosong. Tidak ada rekaman, antrean, atau retry. Bila perangkat mengirim ke channel tanpa penonton, request dijawab 200 tanpa pekerjaan apa pun.
Bersama fitur lain
Broadcast berjalan di proses Liodra yang sama dan tidak menyentuh jalur video, sehingga bisa digabung dengan --as-nvr dan --with-vod tanpa saling mengganggu. Perangkat yang sama boleh mem-publish RTMP (lihat Live Streaming) saat jaringan baik dan beralih ke snapshot saat jaringan lemah.
API Reference
Detail lengkap di API Reference: Broadcast.
| Method | Path | Fungsi |
|---|---|---|
POST | /api/v1/broadcast/img/{channel} | Siarkan gambar (multipart) |
POST | /api/v1/broadcast/gps/{channel} | Siarkan koordinat GPS (JSON) |
GET | /api/v1/broadcast/status/{channel} | Channel aktif dan jumlah klien |
GET | /ws/v1/broadcast/receives/{path} | WebSocket penerima |