Rokid AI 眼镜远程协作应用"一线互联"开发实践:设备发现与 BLE 扫描

简介: 工业现场蓝牙扫描远非简单“搜到即连”:需两级过滤(系统低延迟扫描+应用层UUID/名称匹配)、RSSI智能排序、MAC地址临时命名,并通过CXR私有协议建立专用连接,确保秒级稳定接入。

上周在工厂部署一线互联的时候,一个工程师问我:"不就是蓝牙扫描嘛,搜到了点连接不就行了?"

行是行,但在工业现场,"搜到了"这三个字没那么简单。
iShot_2026-06-01_11.10.11.png

你周围不止一副蓝牙设备

掏出手机扫一下蓝牙,列表里几十个设备。耳机、手环、车间里的蓝牙网关、隔壁工位的手机——Rokid AI 眼镜就混在里面。问题是,眼镜的 BLE 广播名有时候是空的,有时候显示为乱码,你不能只靠名字来认。

我们把扫描过滤做成了两级:

第一级是 Android 系统层的 BLE 扫描配置。用的是低延迟模式,牺牲一点功耗换扫得更快——工厂讲究戴上就干活,不能让人等着蓝牙慢慢扫:

val settings = ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    .build()

scanner.startScan(null, settings, scanCallback)

第二级是应用层的过滤。每个扫描结果进来,我们会检查设备名和 Service UUID 是否匹配 Rokid 眼镜的特征。如果两个都不匹配,直接丢掉:

override fun onScanResult(callbackType: Int, result: ScanResult) {
    val device = result.device ?: return
    val serviceUuids = result.scanRecord?.serviceUuids
        ?.map { it.uuid.toString() } ?: emptyList()
    val name = result.scanRecord?.deviceName ?: runCatching { device.name }.getOrNull()

    if (!RokidGlassesBtScanFilter.matches(
            name = name,
            serviceUuids = serviceUuids,
            targetServiceUuid = config.serviceUuid,
            allowNameFallback = config.allowNameFallback
        )
    ) return

    // 只保留匹配的设备
    val displayName = name ?: "Glass_${device.address.takeLast(5).replace(":", "")}"
    upsertDevice(RokidGlassesBtDevice(
        name = displayName,
        address = device.address,
        type = device.type,
        rssi = result.rssi,
        serviceUuids = serviceUuids
    ))
}

这里有个小细节:如果广播里拿不到设备名,我们会用 MAC 地址后五位生成一个"Glass_XXXX"的临时名称。在车间里可能同时有好几副眼镜,这个名字至少能让用户区分。

还有一个实操经验值得提:扫描到的设备按 RSSI 降序排列。信号强的排上面,大概率就是离你最近的那副。上层的代码通过 StateFlow 拿到设备列表后直接绑定到 UI,每次新设备进来自动排序:

private fun upsertDevice(device: RokidGlassesBtDevice) {
    val next = _devices.value
        .filterNot { it.address.equals(device.address, ignoreCase = true) }
        .plus(device)
        .sortedByDescending { it.rssi }
    _devices.value = next
}

为什么不用传统蓝牙配对

这是另一个经常被问到的问题。普通蓝牙耳机、音箱用的是经典蓝牙 SPP/A2DP profile,配对完系统就记住了。但 Rokid 眼镜的视频流和控制指令走的是 CXR 私有协议通道,底层虽然也是蓝牙传输,但连接建立逻辑完全不一样。

打个比方:普通蓝牙设备像是标准快递,手机操作系统认识这个快递单,帮你签收了。但 CXR 通道像是专用物流,快递单和签收流程都是定制的,你得通过 CXR SDK 去初始化、协商 endpoint、建立 socket 连接。

这也是为什么一线互联在封装连接层的时候,要把 CXR SDK 的调用全部隔离在一个内部接口后面:

internal object AndroidRokidCxrClient : RokidCxrClient {
    override fun initBluetooth(
        context: Context,
        device: BluetoothDevice,
        callback: BluetoothStatusCallback
    ) {
        CxrApi.getInstance().initBluetooth(context, device, callback)
    }

    override fun connectBluetooth(
        context: Context,
        socketUuid: String,
        macAddress: String,
        bluetoothClientName: String,
        callback: BluetoothStatusCallback,
        authBlob: ByteArray,
        clientSecret: String
    ) {
        CxrApi.getInstance().connectBluetooth(
            context, socketUuid, macAddress, bluetoothClientName,
            callback, authBlob, clientSecret
        )
    }

    override fun deinitBluetooth() {
        CxrApi.getInstance().deinitBluetooth()
    }

    override fun isBluetoothConnected(): Boolean {
        return CxrApi.getInstance().isBluetoothConnected
    }
}

对上层业务来说,它只知道调用 manager.startScan()manager.connect(device),完全不用关心底层是 CXR 还是别的什么协议。如果未来 Rokid SDK 升级了 API 签名,改动的范围也只在这个文件里。

这篇文章其实就想说一件事:蓝牙扫描不是搜一下就行,设备过滤、排序、连接建立,每个环节的细节决定了工业现场的体验。把 BLE 扫描的五秒变成一秒,把"连不上"变成"三秒重连",就是这些细节堆出来的。



相关仓库:github.com/jlink-ai/rokid-glasses-bt · Apache 2.0

下一篇聊聊连接状态机和失败模型——也就是那个"SOCKET_CONNECT_FAILED"到底是怎么来的,以及为什么每一种错误都应该对应一个明确的操作指引。

相关文章
|
16天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
6010 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
1天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
572 135
|
11天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1187 3
|
8天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
990 1
|
18天前
|
人工智能 自然语言处理 供应链
|
9天前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
808 5
|
9天前
|
运维
欢迎报名|2026 Agentic AICon—智能体基础设施与AgentOps专场,邀您参会
欢迎报名|2026 Agentic AICon—智能体基础设施与AgentOps专场,邀您参会
1442 0

热门文章

最新文章