菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > Rokid AI眼镜远程协作开发:开源连接库集成实践全解析
进阶教程 AI眼镜远程协作开发

Rokid AI眼镜远程协作开发:开源连接库集成实践全解析

2026-06-03
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

为RokidAI眼镜封装蓝牙连接库,扫描连接重连状态,三步集成添加依赖初始化扫描连接,连

如果你正在开发的 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 对接场景里也很有参考价值。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多