Nodeflux Central
Developer Guide

Developer Guide

Panduan pengembang untuk mengintegrasikan dan menggunakan Visionaire4 API — mencakup manajemen stream, pipeline analitik, visualisasi real-time, konfigurasi platform, dan komunikasi berbasis WebSocket.

Visionaire4 menyediakan REST API dan WebSocket API yang dapat digunakan langsung oleh developer untuk membangun aplikasi berbasis analitik video. Panduan ini menjelaskan semua endpoint umum yang tidak spesifik terhadap modul analitik tertentu.

Panduan ini mencakup endpoint generik: manajemen stream, informasi sistem dan node, visualisasi MJPEG, registry analitik, smart search, konfigurasi platform/database/lisensi, serta komunikasi WebSocket (event channel, live streamer, network utilities).

Untuk endpoint spesifik modul analitik (Face Recognition, License Plate Recognition, People Analytics, Vehicle Analytics), lihat halaman Referensi API Lengkap atau navigasi ke halaman masing-masing modul di bawah.


Konsep Dasar

Sebelum menggunakan API, pahami empat entitas inti Visionaire4:

  • Node — Unit komputasi dalam cluster. Deployment single-server menggunakan node_num=0. Setiap node mengelola sumber daya GPU/CPU-nya sendiri.
  • Stream — Sumber video yang terhubung ke node (RTSP, file, USB). Setiap stream memiliki stream_id unik dan dapat menjalankan beberapa pipeline secara paralel.
  • Pipeline — Instansi modul analitik yang berjalan pada stream tertentu. Pipeline dikonfigurasi saat pembuatan dan menghasilkan event secara real-time.
  • Analytic — Modul analitik yang terinstal (misalnya NFV4-FR, NFV4-LPR3). Setiap modul memerlukan lisensi seat yang aktif.
  • Event — Hasil deteksi yang dihasilkan pipeline, dikirim via WebSocket event channel ke aplikasi yang subscribe.
memiliki banyak menjalankan banyak menghasilkan Node (node_num) Stream (stream_id) Pipeline (analytic_id) Event

Arsitektur API

Hampir seluruh endpoint Visionaire4 mengikuti pola URL hierarkis yang mencerminkan relasi entitas di atas:

/{resource}/{node_num}/{stream_id}/{analytic_id}
/{resource}/ /{resource}/{node_num}/ /{resource}/{node_num}/{stream_id}/ /{resource}/{node_num}/{stream_id}/{analytic_id}
  • node_num selalu menjadi segmen pertama setelah resource karena setiap Stream secara fisik berada pada satu Node tertentu — penempatan ini memungkinkan master me-routing operasi langsung ke worker yang tepat tanpa pencarian tambahan.
  • stream_id menjadi segmen kedua karena setiap Pipeline berjalan dalam konteks Stream tertentu. Stream tidak dapat diakses lintas-node — stream_id selalu di-scope pada node_num tempatnya dibuat.
  • analytic_id menjadi segmen terakhir karena Pipeline merupakan kombinasi unik antara Stream dan modul analitik. Satu Stream dapat menjalankan banyak Pipeline berbeda secara bersamaan, tetapi setiap pasangan (stream_id, analytic_id) hanya boleh ada satu instance.

Endpoint yang lebih luas (mis. GET /streams/, WS /event_channel/) mengabaikan segmen-segmen yang lebih dalam untuk melakukan agregasi lintas Node atau Stream.


Base URL & Otentikasi

Visionaire4 berjalan pada port 4004 secara default:

http://<host>:4004

Otentikasi: Tidak diperlukan secara default. Untuk deployment produksi, pastikan akses ke port 4004 dibatasi via firewall atau reverse proxy.

CORS: Diaktifkan secara default (--enable-cors). Semua origin diizinkan. Dapat dinonaktifkan dengan flag --disable-cors=true saat menjalankan aplikasi.


Format Respons

Respons Sukses

{
  "code": 200,
  "message": "stream successfully created",
  "ok": true,
  "stream_id": "5136c6c0916cd30c"
}

Respons Error

{
  "code": 400,
  "message": "Invalid stream_address"
}

Kode HTTP Umum

