游乐游手机版
首页/AI教程/文章详情

一线互联Rokid AI眼镜远程协作开发与开源集成实践

时间:2026-06-02 18:43
为RokidAI眼镜封装蓝牙连接库,扫描连接重连状态,三步集成添加依赖初始化扫描连接,连接后CXRSDK处理视频流,库管理权限与生命周期防泄漏,不用dumpsys判连接保护授权文件重连自动重试。

如果你正在开发的 Android 应用需要跟 Rokid AI 眼镜打交道——比如远程协作、工业巡检、远程医疗教学——其实不用自己从头硬啃 CXR SDK 那套 BLE 连接逻辑。我们把手机和眼镜之间最磨人的蓝牙连接层单独拆了出来,做成一个独立库,把扫描、连接、重连、状态管理这些基础能力都封装好了。

下面直接说怎么用,顺带提几个实际踩过的坑。

三步接入

Step 1:添加依赖

repositories {
    ma ven { url = uri("https://ma ven.rokid.com/repository/ma ven-public/") }
}

dependencies {
    implementation "xyz.jumu.rokid:glasses-bt-core:0.1.0-SNAPSHOT"
}

Step 2:初始化 Manager

val manager = RokidGlassesBtManager(
    context = context,
    config = RokidGlassesBtConfig(
        clientSecret = "your-rokid-client-secret",
        authBlob = loadAuthBlobFromFile("rokid_cxr_auth.lc"),
        bluetoothClientName = "一线互联"
    )
)

authBlob 是 Rokid 提供的 .lc 授权文件,需要去 Rokid 开发者平台拿到。clientSecret 是开发者密钥。这两个凭证千万别硬编码在代码里,建议从配置文件或环境变量读取。

Step 3:扫描并连接

// 开始扫描周边眼镜
manager.startScan()

// 监听设备列表,展示给用户选择
manager.devices.collect { devices ->
    devices.forEach { device ->
        println("${device.name}RSSI: ${device.rssi}")
    }
}

// 用户点击后连接
manager.connect(selectedDevice)

// 监听连接状态
manager.state.collect { state ->
    when (state) {
        RokidGlassesBtState.Connected -> onGlassesReady()
        is RokidGlassesBtState.Failed -> handleError(state.stage, state.code)
        else -> updateProgress(state)
    }
}

连接成功后怎么用

这个库只管连接管理,连接建立之后,视频流获取、传感器数据读取这些后续操作,依然走 CXR SDK 的其他接口。开源库在 Connected 状态确认后就不再插手业务层,你可以直接对接 CXR SDK,或者跑自己定义的协议。

顺带解释一下它和上层产品的关系:开源库本质是“连接层”,上层应用在这个基础上加视频推流、WebRTC 信令、任务同步、取证管理等业务模块。如果你有自己的一套业务,完全可以直接拿连接层往上搭。

权限处理

Android 12 及以上需要在运行时申请蓝牙权限。库提供了一个工具方法,能直接返回当前系统版本需要的权限列表:

class MainActivity : Activity() {
    override fun onCreate(sa vedInstanceState: Bundle?) {
        super.onCreate(sa vedInstanceState)
        // 检查缺失的权限
        val missing = RokidGlassesBtPermission.missingPermissions(this)
        if (missing.isNotEmpty()) {
            requestPermissions(missing.toTypedArray(), REQUEST_CODE)
        }
    }
}

不建议硬编码权限列表——Android 11、12、13 的权限需求是不一样的,用 requiredPermissions() 动态获取比你自己写 when 分支靠谱得多。

生命周期管理

Manager 内部持有蓝牙扫描器、Handler 定时器、CXR SDK 连接。如果不主动释放,Activity 销毁后很容易泄漏。调用逻辑很简单:

override fun onDestroy() {
    manager.close()
    super.onDestroy()
}

close() 会依次做:停止 BLE 扫描、取消所有超时和轮询定时器、清理 pending endpoint、调用 CXR SDK 的 deinitBluetooth() 断开连接、状态置为 Disconnected。内部有幂等保护,放心多次调用。

一个完整的示例

把上面的拼起来,一个最小可用的 Activity 大概长这样:

class GlassesActivity : Activity() {
    private val scope = MainScope()
    private lateinit var manager: RokidGlassesBtManager

