# Sony Alpha Remote DK **Repository Path**: mingkjl/sony-alpha-remote-dk ## Basic Information - **Project Name**: Sony Alpha Remote DK - **Description**: 这是一个原生 nRF Connect SDK / Zephyr BLE Central + GATT Client 工程。它复现 coral/freemote 的 Sony Alpha 遥控协议行为,但不包含 Arduino、Bluefruit 或 Feather 板级依赖。 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-05 - **Last Updated**: 2026-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Sony Alpha BLE Remote for nRF54L15 DK 基于 nRF Connect SDK / Zephyr 实现的 Sony Alpha 蓝牙遥控器。工程运行在 nRF54L15 DK 上,使用 Zephyr BLE Central、GATT Client、SMP bonding 和 ZMS 持久化存储,不依赖 Arduino、Adafruit Bluefruit、FastLED 或 InputDebounce。 协议行为参考 [coral/freemote](https://github.com/coral/freemote),但代码是面向 Zephyr Bluetooth API 的原生实现,并非 Arduino 代码移植。 ## 功能 - 解析 Sony manufacturer data 和 `0x22` 相机状态字段 - 自动扫描、连接、配对、保存 bond 和断线重连 - 支持 Sony LE Legacy Just Works 配对 - 发现 Sony Remote Control Service、FF01 和 FF02 - 使用 `bt_gatt_write()` 发送带响应的遥控命令 - 订阅并解析对焦、快门和录像状态通知 - Auto Focus / Manual Focus 拍照流程 - 异常、超时或按键释放时发送快门释放命令 - GPIO 中断加 20 ms delayable work 消抖 - 使用开发板 devicetree aliases 映射按键和 LED - 全流程 Zephyr logging ## 硬件与软件环境 - Nordic nRF54L15 DK - 默认目标:`nrf54l15dk/nrf54l15/cpuapp` - nRF Connect SDK v3.3.0 - Zephyr 4.3 - 串口:DK VCOM,默认 115200 8-N-1 工程使用 secure CPU application target,不需要 TF-M,也不使用 `/ns` 目标。 ## 工程结构 ```text . ├── CMakeLists.txt ├── Kconfig ├── prj.conf ├── sample.yaml └── src ├── main.c 启动与模块初始化 ├── sony_ble.c/.h 扫描、连接、SMP、GATT discovery 和通知订阅 ├── sony_remote.c/.h 遥控命令、拍照流程和 FF02 状态解析 ├── input.c/.h 按键中断、消抖和清除 bond 手势 └── status_led.c/.h 状态 LED ``` ## 构建与烧录 在已初始化的 nRF Connect SDK west workspace 中进入本目录: ```console west build -p always -b nrf54l15dk/nrf54l15/cpuapp west flash ``` 修改 Kconfig、存储分区或切换 SDK 后,应使用 `-p always` 进行 pristine build。 生成文件通常位于: ```text build/merged.hex build/alpha_remote/zephyr/zephyr.elf ``` ## 相机设置与首次配对 不同 Sony 机型的菜单名称可能略有不同: 1. 打开相机 Bluetooth 功能。 2. 打开 `Bluetooth Remote Control`、`Bluetooth Rmt Ctrl` 或对应的蓝牙遥控选项。 3. 进入相机的遥控器配对界面。 4. 启动或复位 nRF54L15 DK。 5. 等待日志进入 `READY`。 相机开放配对时,manufacturer data 中 `0x22` 状态通常类似: ```text tag 0x22 state=0xff pairing=1 remote=1 ``` 配对完成后,相机可能广播 `0xbf`: ```text tag 0x22 state=0xbf pairing=0 remote=1 ``` 这是正常状态。新设备必须同时满足 `pairing=1` 和 `remote=1`;已经保存 bond 的 相同地址只需 `remote=1` 即可自动重连。 ## 配对兼容性 一些 Sony Alpha 相机使用 LE Legacy Just Works。NCS v3.3.0 默认只接受 LE Secure Connections,可能导致: ```text Security failed: level 1 err 4 Pairing failed (4) ``` 因此工程配置了: ```conf CONFIG_BT_SMP_SC_PAIR_ONLY=n ``` 连接仍要求 `BT_SECURITY_L2` 加密并保存 bond,但 Legacy Just Works 不提供 MITM 防护。仅应在可信环境中让相机进入配对模式。 ## BLE 状态机 ```text BOOT -> SCANNING -> CONNECTING -> SECURING -> DISCOVERING -> SUBSCRIBING -> READY ``` 连接异常时进入 `ERROR` 或 `CONNECTION_LOST`,清理临时 GATT handles,然后自动 恢复扫描。 扫描匹配条件: - manufacturer data 前四字节为 `2D 01 03 00` - tag `0x22` 的 `0x02` Remote Function Enabled 位已设置 - 新设备还需要 `0x40` Pairing Enabled 位 - 已 bonded 地址允许 Pairing Enabled 清零 ## GATT 协议 | 项目 | UUID / Handle | |---|---| | Remote Control Service | `8000ff00-ff00-ffff-ffff-ffffffffffff` | | RemoteCommand | `0xff01` | | CameraNotify | `0xff02` | FF01 使用 write with response。普通按钮命令格式为 `{0x01, command}`,带参数命令 格式为 `{0x02, command, step}`。 实现的按钮命令包括: | 操作 | 数据 | |---|---| | Shutter Half Up | `01 06` | | Shutter Half Down | `01 07` | | Shutter Full Up | `01 08` | | Shutter Full Down | `01 09` | | Record Up / Down | `01 0e` / `01 0f` | | AF-On Up / Down | `01 14` / `01 15` | | C1 Up / Down | `01 20` / `01 21` | ## 拍照流程 默认安全顺序: ```text Half Down -> Auto Focus 等待 Focus Acquired,最多 3000 ms -> Full Down -> 等待 Shutter Active,最多 500 ms -> Full Up -> Half Up ``` Manual Focus 模式跳过对焦等待。按键提前释放、写入失败、超时或断连都会中止当前 流程;只要连接仍可用,程序会尽力发送 Full Up 和 Half Up,避免相机卡在按下状态。 如需复现原 freemote 顺序,可添加: ```conf CONFIG_FREEMOTE_SEQUENCE_COMPAT=y ``` 默认不建议启用该兼容模式。 ## FF02 通知 仅处理长度为 3 且首字节为 `0x02` 的通知: | 数据 | 状态 | |---|---| | `02 3f 20` | Focus Acquired | | `02 3f 00` | Focus Lost / Ready | | `02 a0 20` | Shutter Active | | `02 a0 00` | Shutter Ready | | `02 d5 20` | Recording Started | | `02 d5 00` | Recording Stopped | 通知回调只更新状态、释放 semaphore 和更新 LED,不在 Bluetooth RX callback 中 进行长时间等待。 ## 按键 按键使用 nRF54L15 DK 的 `sw0` 至 `sw3` aliases: | 按键 | 功能 | |---|---| | `sw0` | 拍照;按下启动流程,提前释放会中止并释放快门 | | `sw1` | AF-On;按下发送 Down,释放发送 Up | | `sw2` | 切换 Auto Focus / Manual Focus | | `sw3` | 清除所有 Bluetooth bonds | 启动后的前 25 秒内长按 `sw0` 超过 10 秒,也会清除 bond。未进入 `READY` 时, 拍照与 AF-On 操作会被忽略并打印警告。 ## LED | LED | 状态 | |---|---| | `led0` 慢闪 | SCANNING | | `led0` 常亮 | READY | | `led1` 快闪 | ERROR | | `led2` 常亮 | FOCUS_ACQUIRED | | `led3` 常亮 | SHUTTER_ACTIVE | 所有 GPIO 都通过 devicetree aliases 和 `gpio_*_dt()` API 获取,应用不硬编码引脚或 active-low 极性。 ## 正常日志示例 ```text Sony manufacturer prefix matched (len 22) tag 0x22 state=0xff pairing=1 remote=1 Eligible Sony camera found: ... (new pairing) State SCANNING -> CONNECTING Connected; requesting security L2 Security established at level 2 State SECURING -> DISCOVERING Sony service handles 0x0029-0x002f Characteristic discovery started Found FF01 value handle ... Found FF02 value handle ... State DISCOVERING -> SUBSCRIBING FF02 CCC write confirmed; notifications enabled State SUBSCRIBING -> READY ``` 重启后的 bonded 重连会显示: ```text Eligible Sony camera found: ... (bonded reconnect) ``` ## 故障排查 ### `Command ... write failed (-128)` `-128` 是 `-ENOTCONN`,表示命令发生时 BLE 尚未进入 READY。当前实现会在入口处 忽略这种按键操作;若仍看到该错误,请确认烧录的是最新固件。 ### `Pairing failed (4)` 确认 `CONFIG_BT_SMP_SC_PAIR_ONLY=n` 已进入最终 `.config`,执行 pristine build, 然后同时清除 DK 和相机端旧配对记录,再重新配对。 ### 找到 Service,但找不到 FF01/FF02 日志应先出现 `Characteristic discovery started`,随后打印每个 characteristic 的 UUID、declaration handle、value handle 和 properties。若 UUID 不符合预期,请保存 完整日志以确认相机型号是否使用了不同的 GATT 数据库。 ### 相机只广播 `pairing=0` 如果 DK 中已有该地址的 bond,会自动重连;如果首次配对从未成功,需要让相机重新 进入遥控器配对界面,使其广播 `pairing=1`。 ### 清除 bond 按 `sw3`,或在启动后 25 秒内长按 `sw0` 10 秒。建议同时删除相机端对应的遥控器 记录,然后重新配对。 ## 已知限制 - Sony BLE Remote 是私有协议,不同机型或固件可能存在广播和 GATT 差异。 - 当前实现只支持一个 BLE 连接。 - 物理断链发生后 BLE 已无法发送释放命令;如相机保持异常状态,可重新连接或操作 相机本体释放。 - 本工程已在 NCS v3.3.0 下完成编译验证,实际相机兼容性仍取决于具体型号和固件。 ## License 工程源文件使用 SPDX `Apache-2.0` 标识。