You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中基于BLE实现UWB通信的参数获取及无广播可行性咨询

Android BLE 辅助UWB通信实现疑问

我希望在Android设备间借助Bluetooth(BLE)实现UWB通信,参考了Google的UwbRanging示例(原示例用Nearby API建立连接并创建会话)。现在想基于原生BLE的扫描/广播能力替代Nearby API的发现逻辑,并解决以下问题:

现有参考代码(Nearby API实现)

控制器端发现逻辑

fun startDiscovery() = callbackFlow {
    dispatchEvent = { trySend(it) }
    coroutineScope.launch {
      connectionsClient
        .startDiscovery(
          CONNECTION_SERVICE_ID,
          endpointDiscoveryCallback,
          DiscoveryOptions.Builder().setStrategy(Strategy.P2P_CLUSTER).build()
        )
        .await()
    }
}

受控端广播逻辑

fun startAdvertising() = callbackFlow {
    dispatchEvent = { trySend(it) }
    coroutineScope.launch {
      connectionsClient
        .startAdvertising(
          CONNECTION_NAME,
          CONNECTION_SERVICE_ID,
          connectionLifecycleCallback,
          AdvertisingOptions.Builder().setStrategy(Strategy.P2P_CLUSTER).build()
        )
        .await()
    }
    awaitClose {
      disconnectAll()
      connectionsClient.stopAdvertising()
    }
}

端点发现与连接请求

private val endpointDiscoveryCallback =
    object : EndpointDiscoveryCallback() {
      override fun onEndpointFound(endpointId: String, info: DiscoveredEndpointInfo) {
        Log.d("endpointid",endpointId + info.endpointName + " " + info.endpointInfo)
        coroutineScope.launch {
          connectionsClient
            .requestConnection(CONNECTION_NAME, endpointId, connectionLifecycleCallback)
        }
      }
}

BLE原生能力参考

BLE原生扫描与广播核心方法:

bluetoothLeScanner?.startScan(scanCallback)
advertiser.startAdvertisingSet(parameters, data, null, null, null, callback);

核心疑问

我需要了解BLE扫描/广播能获取的数据,以及如何用这些数据生成UWB测距所需的参数:

val uwbConfigType: Int,
val sessionId: Int,
val sessionKeyInfo: ByteArray?,
val complexChannel: UwbComplexChannel?,
val peerDevices: List<UwbDevice>,
val updateRateType: Int

具体问题:

  1. 如何通过BLE获取并生成上述UWB测距参数?
  2. 能否无需BLE客户端广播实现该UWB通信功能?

问题解答

1. 通过BLE生成UWB测距参数的实现思路

BLE的核心作用是设备发现+轻量数据交换,本身无法直接提供UWB会话所需的全部参数,需通过自定义BLE广播/GATT数据的方式传递必要信息,具体对应方案如下:

BLE可获取的核心数据

  • 扫描端通过ScanCallback能拿到:
    • 设备MAC地址(ScanResult.device.address)
    • 自定义广播数据(ScanResult.scanRecord.bytes)
    • 信号强度(RSSI)
  • 广播端可通过AdvertiseData添加自定义厂商数据(Manufacturer Data)或服务UUID,用于标识UWB设备并携带基础参数

UWB参数的生成与传递

UWB参数具体实现方式
uwbConfigType可提前约定固定值(比如FiRa标准的CONFIG_TYPE_FIRA_DEFAULT),也可在BLE广播的厂商数据中用1字节传递标识
sessionId由发起方生成随机Int值,建议通过BLE GATT连接后传输(广播包长度有限);若场景简单,也可在广播中携带短整数
sessionKeyInfo属于加密敏感数据,严禁放在广播包,必须通过BLE GATT加密特征值传输;或采用预共享密钥方案,无需传输
complexChannel优先提前约定固定信道(比如FiRa默认信道),若需动态调整,可将UwbComplexChannel序列化为字节数组,通过GATT特征值传递
peerDevices扫描端拿到对方MAC地址后,调用UwbManager.getUwbAddress(macAddress)转换为UwbDevice实例;多设备场景下,可通过BLE广播的服务UUID标识UWB设备组
updateRateType同uwbConfigType,可提前约定或在广播厂商数据中用1字节传递

典型流程

  1. UWB受控端开启BLE广播,携带厂商数据(包含uwbConfigType、updateRateType标识)
  2. 控制器端扫描到BLE广播,解析参数后发起GATT连接
  3. 连接建立后,控制器生成sessionId并通过GATT发送给受控端,双方协商sessionKeyInfo和complexChannel
  4. 双方用所有参数初始化UWB会话,启动测距

2. 无需BLE客户端广播的可行性

可以实现,但需要替换设备发现机制,常见方案:

  • UWB主动扫描:部分支持FiRa标准的UWB芯片自带主动发现能力,无需BLE辅助即可扫描周边UWB设备。但需设备硬件支持,且Android UWB API是否暴露该能力取决于厂商适配。
  • Wi-Fi直连/局域网发现:通过Wi-Fi直连的设备发现功能,或局域网mDNS服务定位对方设备,再通过Wi-Fi通道交换UWB会话参数。适合已在同一局域网的设备。
  • NFC碰传:利用NFC标签传递sessionId、uwbConfigType等核心参数,触发UWB连接。适合近距离快速配对场景。

注意事项:

  • 无BLE时,设备发现的范围和功耗表现不如BLE(UWB主动扫描功耗较高,Wi-Fi直连需先建立连接)
  • 部分Android设备的UWB能力依赖Nearby框架,脱离Nearby使用原生UWB API可能需要额外适配

内容的提问来源于stack exchange,提问作者Pritish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:45:39