    override fun onCreate(sa vedInstanceState: Bundle?) {
        super.onCreate(sa vedInstanceState)

        manager = RokidGlassesBtManager(
            context = applicationContext,
            config = RokidGlassesBtConfig(
                clientSecret = BuildConfig.ROKID_CLIENT_SECRET,
                authBlob = loadAuthBlob(),
                bluetoothClientName = "一线互联"
            )
        )

        // 监听设备
        scope.launch {
            manager.devices.collect { devices -> updateDeviceList(devices) }
        }

        // 监听状态
        scope.launch {
            manager.state.collect { state -> updateState(state) }
        }

        // 检查权限,没问题就开始扫
        if (RokidGlassesBtPermission.missingPermissions(this).isEmpty()) {
            manager.startScan()
        }
    }

    fun onDeviceClicked(device: RokidGlassesBtDevice) {
        manager.connect(device)
    }

    override fun onDestroy() {
        manager.close()
        scope.cancel()
        super.onDestroy()
    }

    private fun loadAuthBlob(): ByteArray {
        return assets.open("rokid_cxr_auth.lc").use { it.readBytes() }
    }
}

几个实际踩过的坑

1. 不要依赖 dumpsys 判断连接状态。
Android 的 dumpsys bluetooth_manager 不一定能显示 CXR Socket 连接。判断连接是否成功的可靠方式是:App 状态变成 Connected,同时 logcat 里能看到 BLUETOOTH_A VAILABLEgetGlassInfo onResponse

2. authBlob 文件不要提交到版本管理。
.lc 文件是设备授权凭证,相当于密码。示例项目里把它放在 sample-app/src/main/assets/ 下,并在 .gitignore 中排除了 *.lc。你照做就行。

3. 重连失败不要直接弹错误。
先判断错误码:如果是 SOCKET_CONNECT_FAILED,说明缓存失效,自动触发一次新扫描——用户不需要知道背后发生了什么。只有多次重试失败后才提示用户介入。

这个库和一线互联的关系

一线互联智能单兵系统的手机端就是基于这个连接库构建的。在眼镜连接稳定的前提下,上层叠加了视频推流、WebRTC 信令、任务管理、取证留痕等业务模块。

我们把连接层开源,是因为它本身足够通用——任何需要手机和 Rokid 眼镜通信的 Android 应用都能直接使用;二是因为连接层最能体现蓝牙连接在工业场景下的可靠性工程——状态机、失败模型、重连策略、轮询兜底,这些设计放到其他蓝牙 SDK 对接场景里也很有参考价值。

来源:https://cloud.tencent.com.cn/developer/article/2680869
上一篇用AI代码助手提升编程效率的5个方法 下一篇如何用AI人脸替换技术提升文档创作视觉效果
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
批处理BAT入门教程第一篇
AI教程 · 2026-07-03

批处理BAT入门教程第一篇

提供13个批处理实战技巧,覆盖全盘查找并删除文件夹或文件、拷贝移动文件、创建畸形文件夹及设置隐藏属性等场景,可一键完成系统维护与文件管理工作,极大提升自动化操作效率和便捷性。

从零开始批处理命令For循环详解与实战案例
AI教程 · 2026-07-03

从零开始批处理命令For循环详解与实战案例

批处理For命令支持 d、 l、 r、 f四个参数。 d仅列出当前目录下的目录名; r递归搜索指定路径及其子目录中的文件; l生成数值序列; f可解析文件、字符串或命令输出,通过delims、tokens、skip、eol等选项灵活处理内容。

批评你的人是你生命中的贵人
AI教程 · 2026-07-03

批评你的人是你生命中的贵人

批评你的人往往最值得珍惜,因为他们关注你、助你成长。面对批评应包容反思,用行动改进而非辩解。接受批评是自我完善的过程,能让人少走弯路,避免重复犯错。这样的人正是生命中的贵人,值得感恩与珍惜。

测试人员角色定位与职责详解
AI教程 · 2026-07-03

测试人员角色定位与职责详解

测试人员角色经历了从找问题、保证质量到分析风险的转变,最终核心职责是提供关键信息,协助团队创造优秀产品。这包括识别问题、评估风险及帮助团队了解项目状态,而非单纯把关或追求完美。

经营成功测试生涯的实用方法与策略
AI教程 · 2026-07-03

经营成功测试生涯的实用方法与策略

一、测试生涯的起点 1989年,我在田纳西大学攻读研究生时,意外地从软件开发人员转行成为一名软件测试工程师。这并非我主动选择,说起来还有些戏剧性——某个早晨,教授质问我为何缺席那么多开发会议,我解释说这些会议总是安排在周末早上,对我这个第一次离家、刚入学的学生来说实在不便。结果呢?等待我的不是解聘通