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"到底是怎么来的,以及为什么每一种错误都应该对应一个明确的操作指引。

相关文章
|
4月前
|
人工智能 数据可视化 5G
一线互联 × Rokid AI眼镜:为什么它是工业4.0时代一线人员的标准装备?
Gartner预测:2027年30%工业企业将为一线员工标配AI眼镜(2023年仅5%)。Rokid灵伴眼镜+一线互联jLink,以轻量化硬件、5G低延时网络与任务驱动型协作系统,实现远程指导、过程留痕、数据归档闭环,助力企业降本增效、沉淀数字资产。(239字)
276 2
|
5月前
|
安全 关系型数据库 API
跨平台办公数据集成:钉钉与飞书表格自动化的工程实践
本文提出轻量级跨平台数据集成方案,通过节点化抽象钉钉表格与飞书多维表操作,借助流程编排引擎实现双向同步;支持定时/事件触发,覆盖财务汇总、周报生成等场景,并可在阿里云上集成RDS、FC、SLS等服务提升稳定性与可观测性。(239字)
|
11月前
|
传感器 人工智能 架构师
戴上眼镜就能“边看边问”?阿里云 × Rokid 揭秘AI实时互动黑科技
戴上AI眼镜,世界即时“开口说话”!识别食物、实时翻译、维修指引,毫秒级交互已成现实。阿里云与Rokid专家联袂揭秘AI实时互动技术,解析低延迟、高并发下的“所见即所得”如何实现。11月19日19:30,直播揭晓智能感知新未来。
358 0
|
10月前
|
人工智能 算法 安全
室内外融合定位系统从核心架构、技术原理到部署实施流程等详解(四)
本文详解工业级室内外融合定位系统的精度保障与误差控制,涵盖硬件选型、算法优化与部署策略,分析化工、管廊、制造等场景的应用成效,展现“北斗+UWB”无缝衔接的高精度定位方案及其在安全管理与运营优化中的核心价值。如果您想进一步了解室内外融合定位技术和案例,欢迎搜索维构lbs智能定位~
|
7月前
|
人工智能 数据挖掘 Linux
阿里云/本地部署OpenClaw 配置 AI Agent团队实战:从1扩至8再精简为4的完整复盘+避坑指南
在AI Agent全面落地的2026年,越来越多用户尝试用OpenClaw(Clawdbot)搭建专属AI团队,替代人工完成内容创作、运营分发、技术维护、数据分析等工作。但很多人在搭建过程中陷入盲目扩张误区:从单个智能体起步,不断新增角色,最终导致管理成本飙升、上下文断裂、产出质量下滑、系统资源浪费。
864 2
|
5月前
|
编解码 网络安全
如何利用Aeroshell的VNC连接功能 ?基于Deepin桌面环境配置远程桌面完整指南
本文详解Deepin DDE下TigerVNC远程桌面黑屏/断连问题的根因与解决方案:绕过systemd依赖,手动启动dde-session、dock等核心组件,并配置dbus环境;附tigervnc 共享桌面备选方案及防火墙、自启配置,实测可用。(239字)
380 0
|
存储 供应链 JavaScript
ERP系统生产管理全流程解析
ERP系统为企业提供集成化生产管理解决方案,涵盖从销售预测、主生产计划、物料需求计划到生产订单下达、过程控制及成品入库的全流程。通过规范生产流程,提升计划准确性与执行效率,实现资源优化配置。实施时需注重前期规划、员工培训、数据管理及持续优化,确保系统有效支撑企业生产运营。
781 3
|
调度 数据库 Python
Python异步编程入门:asyncio让并发变得更简单
Python异步编程入门:asyncio让并发变得更简单
572 5
|
人工智能 算法 C++
浅谈 KMP
KMP算法是一种高效的字符串匹配算法,由Knuth、Morris和Pratt提出。它通过预处理模式串构建next数组,利用匹配失败时的信息减少重复比较,从而提升匹配效率。其时间复杂度为O(m+n),适用于大规模文本匹配场景。
699 0
|
机器学习/深度学习 人工智能 自然语言处理
智能化软件测试:AI驱动的自动化测试策略与实践####
本文深入探讨了人工智能(AI)在软件测试领域的创新应用,通过分析AI技术如何优化测试流程、提升测试效率及质量,阐述了智能化软件测试的核心价值。文章首先概述了传统软件测试面临的挑战,随后详细介绍了AI驱动的自动化测试工具与框架,包括自然语言处理(NLP)、机器学习(ML)算法在缺陷预测、测试用例生成及自动化回归测试中的应用实例。最后,文章展望了智能化软件测试的未来发展趋势,强调了持续学习与适应能力对于保持测试策略有效性的重要性。 ####

热门文章

最新文章