【Rokid AR录屏功能逆向分析:通过蓝牙HCI抓包实现CXR SDK未提供的AR录屏功能】

【Rokid AR录屏功能逆向分析:通过蓝牙HCI抓包实现CXR SDK未提供的AR录屏功能】

背景介绍

作为一名Rokid Glasses开发者,我最近在开发一个需要AR录屏功能的应用。然而,Rokid官方提供的CXR SDK中并没有直接封装AR录屏的功能。在查阅官方文档和API后,我意识到需要自己探索实现方案。

经过深入研究,我发现了通过蓝牙HCI数据包分析并结合CXR API的方法,成功实现了AR录屏功能。本文将详细介绍我的探索过程和最终解决方案。

问题分析

1. 官方SDK的限制

Rokid CXR SDK提供了丰富的AR眼镜控制功能,但在录屏方面存在以下限制:

  • 没有直接的AR录屏API
  • 现有API主要面向常规应用控制
  • 文档中未提及录屏相关功能

2. 技术思路

由于没有直接的API,我决定从以下角度入手:

  1. 分析官方应用:Rokid AI App如何实现AR录屏?
  2. 蓝牙通信分析:眼镜与手机之间通过蓝牙传输哪些控制指令?
  3. 协议逆向:能否找到录屏的控制协议?

技术探索过程

在这里插入图片描述

步骤1:蓝牙HCI数据包抓取

首先,我开启了Android设备的蓝牙HCI日志功能:

# 开启蓝牙HCI日志 adb shell setprop persist.bluetooth.btsnoopenable true adb shell setprop persist.bluetooth.btsnooplogmode full adb shell stop bluetooth adb shell start bluetooth # 从设备拉取日志 adb pull /data/misc/bluetooth/logs/btsnoop_hci.log 

步骤2:使用Wireshark分析数据包

将抓取到的HCI日志用Wireshark打开,并使用过滤器查看关键数据:

# 过滤RFCOMM协议 btrfcomm # 查看Scene_Control相关的包 frame contains "Scene_Control" 

步骤3:发现关键数据包

经过仔细分析,我发现了录屏控制的关键数据包:

开始录屏指令

02 33 00 52 00 4e 00 53 00 23 ff 93 01 00 00 00 49 05 04 75 75 53 4f 81 20 41 03 53 79 73 00 00 00 38 05 02 53 53 0d 53 63 65 6e 65 5f 43 6f 6e 74 72 6f 6c 21 7b 22 6e 61 6d 65 22 3a 22 6d 69 78 5f 72 65 63 6f 72 64 22 2c 22 6f 70 65 6e 22 3a 74 72 75 65 7d 46 

停止录屏指令

02 33 00 52 00 4e 00 53 00 23 ff 93 01 00 00 00 49 05 04 75 75 53 4f 81 20 41 03 53 79 73 00 00 00 38 05 02 53 53 0d 53 63 65 6e 65 5f 43 6f 6e 74 72 6f 6c 21 7b 22 6e 61 6d 65 22 3a 22 6d 69 78 5f 72 65 63 6f 72 64 22 2c 22 6f 70 65 6e 22 3a 66 61 6c 73 65 7d 46 

步骤4:解析协议格式

通过分析数据包,我发现了协议的结构:

Scene_Control!{"name":"mix_record","open":true/false} 

这是一个简单的JSON格式控制指令:

  • name: 场景名称,AR录屏对应mix_record
  • open: 控制开关,true开始录屏,false停止录屏

解决方案实现

基于以上分析,我利用CXR SDK现有的CxrApi构建了AR录屏控制功能:

1. 核心场景控制函数

