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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A2UI:让AI从“对话框“走向“动态界面“

A2UI解决的核心问题是&#xff1a;如何让AI代理安全地跨信任边界渲染UI。 这话听着有点绕&#xff0c;举项目中的一个示例就清楚了。你问AI助手“帮我订个餐厅”&#xff0c;传统的方式是一轮轮文字对话&#xff1a; 用户: "订个两人桌"AI: "什么时间&#xff1…

【路径规划】基于matlab模糊神经网络机器人路径规划【含Matlab源码 14859期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

基于SpringBoot的爱心捐助平台系统源码设计与文档

前言基于 SpringBoot 的爱心捐助平台系统&#xff0c;聚焦公益捐助 “流程透明化、捐赠可追溯、需求精准匹配” 的核心需求&#xff0c;针对传统爱心捐助 “信息不对称、资金去向不明、捐助效果难量化” 的痛点&#xff0c;构建覆盖捐赠人、受助方&#xff08;个人 / 公益组织&…

【Python pip换源教程:国内镜像源配置方法(清华/阿里云/中科大源)】

作为一名Python开发者&#xff0c;你一定遇到过这样的场景&#xff1a;深夜加班时&#xff0c;一个简单的pip install命令却卡在"Downloading…"界面&#xff0c;进度条慢如蜗牛。这不是你的网络问题&#xff0c;而是默认的PyPI服务器位于海外&#xff0c;网络延迟导…

基于SpringBoot的安心动物领养系统源码设计与文档

前言基于 SpringBoot 的安心动物领养系统&#xff0c;聚焦流浪动物领养 “流程规范化、信息透明化、匹配精准化” 的核心需求&#xff0c;针对传统动物领养 “信息零散、审核不严谨、领养后追踪缺失” 的痛点&#xff0c;构建覆盖领养人、救助机构 / 志愿者、平台管理员的全流程…

基于 ANFIS 的非线性回归附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

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

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

【三维路径规划】基于matlab多种算法多无人机三维路径规划【含Matlab源码 14863期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【动态路径规划】基于粒子群算法与动态窗口混合的无人机三维动态避障路径规划研究,MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

航天原子钟的电源管理与控制单元抗辐照可靠性评估

摘要航天原子钟作为导航、通信与科学探测任务的核心时频基准&#xff0c;其电源管理与控制单元的抗辐照可靠性直接决定了全系统在空间辐射环境下的长期稳定运行能力。本文系统综述了面向宇航应用的电源管理集成电路抗辐照设计技术、评估方法及在轨验证现状&#xff0c;重点分析…

计算机深度学习毕设实战-深度学习基于pytorch训练蔬菜识别基于机器学习训练蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

脑机接口时代,提示工程架构师的技术咨询服务

脑机接口时代&#xff0c;提示工程架构师的技术咨询服务&#xff1a;开启人机交互新维度 摘要/引言 开门见山 在科技飞速发展的当下&#xff0c;脑机接口&#xff08;BCI&#xff09;技术正逐渐从科幻走向现实&#xff0c;它被视为改变人类生活和工作方式的下一个重大突破。想象…

考虑储能电池参与一次调频技术经济模型的容量配置方法Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

Vibe Kanban:Rust构建的AI编程代理编排平台

在AI编程助手日益普及的今天&#xff0c;开发者正面临着一个前所未有的挑战&#xff1a;如何高效地管理多个AI编码代理&#xff0c;实现它们的协同工作。当Claude Code、Gemini CLI、Codex等AI工具开始承担大量代码产出时&#xff0c;人类工程师的核心工作正逐步转向规划、协调…

环境振动估算阻尼比 (SDOF)研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【路径规划】遗传算法港口集装箱卡车调度【含Matlab源码 14860期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

【栅格地图路径规划】蚁群算法结合遗传算法栅格地图路径规划【含Matlab源码 14865期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

Flask基于人脸识别的智慧医疗预约挂号平台-计算机毕业设计源码+LW文档

摘要 如今&#xff0c;在科学技术飞速发展的情况下&#xff0c;信息化的时代也已因为计算机的出现而来临&#xff0c;信息化也已经影响到了社会上的各个方面。它可以为人们提供许多便利之处&#xff0c;可以大大提高人们的工作效率。随着计算机技术的发展的普及&#xff0c;各个…

【路径规划】模糊神经网络机器人路径规划【含Matlab源码 14859期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

【langchain——对话链+记忆模块】通过代码构造可多轮会话,自动调整记忆长度的基于知识库检索的购物推荐智能体搭建

1、前言 解决langchain搭建的智能体多轮会话中的记忆连接不连贯的问题 2、记忆模块的种类&#xff08;常见3种&#xff09; 调用的包名&#xff1a;from langchain_classic.memory import xxx 名称优缺点使用函数ConversationBufferMemory保留完整的对话上下文&#xff0c;…