Build1 publisher3 min readPublished
MiBee Eye makes a spare Linux board announce itself to an ONVIF recorder as an ordinary camera
The project ships Go and Rust builds behind the same Device, Media and Imaging SOAP surface plus WS-Discovery multicast, and the object detection that rides on its frame hub needs a compile-time flag plus two files the tarball does not include.
The Engineer · Build desk

What happened
- Capture and H.264 encode run once into a single encoded frame hub, which feeds RTSP on port 8554, the local recorder and a web UI on port 8088.
- Object detection is compile-time opt-in and runs on the board or not at all, with nothing uploaded and no cloud inference in the path.
- An optional GB/T 28181 path adds SIP registration with digest auth, catalog and device-info queries, and PS streams for live, playback and download.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- capability A site already running an ONVIF VMS can add a camera without buying a vendor account or a cloud path, because the board arrives on the network as a discovered device after two commands and a systemd unit.
- cost Detection is per-board integration work: somebody compiles with the flag and stages the ONNX runtime library and a model file on every unit that needs boxes.
- exposure Opening the runtime upload gate lets whoever can reach the API hand a file to the inference engine, so the closed default is the setting an operator has to keep closed.
- decision With the protocol surface identical in both builds, the Go-or-Rust call is decided by binary size, OSD burn-in, cross-compile effort and whether browsers need HLS.
The design decision worth copying is the frame hub. Capture and H.264 encode run once, and RTSP on port 8554, the local recorder and the web UI on 8088 all subscribe to the same encoded output [5]. Detection is another subscriber on that hub, and the project says a slow model, or a model that will not load, leaves streaming unaffected [6]. The two builds reach the model by different routes. The Rust build reads the shared pre-encode YUV buffer, so inference never touches capture or encoding; the Go build subscribes to the encoded hub and decodes keyframes to feed the model [8].
The integration claim is that against an ONVIF NVR the board looks like an ordinary camera [4]. Three SOAP services carry it, Device, Media and Imaging, alongside WS-Discovery multicast announcements that spare an operator typing an address [4]. For that to hold on a given network, the recorder has to receive those announcements. The project also says NVRs cannot tell the Go and Rust builds apart, and the stated basis is the same protocols, the same web API and the same SPEC v1 JSON envelope in both codebases [16]. That transfers if your recorder exercises nothing outside that surface. The writeup leaves out the recorders it was tested against and any frame rate or CPU figures for the software encode path [5].
Detection has three preconditions before it returns a single box: a build made with the compile-time flag, libonnxruntime.so present on the board, and the model file [21]. The release tarball includes neither the library nor the model, and the project calls detection "a setup step, not a checkbox" [12]. The model is NanoDet-Plus-m 320 in ONNX form under Apache-2.0, with a small registry that hot-swaps between 320 and 416 variants and a YOLOX-nano decoder for a different family [9].
Failure behaviour is stated plainly. With the runtime library or the model missing, the capability reports ai:false, the API says so, and it never returns fabricated boxes [11]. A client that reads the capability field can distinguish a broken detector from an empty scene; a client that reads only the box array sees the same empty list either way.
Runtime model upload exists and is off by default behind an explicit config gate, because a model file is untrusted input to an inference engine [10]. A closed default is the right one here, and the gate keeps an upload endpoint from being an arbitrary-file path into the inference runtime.
For installations that integrate with a Chinese standards-based video platform, the optional GB/T 28181 path does SIP registration over UDP or TCP with digest auth, catalog and device-info queries, PS streams for live, playback and download, and SIP INFO playback control [14]. That playback reads the same local recordings the device already writes: H.264 segments on disk with an index.jsonl index, a retention setting in days and a storage cap [13]. GB 35114 A-level, with SM2 certificate registration and keyed-SM3 integrity, is a compile-time opt-in [15].
What to watch
- Whether the release tarball ever bundles libonnxruntime.so and the model, which would turn detection from a build step into a config toggle.
- Whether the model-upload gate stays closed by default as the registry gains variants beyond the 320, the 416 and YOLOX-nano.
- Whether the shared SPEC v1 JSON envelope holds as the two builds diverge on features like OSD burn-in and browser HLS.