Case study
lib-osmo-ble: DJI Osmo Pocket 3 Bluetooth LE protocol library
Reconstructs the DUML-over-BLE protocol that DJI's Mimo app uses with the Osmo Pocket 3 camera as a Node.js library and CLI for scanning, pairing, gimbal commands and roughly 20 Hz position telemetry without the vendor app. The author reports working from a third party's Wireshark captures and dissector of Mimo traffic, a Go client and trial-and-error debugging; PROTOCOL.md documents the frame layout, CRC parameters, BLE characteristic roles and command IDs. A write-up and bundled patch trace seven bugs that kept the earlier node-osmo library from working with the camera, and the author reports that the patched library completed pairing, Wi-Fi setup and RTMP streaming.
- Targets
- Protocol
- Category
- Independent reconstruction cases
- Relationship
- Independent reconstruction project
- Sources reviewed
Requirements & limits
- Reviewed at the 2026-02-21 main head, which is also the last push; package.json declares 1.0.0, and there are no releases or tags. The README says gimbal motor commands are built and parsed correctly but the camera silently ignores them over BLE alone, probably until Wi-Fi streaming is active, while telemetry works. The library itself implements pairing, gimbal control and telemetry only; Wi-Fi setup and streaming were reached with the patched node-osmo.
- Requires the user's own DJI Osmo Pocket 3 and a Bluetooth LE host. PROTOCOL.md reports verification on that model only, from macOS, and the patch notes list Apple Silicon macOS Sequoia, Node.js v25.5.0 and @stoprocent/noble 1.18.2; other DJI devices may differ. Pairing sends a client-chosen PIN (love by default in the CLI) that the user approves on the camera. No DJI firmware, app files or the author's own captures are committed.
- Plain Node.js ES modules with two runtime dependencies, @stoprocent/noble ^2.3.10 for BLE and crc-full for the CRC8/CRC16 checks, and no build step; npm link installs the dji-osmo CLI. Diagnostic scripts scan for DJI devices, list characteristic properties and decode and CRC-check DUML hex messages. The node-osmo patch applies with git am to a separate clone of datagutt/node-osmo and builds with pnpm and TypeScript.
- There are no automated tests; the npm test script is a placeholder that exits with an error. Evidence is the author's write-up, analysis notes on characteristic mapping, byte order, the Node.js buffer-pool bug and a false-positive run, and an experiment index whose raw logs are gitignored. Device behavior remains author-reported here; nothing was run against hardware.
- LICENSE is MIT, although package.json still says ISC. The reference folder copies the CC0-1.0 Wireshark dissector and message notes from xaionaro/reverse-engineering-dji, and node-osmo is MIT. DJI firmware, apps and trademarks keep their own rights; the reviewed sources establish no AI or REA use.
About this entry
The description was reviewed against primary sources. This does not establish runtime testing, security auditing or verified compatibility.
Primary sources
- README.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- PROTOCOL.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- JOURNEY.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- patches/README.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- experiments/README.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- analysis/ble-characteristic-mapping.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- analysis/false-positive-analysis.md GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- src/connection.mjs GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- src/controllers/gimbal.mjs GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- src/protocol/constants.mjs GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- package.json GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- reference GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- LICENSE GitHub · yigitkonur/lib-osmo-ble · Revision 021e96c
- LICENSE GitHub · xaionaro/reverse-engineering-dji · Revision 5c9278f
- LICENSE GitHub · datagutt/node-osmo · Revision cec92ae