This document aims to address common questions that may arise during the development process.
Note: The Demo code is for reference only. If you encounter a bug, please submit an issue with a video or photo of the reproduction process, the output logs, and detailed reproduction steps. We will address it as soon as possible. Contributions via PRs are also welcome to help with fixes and optimizations.
| Characteristic | Description |
|---|---|
| 0xFFF4 | Sent by the camera, received by the remote controller; notifications must be enabled |
| 0xFFF5 | Received by the camera, sent by the remote controller |
Reference code:
/* Define the Service/Characteristic UUIDs to filter, for search use */
#define REMOTE_TARGET_SERVICE_UUID 0xFFF0
#define REMOTE_NOTIFY_CHAR_UUID 0xFFF4
#define REMOTE_WRITE_CHAR_UUID 0xFFF5After establishing the connection, only frames starting with 0xAA need to be processed; all other broadcast packets can be ignored.
The camera can enter sleep mode either by long-pressing its power button or through remote controller operations. Long-pressing the record button on the remote controller will put the camera into sleep mode. While the camera is asleep, pressing any button will wake it up. If the record button is pressed, the camera will wake up and immediately start recording, then automatically return to sleep mode after recording is complete.
Please note the following:
- Do not send any further data to the camera once it has entered sleep mode.
- Once a sleep acknowledgment is received from the camera, it can be considered successfully asleep; the Bluetooth connection will remain active.
- During the transition into sleep mode, the camera may still send a few status frames, which can be safely ignored.
- When the camera wakes up, the Bluetooth connection will temporarily disconnect; the remote controller should automatically reconnect.
- In order to wake up a target camera via broadcast, the remote controller must have successfully connected to that camera recently.
For detailed implementation, refer to the Camera Power Mode Settings (001A) feature in the DATA Segment Documentation.
To disable the upgrade prompt, set the fw_version byte to 0 in the connection request protocol.
Note: This operation is only supported on cameras with the latest firmware.
For detailed implementation, refer to the Connection Request (0019) feature in the DATA Segment Documentation.
Supported cameras can be identified by checking specific bytes in the manufacturer field.
The logic is as follows: if bytes 0, 1, and 4 of the manufacturer field are 0xAA, 0x08, and 0xFA respectively, the camera is considered supported.
For implementation details, see the bsp_link_is_dji_camera_adv function in the ble.c file.
It is not recommended to use simulated data to construct the GPS Data Push (0017) command frame as described in the DATA Segment Documentation. Since the dashboard functionality relies on this data, using non-authentic data may result in abnormal display issues within the app.
For correctly constructed GPS command frames, refer to the test_gps.c file. In app_main.c, calling start_ble_packet_test(1) enables 1Hz cyclic data pushing for testing purposes. We will continue to improve these test datasets, and contributions of real, accurate test data are highly encouraged.
First, send a broadcast wake-up packet to wake the camera.
Once the camera is awake, simply report a single-click shutter button event.
After capturing or recording, the camera will automatically return to sleep mode.
For detailed implementation, refer to the Key Reporting (0011) feature in the DATA Segment Documentation.
- In Slow Motion mode, magnification equals frame rate divided by 30.
- In Hyperlapse mode, magnification equals the time interval.
- In Timelapse mode, there is no magnification display—only the interval time is shown.
Refer to the Camera Status Push (1D02) and New Camera Status Push (1D06) command sets in the DATA Segment Detailed Documentation, which provides detailed explanations on how parameters are displayed and mapped to frame fields under different camera modes.
Alternatively, you may refer to the DJI Osmo Action Bluetooth Remote Controller interface.
The remote controller should begin transmitting GPS data at a frequency of 10 Hz immediately after a successful connection with the camera, rather than waiting until video recording starts. Additionally, it is recommended to include an indicator light to show whether a GPS signal has been acquired.
10. What Is the Difference Between Reporting the QS Button and Using the Unified Mode Switching Command?
Reporting the QS button is equivalent to a short press of the camera’s QS button (typically the power button). The target shooting mode is determined by the camera’s internal configuration, and the remote controller does not need to specify the mode—it simply sends a key report command. A single press will switch to the first mode in the quick switch list; repeated short presses will cycle through the remaining modes.
The unified mode switching command, on the other hand, allows direct switching to a specific shooting mode. This approach is more explicit and efficient, ideal for scenarios such as “one-click switch to XX mode.”
There are two approaches to implementing shoot/record control:
One approach is to use the Recording Control command (1D03). However, we recommend using the shoot/record button in the Key Reporting command (0011), which is equivalent to a short press of the camera’s shutter button. This method simplifies the logic by eliminating the need to determine the current recording state.
On the camera, pull down the menu, tap Settings, go to Wireless Connection, ensure that wireless connection is enabled, and reset the connection.
Under FFF4 NOTIFY, Osmo Action 4 and Osmo Action 5 Pro behave slightly differently: Osmo Action 5 Pro sends some frames starting with 0x55 (which can be ignored, only frames starting with 0xAA need to be parsed), whereas Osmo Action 4 does not.
It is recommended to use a Bluetooth debugging tool to monitor Osmo Action 4 -> FFF4 NOTIFY in real time, and then send commands to FFF5 for testing. The test command frames can be referenced from the connection request frames in the connect_cmd_frame.txt file, or constructed and tested using connect_cmd_frame_builder.c.