funcontrolScene(sceneType: String, enable: Boolean, extraArgs: String =""): ValueUtil.CxrStatus{ Log.i("CxrApi","controlScene sceneType:$sceneType, enable:$enable, extraArgs:$extraArgs")var status = ValueUtil.CxrStatus.REQUEST_FAILED returntry{// 构建JSON参数val json =JSONObject().apply{put("name", sceneType)put("open", enable)if(extraArgs.isNotBlank()){put("param", extraArgs)}}val jsonString = json.toJSONString() Log.i("CxrApi","sceneJson: $jsonString")// 创建Caps对象并写入数据val caps =Caps().apply{write("Scene_Control")write(jsonString)}// 发送控制请求 status = CxrController.getInstance().request(CxrApi.getInstance().w,"Sys", caps,null) status }catch(e: Exception){ Log.e("CxrApi","controlScene error: ${e.message}") ValueUtil.CxrStatus.REQUEST_FAILED }}

2. 封装的AR录屏功能

// 封装的AR录屏功能funcontrolSystemMixRecord(toOpen: Boolean){when(controlScene("mix_record", toOpen)){ ValueUtil.CxrStatus.REQUEST_SUCCEED ->{ Log.d(TAG,"Video record ${if(toOpen)"started"else"stopped"}")} ValueUtil.CxrStatus.REQUEST_FAILED ->{ Log.e(TAG,"Failed to ${if(toOpen)"start"else"stop"} video record")} ValueUtil.CxrStatus.REQUEST_WAITING ->{ Log.e(TAG,"Requested but Glasses is not ready")}else->{ Log.e(TAG,"Unknown error")}}}// 启动AR录屏funstartARRecording(){controlSystemMixRecord(true)}// 关闭AR录屏funstopARRecording(){controlSystemMixRecord(false)}

3. 完整的使用示例

class ARRecordingActivity :AppCompatActivity(){privatelateinitvar arRecordingController: ARRecordingController overridefunonCreate(savedInstanceState: Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_ar_recording) arRecordingController =ARRecordingController()// 开始AR录屏 findViewById<Button>(R.id.btn_start_record).setOnClickListener{ arRecordingController.startARRecording()}// 停止AR录屏 findViewById<Button>(R.id.btn_stop_record).setOnClickListener{ arRecordingController.stopARRecording()}}overridefunonDestroy(){super.onDestroy()// 确保停止录屏 arRecordingController.stopARRecording()}}

技术细节说明

1. 协议栈分析

通过HCI日志分析,我了解到完整的通信协议栈:

应用层: Scene_Control{"name":"mix_record","open":true} ↓ 传输层: RFCOMM (蓝牙串口仿真协议) ↓ 数据链路层: L2CAP ↓ 物理层: 蓝牙HCI 

2. 关键发现

  • 场景名称: mix_record 表示混合录制(可能同时录制AR画面和音频)
  • 控制参数: 只需要简单的开关控制
  • 系统目标: 发送到Sys系统服务

3. 错误处理

代码中完整处理了CXR API返回的各种状态:

  • REQUEST_SUCCEED: 请求成功
  • REQUEST_FAILED: 请求失败
  • REQUEST_WAITING: 设备未就绪

使用注意事项

1. 权限要求

在AndroidManifest.xml中添加必要权限:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-featureandroid:name="android.hardware.bluetooth"android:required="true"/>

2. 设备连接状态

确保设备已正确连接:

if(CxrApi.getInstance().isConnected()){// 设备已连接,可以控制}else{// 设备未连接,需要先连接 Toast.makeText(this,"请先连接Rokid眼镜", Toast.LENGTH_SHORT).show()}

3. 录屏文件位置

录制的视频默认保存在:

/sdcard/ScreenRecorder/vid-{timestamp}.mp4 

总结与展望

通过这次探索,我成功实现了以下目标:

✅ 已实现功能

  1. 通过蓝牙HCI日志分析找到了AR录屏的控制协议
  2. 利用现有CXR API实现了AR录屏控制
  3. 提供了完整的开始/停止录屏接口
  4. 完善了错误处理和状态反馈

🔮 未来展望

  1. 探索更多AR场景控制功能
  2. 研究视频流实时处理
  3. 开发AR内容创作工具链
  4. 构建AR应用开发框架

致谢

感谢Rokid提供的硬件平台和CXR SDK,虽然某些功能没有直接提供API,但通过深入的技术探索,我们仍然能够实现所需的功能。

希望这篇文章能够帮助到其他需要AR录屏功能的开发者。如果你有任何问题或改进建议,欢迎在评论区留言交流!

Read more

彻底解决llama.cpp项目CUDA编译难题:从环境配置到性能优化全指南

彻底解决llama.cpp项目CUDA编译难题:从环境配置到性能优化全指南 【免费下载链接】llama.cppPort of Facebook's LLaMA model in C/C++ 项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp 你是否在编译llama.cpp时遭遇过CUDA相关的"nvcc not found"错误?是否尝试启用GPU加速却始终无法识别显卡?本文将系统梳理llama.cpp项目中CUDA编译的常见问题,提供从环境配置到高级优化的完整解决方案,让你的NVIDIA显卡充分释放AI计算潜能。 CUDA编译基础与环境检查 llama.cpp通过CUDA后端实现NVIDIA GPU加速,其核心配置位于CMakeLists.txt构建系统中。官方推荐的基础编译命令看似简单: cmake -B build -DGGML_CUDA=ON

VSCode AI Copilot 智能补全失效?(错误修正终极手册)

第一章:VSCode AI Copilot 智能补全失效?(错误修正终极手册) 检查网络连接与认证状态 AI Copilot 依赖稳定的网络连接以访问云端模型服务。若补全功能无响应,首先确认是否已登录 GitHub 账户并正确授权。 * 打开 VSCode 命令面板(Ctrl+Shift+P) * 输入并执行 Copilot: Sign in to GitHub * 在浏览器中完成授权后返回编辑器查看状态栏 状态栏应显示“Copilot 已启用”,否则可能因令牌过期导致服务中断。 验证扩展安装与版本兼容性 确保安装的是官方 GitHub Copilot 扩展而非第三方插件。 # 在终端中检查已安装扩展 code --list-extensions | grep -i copilot # 正确输出应包含: # GitHub.copilot # GitHub.copilot-chat (可选) 若缺失,通过扩展市场重新安装或使用命令行:

xilinx原语:OSERDES2(并串转换器)原语详解

xilinx原语:OSERDES2(并串转换器)原语详解

1 概述         OSERDES2--Output Parallel-to-Serial Logic Resources,即输出的串并转换资源,官方手册给出的说明如下:         xilinx 7 系列器件中的 OSERDESE2 是一种专用的并行到串行转换器,具备特定的时钟和逻辑资源,旨在便于实现高速源同步接口。         每个 OSERDESE2 模块都包含一个用于数据和三态控制的专用串行器。数据串行器和三态串行器都可以配置为单数据率(SDR)和双数据率(DDR)模式。数据串行化比率最高可达 8:1(如果使用 OSERDESE2 宽度扩展功能,则可达 10:1 和 14:1)。三态串行化比率最高可达 14:1。还有一种专用的 DDR3 模式,用于支持高速内存应用。         OSERDES2的框图如下,突出显示了该模块的所有组件和特性。 2  OSERDES原语详细说明         在vivado中获取OSERDES2原语模板,获取方式参考FPGA基础知识(二十一):xilinx

2026 年 AI 辅助编程工具全景对比:Copilot、Cursor、Claude Code 与 Codex 深度解析

引言 2026 年,AI 辅助编程已经从"尝鲜"变成了"标配"。从 GitHub Copilot 的横空出世,到 Cursor 的异军突起,再到 Claude Code 的强势入局,AI 编程助手正在重塑开发者的工作方式。但面对市面上琳琅满目的工具,你是否也有这样的困惑:哪个工具最适合我?它们之间到底有什么区别? 本文将深入对比四款主流 AI 编程工具,帮你找到最适合自己的那一款。 AI 辅助编程的演进之路 从代码补全到智能协作 早期的 AI 编程工具,如 OpenAI Codex,主要聚焦于代码补全——你写一行,它接下一行。但到了 2026 年,AI 编程助手已经进化成真正的&