【硬件交互】腕控眼镜 —— 把智能手表手环作为 AI 眼镜的延伸,可以通过智能手表手环遥控 AI 眼镜操控,沉浸体验游戏和应用
我是一名独立开发者,平时喜欢折腾各种硬件和跨端项目。
这次做"腕控眼镜",是想验证一个想法:用 Apple Watch 的手腕手势来控制 AI 眼镜。整个项目是和 TRAE「结对编程」完成的,说实话一开始我心里没底——手表手势识别、BLE 蓝牙、HID 设备伪装,每一块都是我没怎么碰过的领域。
和 TRAE 配合的真实感受是:它更像一个能听懂人话的搭档,而不是代码补全工具。我脑子里想的不是"写一个 CBPeripheralDelegate",而是"让手表扫到手机设备,连上之后把手腕的倾斜动作变成方向指令发出去"。就这么一句句讲给它听,它就把 BLECentralManager、MotionManager、GestureRecognizer 一整套搭出来了。
最让我"原来这么简单"的一刻,是 Android 那端:我要让 Android 手机伪装成蓝牙 HID 设备,让 Rokid 眼镜以为它连的是一个标准遥控器。这块我完全没做过,本以为要翻几天资料。结果我把思路讲清楚(“我们继续开发手表版 App,目前蓝牙遥控的功能,在 ios App 上实现遇到了卡点,先搁置。参考网上相关开源项目,新增一个安卓 App,然后手表版 App 和安卓 App 通信,达成我们当前项目目的”),TRAE 就帮我把 GattServerService、HidService、HidDescriptor 一整套 Kotlin 代码铺好了,我只需要调试配对流程。
它帮我跨过的最大的坎是 watchOS 的兼容性地雷:watchOS 对 NavigationStack、按钮样式、CoreImage 都有限制,TRAE 在一次次报错里帮我总结出了"哪些 API 不能用、该用什么替代",最后还补上了 WKExtendedRuntimeSession 来解决屏幕熄灭后断连的问题。这种"边踩坑边记笔记"的协作方式,真的比一个人对着文档硬啃快太多了。
1. Demo 简介
是什么:一款通过 Apple Watch 手势遥控 AI 眼镜的跨端应用,由 Android App + Apple Watch App 组成。Android 手机伪装成蓝牙 HID 遥控器与 Rokid 眼镜配对,Apple Watch 通过 BLE 连接 Android 端,用手腕手势驱动眼镜的导航操作。
面向谁:Rokid AI 眼镜的用户
主要功能:
-
Android 端:HID 伪装桥接
Android 手机开机后将蓝牙名称改为JingBao-前缀,启动 GATT Server 暴露 HID 服务,让眼镜把它识别为一个标准蓝牙遥控器,作为手表与眼镜之间的"翻译桥"。 -
Apple Watch 端:BLE 连接与配对
手表扫描带JingBao-前缀的设备,通过配对码完成安全配对,连接状态实时显示。使用WKExtendedRuntimeSession+ 自动重连,解决屏幕熄灭后断连的稳定性问题。 -
手势遥控
佩戴手表后,通过手腕倾斜动作直接控制眼镜方向(上倾=向上、下倾=向下、左右倾斜=方向键),无需低头看屏幕、无需按键。手势由 CoreMotion 采集,经GestureRecognizer识别后通过 BLE 发送到 Android 端,再由 HID 通道转发给眼镜。
2. Demo 创作思路
灵感来源
我平时戴 Rokid 眼镜的时候发现一个尴尬的事:原装遥控器是个独立的小设备,要么忘带、要么找不到;用手机 App 控制吧,又得低头看屏幕、点按钮,完全破坏了戴眼镜时"抬头就能看"的沉浸感。而手腕上的 Apple Watch,天然就是一个贴身、随时可用的输入设备——为什么不把它变成眼镜的遥控器?
想解决的问题
AI 眼镜用户的真实痛点:
- 目前没有特别耗的第三方遥控配件;
- 手机控制不够即时,需要视线离开眼镜去低头看屏幕;
- 戴着眼镜时双手经常被占用(运动、做饭、抱小孩),按物理按键不方便。
为什么做这个方向,以及路线的取舍
我的判断是:最好的遥控器,是用户已经戴在手上的那块表。与其再做一个新的硬件遥控器,不如复用用户已有的 Apple Watch,用手势动作代替按键,让控制变成一种"下意识的动作"。
技术路线其实走过一段弯路。一开始我想做 iPhone App + Apple Watch App 的组合:iPhone 负责和眼镜鉴权、连接,Watch 负责手势采集和发送。但真正动手才发现 iOS 端走 SDK 鉴权这条路坑非常多,几经折腾还是没能跑通,最终决定放弃 iOS 端,转战 Android + 手表。
这个转向反而带来了一个更巧妙的架构:让 Android 手机伪装成蓝牙 HID 遥控器去"骗"眼镜——因为 Rokid 眼镜只认标准 HID 蓝牙遥控器,而 Android 的 GattServer 可以模拟 HID 服务;Apple Watch 则专心负责手势识别,把手腕动作通过 BLE 发给 Android 端,再由 HID 通道转给眼镜。两端职责清晰:手表管输入,Android 管协议伪装。
这个方向坚持下来有三个难点,也正是这次 Demo 想验证的:
- 手势识别——用 Watch 的 CoreMotion 识别手腕倾斜,映射成方向指令;
- HID 伪装——Android 端起 GATT Server 暴露 HID 服务,让眼镜识别为遥控器;
- 后台保活——watchOS 屏幕熄灭后 BLE 容易断连,需要
WKExtendedRuntimeSession+ 自动重连来解决。
之所以坚持做下来,是因为我相信 AI 眼镜的交互入口不应该是"再多一个设备",而应该是"用好已有的设备"。腕控眼镜 就是这个想法的一次小小实践。
3. Demo 演示视频
玩起来,把闲置的手表当 AI 眼镜遥控器 @Rokid乐奇 @… 小红书 - 你访问的页面不见了 来【小红书】一探究竟吧!
4. TRAE 实践过程
整个项目的开发历程大概分为四个阶段,每一步都是和 TRAE 协作完成的:
阶段一:需求拆解与技术选型
一开始我只是想做一个"用 Apple Watch 手势控制 AR 眼镜"的东西,但具体怎么实现完全没头绪。我把这个想法丢给 TRAE,它帮我梳理出了技术路线:
我的需求:“用 Apple Watch 的手腕动作来控制 Rokid AI 眼镜,比如倾斜手腕向上滑动,旋转手腕左右切换”
TRAE 的分析:
- Watch 需要采集运动数据 → CoreMotion
- 手势识别 → 加速度阈值 + 角度变化
- 指令发送 → BLE
- 眼镜接收 → 需要中间设备(手机)转发或直接连接
我们最初选择了 iPhone + Watch 的方案:Watch 采集手势 → WatchConnectivity 发给 iPhone → iPhone 通过 Rokid CXR-L SDK 连接眼镜。
阶段二:iOS 端开发与踩坑
TRAE 帮我搭建了 iOS App 的基础框架,包括:
- [CXRManager.swift] — 管理 SDK 鉴权和连接状态
- [WatchConnectivityManager.swift] — iPhone 与 Watch 的通信
- [ContentView.swift] — 亮度/音量滑块、方向键导航
但在调试过程中遇到了一系列问题:
- SDK 鉴权流程复杂:需要安装 Rokid AI App 才能完成鉴权,回调处理繁琐
- BLE 连接不稳定:
retrieveConnectedPeripherals找不到已连接设备,didConnect回调不触发 - watchOS 兼容性问题:
NavigationStack、.buttonStyle(.borderedProminent)在 watchOS 上报错
最关键的是,iOS 端走 SDK 路线需要处理复杂的鉴权流程,调试起来困难重重。在多次尝试后,我们决定放弃 iOS 端,转战 Android。
阶段三:转向 Android + Watch 方案
这个转向是整个项目的转折点。TRAE 帮我设计了一个更巧妙的架构:
┌──────────────────┐ BLE (手势指令) ┌──────────────────┐ HID (键盘/鼠标) ┌──────────────────┐
│ Apple Watch │◄─────────────────────────►│ Android │◄─────────────────────────►│ Rokid Glasses │
│ (手势采集识别) │ │ (GATT Server) │ │ (HID 接收器) │
│ │ │ (HID 伪装) │ │ │
└──────────────────┘ └──────────────────┘ └──────────────────┘
核心思路:让 Android 手机伪装成蓝牙 HID 遥控器,眼镜以为连接的是一个标准遥控器;Watch 专注于手势识别,把手腕动作通过 BLE 发给 Android,再由 HID 通道转给眼镜。
Android 端开发
TRAE 帮我从零开始写 Android 端代码:
-
[GattServerService.kt] — 启动 GATT Server,接收 Watch 的手势指令
- 开启 BLE 广播,设备名改为
JingBao-前缀 - 创建自定义服务 UUID,暴露手势写入特征
- 通过
onCharacteristicWriteRequest接收手势数据
- 开启 BLE 广播,设备名改为
-
[HidService.kt] — 伪装成 HID 设备
- 注册 HID 描述符,让眼镜识别为标准遥控器
- 将手势指令转换成键盘键码(方向键、回车、ESC)
-
手势指令映射
scroll_up→ 鼠标滚轮向上swipe_left→ 左方向键confirm→ 回车键
Watch 端开发
TRAE 帮我完成了 Watch App 的核心逻辑:
-
[MotionManager.swift] — 采集运动数据
- 配置 CoreMotion,以 50Hz 频率获取设备运动数据
- 通过回调传给手势识别器
-
[GestureRecognizer.swift] — 手势识别
- 维护运动历史队列(30 帧)
- 通过加速度阈值检测轻击确认手势
- 冷却时间防重复触发
-
[BLECentralManager.swift] — BLE 连接与指令发送
- 扫描带
JingBao-前缀的设备 - 通过特征写入发送手势指令
- 扫描带
-
[ContentView.swift] — UI 界面
- 连接状态展示、配对码显示、手势控制开关
阶段四:稳定性优化
项目基本跑通后,又遇到了 watchOS 屏幕熄灭后 BLE 断连的问题。TRAE 帮我实现了:
- BackgroundTaskManager.swift—
WKExtendedRuntimeSession延长后台运行时间 - 自动重连机制(在 BLECentralManager.swift)— 断开后 2 秒自动重新扫描
关键任务对话的 Session ID
-
.4439153971044148:91c36805f32140b871573b80b6520c59_6a549f1c916e678e9d89776f.6a54a1a6916e678e9d897788.6a54a1a58a7da4acbaf90c55:Trae CN.T(2026/7/13 16:28:22)
-
.4439153971044148:e159e9e453f8347ed32d293936965727_6a5457e6916e678e9d8974b4.6a546357916e678e9d897528.6a5463568a7da4acbaf90c4d:Trae CN.T(2026/7/13 12:02:31)
-
.4439153971044148:133ef9b44133727b887daee02c458bc7_6a561f913fc3a2e0e17cee51.6a56226b3fc3a2e0e17ceee6.6a56226bad54b80de31370ee:Trae CN.T(2026/7/14 19:50:03)





