Comprehensive documentation for accessing the DWARF camera streams:
- RTSP URLs and channels (ch0=tele, ch1=wide)
- The critical prerequisite: camera must be opened via WebSocket first
- ffmpeg commands for frame capture, timelapse, and video recording
- mpv and VLC usage with TCP transport
- Python/OpenCV integration example
- Troubleshooting common issues (black image, connection refused, VLC delay)
- Comparison of RTSP vs MJPEG modes across device models
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
5.5 KiB
DWARF Device Models — Feature Matrix
Reverse-engineered from DeviceType.java and CameraFeatureGate.java in
DWARFLAB.apk v3.4.0.
The APK knows 6 device models. The DeviceType enum uses WhenMappings
to dispatch per-model behavior. Mapping values (used in switch statements):
WhenMappings value |
DeviceType | deviceId |
|---|---|---|
| 1 | DWARF_MINI | 4 |
| 2 | DWARF_2 | 1 |
| 3 | DWARF_3 | 2 |
| 4 | DWARF_4 | 5 |
| 5 | DWARF_DRAGON | 6 |
| 6 | Unknown | 0 |
Feature support by model
| Feature | MINI | DWARF_2 | DWARF_3 | DWARF_4 | DRAGON |
|---|---|---|---|---|---|
isSupportAdvancedSettings |
✅ | ❌ | ❌ | ❌ | ❌ |
isSupportAutoShutdownSetting |
❌ | ✅ | ✅ | ✅ | ✅ |
isSupportNfc |
❌ | ✅ | ✅ | ✅ | ✅ |
isSupportNormalTrack |
✅ | ✅ | ❌ | ❌ | ❌ |
isSupportPanoramaCreate |
❌ | ✅ | ❌ | ✅ | ✅ |
isSupportWideNormalTrack |
❌ | ✅ | ❌ | ❌ | ❌ |
Key DWARF_MINI differences:
- No NFC, no auto-shutdown setting — the Mini is the stripped-down model.
- Only model with Advanced Settings enabled (probably lens-defog / cooling).
- Normal Track supported (single-tap tracking on main camera).
- No Wide Normal Track (the wide camera cannot track).
- No panorama create (cannot start a panorama grid scan from the app).
Field of View (degrees)
Tele camera — getTeleFovInfo (precise, used for computations)
| Model | Horizontal | Vertical |
|---|---|---|
| DWARF_MINI | 3.188 | 1.794 |
| DWARF_2 | 2.95 | 1.66 |
| DWARF_3 | 2.14 | 1.2 |
| DWARF_4 | 2.95 | 1.66 |
| DWARF_DRAGON | 2.95 | 1.66 |
Tele camera — getTeleFov (display rounded)
| Model | Horizontal | Vertical |
|---|---|---|
| DWARF_MINI | 8.0 | 6.5 |
| DWARF_2 | 7.4 | 6.0 |
| DWARF_3 | 5.37 | 4.3 |
| DWARF_4 | 4.8 | 3.8 |
| DWARF_DRAGON | 7.4 | 6.0 |
Wide camera — getWideFov
| Model | Horizontal | Vertical |
|---|---|---|
| DWARF_MINI | 8.0 | 6.5 |
| DWARF_2 | 83.43 | 51.9 |
| DWARF_3 | 83.43 | 51.9 |
| DWARF_4 | 130.0 | 86.5 |
| DWARF_DRAGON | 7.4 | 6.0 |
Note: DWARF_MINI has identical tele and wide FoV (8.0×6.5 display, 3.188×1.794 precise) — this strongly suggests the Mini has a single camera sensor (or two identical sensors), unlike the dual-cam design of the DWARF_2/3/4. The DWARF_DRAGON similarly has a narrow wide camera (7.4×6.0).
Live observation vs APK data
The connected device reports via GetDeviceState:
- Tele: h_fov=2.140, v_fov=1.200, 1920×1080
- Wide: h_fov=42.650, v_fov=24.450, 1920×1080
This matches DWARF_3 (getTeleFovInfo: 2.14×1.2), not DWARF_MINI
(3.188×1.794). The h_fov/v_fov reported by the firmware in
tele_camera_state_info reflects the physical sensor FoV at current zoom,
which can differ from the app's display values. The wide value (42.65×24.45)
is roughly half of DWARF_3's 83.43×51.9, suggesting the live stream is at
~2× digital zoom.
Conclusion: the user reports a DWARF Mini, but the firmware advertises
DWARF_3 FoV values. The Mini likely shares optics/sensor with the DWARF_3
and is differentiated by feature gating (NFC, panorama, auto-shutdown) and
industrial design rather than optics. Verify the actual device_id reported
by BLE (DwarfEcho.model.family/revision) to confirm.
Other per-model data
getDeviceNameLength— max characters for the device name (per model).getEqModelUrl— URL to the 3D EQ-alignment helper (assets/www/modules/eq/). "Bilbo" index is used for the next-gen model.getImgHomeConnectedDevice/getImgConnectingDevice/getUnconnectedLottieResId— app illustrations/animations per model.isNorth/getEqHemisphereInstruction— EQ alignment instructions differ by hemisphere (Northern/Southern).
CaptureActivity Mini-specific behavior
At line 8905 of CaptureActivity.java:
boolean z4 = num != null && num.intValue() == DeviceType.DWARF_MINI.getDeviceId();
This flag is checked when starting a Moon GoTo — the Mini (and DWARF_3/4/DRAGON) gets a confirmation dialog that the DWARF_2 does not, because only the DWARF_2 supports the older sun/moon tracking flow without extra confirmation.
Suggested implementation in dwarfctl
- Add a
DeviceTypeenum in Go matching the APK's ids (1=DWARF_2, 2=DWARF_3, 4=MINI, 5=DWARF_4, 6=DRAGON). - Read
device_idfromGetDeviceState(fieldshooting_modeis NOT it — need to find the actual device-type field, likely from BLE handshake or a dedicated state field). - Gate features client-side: warn when attempting panorama on a Mini, hide auto-shutdown, etc.
- Log the reported FoV in
healthoutput to help identify the model. - Visual odometry calibration: the Mini's wide-cam FoV is uncertain
(8.0°×6.5° display vs 42.65°×24.45° live-reported — see above). When using
dwarfctl orient, the pixel shift is always correct; to get accurate degree values, calibrate--fov-h/--fov-vby slewing a known motor angle.