dropchop/actionCamController

GitHub: dropchop/actionCamController

通过逆向iSmart DV2应用实现的iCatch V11运动相机Python控制库及Flask Web界面,替代官方App在Linux下完成相机WiFi控制与实时预览。

Stars: 0 | Forks: 0

# actionCamController 一款适用于 **Larkfly A6+** 运动相机的 Linux 控制器(内部 iCatch 产品代码 `V11`,固件版本 20251206),通过逆向工程分析 iSmart DV2 Android 应用及真实设备而开发。用于替代官方应用实现单相机控制,并(最终可以实现,见下文注意事项)协调多台相机同时工作。 本项目的诞生源于发现该相机使用了一种不合规范的 PTP/IP “方言”,其中包含三个未公开的怪异行为。本库将这些细节进行了封装,使得普通的 Python 客户端可以轻松驱动相机。 ## 状态 **单相机 WiFi 控制功能已可用。** 基于 `larkfly`(客户端库,包含 23 个单元测试)构建,并提供了一个 Flask web UI 用于实时预览和连拍录制。多相机控制在原则上已可行,但需要将相机接入同一共享网络 —— 有关利弊权衡请参阅 `docs/architecture.md`。 已完成的功能: - 针对相机的 PTP/IP 会话;协议层的线路格式已完成逆向工程和测试 - 枚举了全部 56 个设备属性,并在关键处进行了命名 - 通过 Flask UI 在浏览器中实现 RTSP 实时预览(约 30 fps) - 通过属性 `0xD604` 实现视频录制的开始 / 停止 / 连拍 - 通过 FTP 访问文件(`wificam` / `wificam`) - USB UVC 采集(1080p MJPEG)—— 但相机在 UVC 模式下不会同时录制到 SD 卡,因此这仅用于主机串流 遇到的问题: - 通过 PTP 进行照片拍摄 —— `InitiateCapture` 返回正常但未能生成 JPG 文件。临时替代方案:使用相机本身的物理快门按钮。 - 将多台相机连接至同一个共享 WiFi(STATION 模式)—— 相机端的协议是 Realtek SmartConfig(UDP 广播,AES 加密)。我们已经掌握了默认的 AES 密钥和多播目标地址,但编码算法仍需进一步研究。请参阅 `docs/findings.md`。 ## 安装 ``` git clone https://github.com/dropchop/actionCamController.git cd actionCamController # 仅 Library(核心为纯 stdlib): pip install -e . # Library + web UI 依赖: pip install -e '.[webui]' # Library + capture-tool 依赖(用于 pcap 解密的 cryptography): pip install -e '.[capture]' # 全部: pip install -e '.[all]' ``` 运行环境要求 Python 3.10+。 ## 快速开始 ``` # 与位于 192.168.1.1(出厂默认)的相机进行通信。 # `bind` 是本地源 IP —— 仅当有多个接口 # 共享 192.168.1.0/24 子网时才需要。 from larkfly import Camera with Camera('192.168.1.1', bind='192.168.1.10') as cam: info = cam.device_info() print(info['operations_supported']) # Read a property print(cam.get_prop_value(0x501E)) # 'V11' — ProductName print(cam.get_prop_value(0x501F)) # '20251206' — FwVersion # Record video for 3 seconds (mode-toggle paradigm) cam.start_recording() # sets D604=17 (VIDEO_ON) time.sleep(3) cam.stop_recording() # sets D604=1 (VIDEO_OFF) # → .MOV file appears in the camera's /VIDEO/ via FTP # Browse / download for handle in cam.list_objects(): print(cam.object_info(handle)) ``` ## 仓库结构 ``` actionCamController/ ├── larkfly/ the Python client library (protocol + high-level Camera) ├── webui/ Flask multi-camera controller (preview + burst record) ├── tools/ operational utilities (probe, pcap decryption, monitor capture) ├── analyses/ one-shot RE scripts + their outputs (data/*.json) ├── tests/ unit tests for the protocol codec ├── examples/ library usage demos ├── docs/ findings.md, architecture.md, archived chronology └── apk-analysis/ APK + decompile artifacts (gitignored — large + copyrighted) ``` ## 运行 Web UI ``` # 单相机(默认 IP): python3 webui/app.py --bind 192.168.1.10 # 然后打开 http://127.0.0.1:5000 # 混合源 — 一台 WiFi 相机 + 一台 USB UVC 相机: python3 webui/app.py \ --camera 192.168.1.1 --bind 192.168.1.10 \ --usb /dev/video0 ``` 有关 API 端点请参阅 `webui/README.md`,有关多相机部署方案请参阅 `docs/architecture.md`。 ## docs/ 目录包含什么 | 文件 | 何时阅读 | | --- | --- | | `docs/findings.md` | **从这里开始。** 当前状态参考:协议怪异行为、操作码、录制范式以及多相机状态。 | | `docs/architecture.md` | 决定如何部署 4 台相机(USB UVC 对比 WiFi 多网卡 对比 STATION)。 | | `docs/archive/investigation-log.md` | 完整的按时间顺序记录的逆向工程故事,包括走通的死胡同。 | | `docs/archive/original-protocol-notes.md` | 调查前的假设(大部分已被推翻)。 | ## 致谢 - libgphoto2 的 `camlibs/ptp2/ptpip.c` —— 简洁的参考实现,解决了 packet-type-11-vs-12 规范的歧义问题。 - [`clerie/rollei-AC-420`](https://github.com/clerie/rollei-AC-420) —— 相同的 iCatch 硬件系列;早期确认了 RTSP + FTP 的路径。 - [`Linouth/iCatch-V50-Playground`](https://github.com/Linouth/iCatch-V50-Playground) —— 相关芯片组的调试笔记。 ## 许可证 MIT —— 详见 `LICENSE`。
标签:AES加密, Flask, iCatch V11, iSmart DV2, Larkfly A6+, PTP/IP协议, Python, RTSP实时预览, SmartConfig, UDP广播, USB UVC, 云资产清单, 单反/相机远程控制, 图像抓取, 多媒体开发, 开源硬件, 插件系统, 文件传输FTP, 无后门, 物联网控制, 硬件黑客, 网络协议分析, 网络摄像机, 视频录制, 运动相机控制, 逆向工具, 逆向工程