news 2026/11/5 21:48:35

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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.btsnoopenabletrueadb 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")varstatus=ValueUtil.CxrStatus.REQUEST_FAILEDreturntry{// 构建JSON参数valjson=JSONObject().apply{put("name",sceneType)put("open",enable)if(extraArgs.isNotBlank()){put("param",extraArgs)}}valjsonString=json.toJSONString()Log.i("CxrApi","sceneJson:$jsonString")// 创建Caps对象并写入数据valcaps=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. 完整的使用示例

classARRecordingActivity:AppCompatActivity(){privatelateinitvararRecordingController:ARRecordingControlleroverridefunonCreate(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录屏功能的开发者。如果你有任何问题或改进建议,欢迎在评论区留言交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 0:36:08

基于springboot德育家校共建平台系统源码设计与文档

前言基于 SpringBoot 的德育家校共建平台系统&#xff0c;聚焦校园德育 “家校协同、过程可溯、评价量化” 的核心需求&#xff0c;针对传统德育工作 “家校沟通少、评价主观化、育人闭环缺失” 的痛点&#xff0c;构建覆盖学生、家长、班主任、德育处管理员的全流程德育管理生…

作者头像 李华
网站建设 2026/11/6 0:36:22

基于SpringBoot的音乐网站系统源码设计与文档

前言基于 SpringBoot 的音乐网站&#xff0c;聚焦音乐娱乐 “个性化推荐、内容多元化、互动社交化” 的核心需求&#xff0c;针对传统音乐网站 “推荐精准度低、互动性弱、版权管理缺失” 的痛点&#xff0c;构建覆盖普通用户、音乐人、平台管理员的全流程音乐服务生态。系统采…

作者头像 李华
网站建设 2026/11/6 0:36:01

基于SpringBoot的毕业生离校管理系统源码设计与文档

前言 基于 SpringBoot 的毕业生离校管理系统&#xff0c;聚焦高校毕业生离校 “流程线上化、审批高效化、数据一体化” 的核心需求&#xff0c;针对传统离校办理 “线下跑腿多、审批进度不透明、数据统计繁琐” 的痛点&#xff0c;构建覆盖毕业生、辅导员、各职能部门&#xff…

作者头像 李华
网站建设 2026/11/6 0:36:12

C++用new创建对象和不用new创建对象的区别解析

我们都知道C中有三种创建对象的方法&#xff0c;如下&#xff1a;#include <iostream>using namespace std;class A{private:int n;public:A(int m):n(m){}~A(){}};int main(){A a(1); //栈中分配A b A(1); //栈中分配A* c new A(1); //堆中分配delete c;return 0;}…

作者头像 李华
网站建设 2026/11/6 0:36:19

车辆GPS数据实战方案:SpringBoot + Kafka + Redis + MongoDB 全栈实现

1. 系统架构设计 1.1 整体架构 车辆终端 → SpringBoot接入层 → Kafka消息队列 → 数据处理层 → MongoDB存储 + Redis缓存 1.2 技术栈选择理由 技术 作用 选择理由 SpringBoot 接入层、快速开发 生态丰富、快速开发 Kafka 消息队列,高吞吐 解耦系统组件、支持顺序消息 Re…

作者头像 李华