KodeDeskripsi
200Berhasil
400Request tidak valid — input salah atau resource sudah ada
403Dilarang — misalnya operasi pada node yang salah
404Resource tidak ditemukan
500Error internal server

Quick Start

Buat Stream

Tambahkan sumber video ke node 0:

curl -X POST http://localhost:4004/streams/0 \
  -H "Content-Type: application/json" \
  -d '{
    "stream_address": "rtsp://10.7.2.50:554/stream",
    "stream_name": "Camera Lobby"
  }'

Catat stream_id dari respons — Anda membutuhkannya untuk langkah berikutnya.

Buat Pipeline

Pasang modul analitik pada stream. Ganti <stream_id> dengan nilai dari langkah sebelumnya:

curl -X POST http://localhost:4004/pipeline/0/<stream_id>/NFV4-FR \
  -H "Content-Type: application/json" \
  -d '{"mode": 0}'
curl -X POST http://localhost:4004/pipeline/0/<stream_id>/NFV4-LPR3 \
  -H "Content-Type: application/json" \
  -d '{}'
curl -X POST http://localhost:4004/pipeline/0/<stream_id>/NFV4-MPA \
  -H "Content-Type: application/json" \
  -d '{}'

Subscribe Event Channel via WebSocket

Buka koneksi WebSocket untuk menerima event real-time:

const ws = new WebSocket('ws://localhost:4004/event_channel/0/<stream_id>');

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Event diterima:', data.analytic_id, data.primary_text);
};

Atau gunakan wscat untuk testing cepat:

wscat -c ws://localhost:4004/event_channel/

Lihat MJPEG Live Stream

Buka URL berikut di browser atau gunakan sebagai src pada tag <img>:

http://localhost:4004/mjpeg/0/<stream_id>/NFV4-FR?fps=15&height=480

Atau embed dalam HTML:

<img src="http://localhost:4004/mjpeg/0/<stream_id>/NFV4-FR?fps=15&height=480"
     alt="Live Stream" />

Lifecycle Pipeline

Pipeline memiliki siklus hidup yang dimulai saat Anda mem-POST endpoint pipeline dan berakhir saat Anda mem-DELETE endpoint yang sama. Diagram berikut menunjukkan urutan event utama dari sisi master, slave, dan klien:

POST /pipeline/{node_num}/{stream_id}/{analytic_id} spawn pipeline (config) request seat seat granted pipeline running, frame mengalir Event terkirim via WebSocket DELETE /pipeline/{node_num}/{stream_id}/{analytic_id} terminate pipeline release seat koneksi event dihentikan Event mengalir terus selama pipeline aktif Aplikasi Klien Master Node Slave Node License Manager

Saat Pipeline dibuat, master menyimpan konfigurasinya, men-dispatch perintah spawn ke node tujuan, dan meminta seat lisensi atas nama Pipeline. Bila lisensi tidak tersedia, Pipeline akan masuk state error dan tidak menghasilkan Event sampai seat tersedia kembali.

Selama Pipeline aktif, frame dari Stream didistribusikan ke Pipeline pada setiap iterasi loop — Pipeline memproses frame, menjalankan inferensi AI, dan menghasilkan Event saat kondisi deteksi terpenuhi. Event di-broadcast ke semua klien WebSocket yang sedang berlangganan endpoint event channel yang relevan, dan dipersistensi ke database internal. Saat Anda menghapus Pipeline, seat lisensi dilepaskan dan koneksi event terkait diakhiri secara graceful.


Event Channel (WebSocket)

Event channel adalah antarmuka utama untuk menerima hasil analitik secara real-time. Tersedia dalam tiga level granularitas:

EndpointDeskripsi
WS /event_channel/Semua event dari semua node
WS /event_channel/{node_num}/Event dari node tertentu
WS /event_channel/{node_num}/{stream_id}Event dari stream tertentu
WS /event_channel/{node_num}/{stream_id}/{analytic_id}Event dari pipeline tertentu

Parameter Query

  • ?logic=<logic_name> — Filter event berdasarkan nama aturan logika. Daftar logic yang tersedia dapat dilihat via GET /rules/pipeline/{analytic_id}/.

Format Pesan Event

