{
  "added_at": "2026-11-02",
  "additional_evidence_urls": [
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/PROTOCOL.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/JOURNEY.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/patches/README.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/experiments/README.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/analysis/ble-characteristic-mapping.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/analysis/false-positive-analysis.md",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/src/connection.mjs",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/src/controllers/gimbal.mjs",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/src/protocol/constants.mjs",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/package.json",
    "https://github.com/yigitkonur/lib-osmo-ble/tree/021e96c2bec7e9a2a81296292545bc1ee432af49/reference",
    "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/LICENSE",
    "https://github.com/xaionaro/reverse-engineering-dji/blob/5c9278ff0b53bbe0d03ea6c830aab13ac775871e/LICENSE",
    "https://github.com/datagutt/node-osmo/blob/cec92aec9304a5cc3dae7f7de541eef38ebb680e/LICENSE"
  ],
  "category": "reconstruction-cases",
  "description_en": "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.",
  "description_zh": "重建 DJI Mimo 应用与 Osmo Pocket 3 相机之间基于 BLE 的 DUML 协议，提供 Node.js 库和命令行工具，无需官方应用即可扫描、配对、发送云台指令并接收约 20 Hz 的姿态遥测。作者称其依据第三方对 Mimo 通信的 Wireshark 抓包与解析器、一个 Go 客户端以及反复试验调试完成；PROTOCOL.md 记录了帧结构、CRC 参数、BLE 特征值的用途和命令 ID。一篇过程记录和随附补丁梳理了导致早期 node-osmo 库无法配合该相机工作的七个缺陷，作者报告打过补丁的库完成了配对、Wi-Fi 设置和 RTMP 推流。",
  "entry_url": "https://awesomerea.org/resources/osmo-pocket-3-ble-protocol-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/osmo-pocket-3-ble-protocol-case/",
  "evidence_url": "https://github.com/yigitkonur/lib-osmo-ble/blob/021e96c2bec7e9a2a81296292545bc1ee432af49/README.md",
  "group": "cases",
  "id": "osmo-pocket-3-ble-protocol-case",
  "json_url": "https://awesomerea.org/resources/osmo-pocket-3-ble-protocol-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/osmo-pocket-3-ble-protocol-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/osmo-pocket-3-ble-protocol-case/index.md",
  "name": "lib-osmo-ble: DJI Osmo Pocket 3 Bluetooth LE protocol library",
  "name_zh": "lib-osmo-ble：DJI Osmo Pocket 3 低功耗蓝牙协议库",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "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.",
    "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."
  ],
  "requirements_zh": [
    "审阅对象为 2026-02-21 的 main 最新提交，也是仓库最近一次推送；package.json 声明版本 1.0.0，没有发布版本或标签。README 称云台电机指令的构造和解析都正确，但仅通过 BLE 发送时相机会静默忽略，可能要等 Wi-Fi 推流启动后才生效，而遥测工作正常。该库本身只实现配对、云台控制和遥测；Wi-Fi 设置和推流是借助打过补丁的 node-osmo 实现的。",
    "需要使用者自有的 DJI Osmo Pocket 3 及支持低功耗蓝牙的主机。PROTOCOL.md 报告仅在该型号上、从 macOS 验证过，补丁说明列出的环境为 Apple 芯片 macOS Sequoia、Node.js v25.5.0 和 @stoprocent/noble 1.18.2；其他 DJI 设备可能有所不同。配对时发送由客户端选定的 PIN（命令行默认 love），需用户在相机上确认。仓库未提交 DJI 固件、应用文件或作者自己的抓包。",
    "使用纯 Node.js ES 模块，运行时依赖只有两个：用于 BLE 的 @stoprocent/noble ^2.3.10 和用于 CRC8／CRC16 校验的 crc-full，无需构建；npm link 可安装 dji-osmo 命令行工具。诊断脚本可扫描 DJI 设备、列出特征值属性，并解码 DUML 十六进制报文、校验 CRC。node-osmo 补丁需用 git am 应用到另行克隆的 datagutt/node-osmo，再用 pnpm 和 TypeScript 构建。",
    "没有自动化测试；npm test 脚本只是一个以报错退出的占位命令。证据包括作者的过程记录，关于特征值映射、字节序、Node.js 缓冲池缺陷和一次误判运行的分析笔记，以及原始日志已被 gitignore 排除的实验索引。设备上的行为仍属作者报告。",
    "LICENSE 为 MIT，但 package.json 仍写作 ISC。reference 目录复制了 xaionaro/reverse-engineering-dji 中采用 CC0-1.0 的 Wireshark 解析器和报文笔记，node-osmo 采用 MIT。DJI 固件、应用和商标保留各自权利。"
  ],
  "targets": [
    "protocol"
  ],
  "url": "https://github.com/yigitkonur/lib-osmo-ble",
  "verification": "source-reviewed",
  "verified_at": "2026-10-27"
}