Setiap pesan event yang dipancarkan melalui event channel berbentuk JSON dengan struktur berikut:

{
  "timestamp": 1674123456789,
  "node_num": 0,
  "stream_id": "a1b2c3d4e5f67890",
  "stream_name": "Camera Lobby",
  "stream_address": "rtsp://10.7.2.50:554/stream",
  "stream_longitude": 106.8456,
  "stream_latitude": -6.2088,
  "analytic_id": "NFV4-FR",
  "primary_text": "John Doe",
  "secondary_text": "Employee",
  "pipeline_data": {
    "event_id": "1674123456789-1a2b3c4d",
    "confidence": 0.95,
    "face_id": "face_abc"
  },
  "image_jpeg": "base64EncodedJpegString..."
}

Field Top-Level

FieldTipeDeskripsi
timestampuint64Waktu kemunculan event dalam milidetik epoch (UTC).
node_numintNomor Node tempat Pipeline berjalan.
stream_idstringIdentifier Stream yang menjadi sumber event.
stream_namestringNama Stream yang dapat dibaca manusia.
stream_addressstringURL atau path sumber video Stream.
stream_longitudefloatLongitude lokasi kamera (derajat desimal).
stream_latitudefloatLatitude lokasi kamera (derajat desimal).
analytic_idstringIdentifier modul analitik yang menghasilkan event (mis. NFV4-FR).
primary_textstringHasil utama deteksi (mis. nama orang atau plat nomor).
secondary_textstringInformasi pendukung (mis. kategori, label tambahan).
pipeline_dataobjectData analitik tambahan spesifik modul. Selalu memuat event_id.
image_jpegstring (base64)Crop JPEG yang relevan dengan event, di-encode base64.

pipeline_data.event_id berbentuk "<timestamp>-<hash8>" dan dijamin unik per kombinasi (timestamp, primary_text, secondary_text, pipeline_data, stream_id, analytic_id).

Konten pipeline_data berbeda untuk setiap modul analitik. Untuk struktur detail per modul, lihat halaman API masing-masing modul di bagian bawah panduan ini.


Live Stream (WebSocket fMP4)

Untuk konsumsi video di browser modern menggunakan Media Source Extensions (MSE):

EndpointDeskripsi
WS /livestreamer/{node_num}/{stream_id}/fMP4 stream tanpa overlay
WS /livestreamer/{node_num}/{stream_id}/{analytic_id}fMP4 stream dengan overlay analitik

Server mengirimkan fragmen fMP4 (fragmented MP4) secara berurutan via WebSocket. Klien browser menyuap data ini ke MediaSource API untuk playback real-time dengan latensi rendah.

WS /mp1streamer/... adalah endpoint lama — gunakan /livestreamer/ untuk deployment baru.


Network Utilities (WebSocket)

Endpoint WebSocket untuk mendiagnosis konektivitas sumber stream. Semua endpoint mengambil node_num dan stream_id dari stream yang sudah terdaftar.

EndpointDeskripsi
WS /netutils/ping/{node_num}/{stream_id}Ping ke host sumber stream
WS /netutils/ffprobe/{node_num}/{stream_id}Jalankan FFprobe pada URL stream untuk inspeksi codec dan metadata
WS /netutils/port/{node_num}/{stream_id}Cek ketersediaan port pada host sumber stream
WS /netutils/traceroute/{node_num}/{stream_id}Traceroute ke host sumber stream

Server mengirimkan output utilitas secara streaming — setiap baris output dikirim sebagai pesan WebSocket terpisah. Koneksi ditutup otomatis saat operasi selesai.

Contoh — ping stream:

const ws = new WebSocket('ws://localhost:4004/netutils/ping/0/5136c6c0916cd30c');
ws.onmessage = (e) => console.log(e.data);
// Output: "PING 10.7.2.50: 56 data bytes"
// Output: "64 bytes from 10.7.2.50: icmp_seq=0 ttl=64 time=0.5 ms"
// ...

Modul Analitik

Setiap modul analitik memiliki halaman dokumentasi lengkap dengan endpoint pipeline spesifik, parameter konfigurasi, dan format event:


Referensi API Lengkap

On this page