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
具体问题:
- 如何通过BLE获取并生成上述UWB测距参数?
- 能否无需BLE客户端广播实现该UWB通信功能?
问题解答
1. 通过BLE生成UWB测距参数的实现思路
BLE的核心作用是设备发现+轻量数据交换,本身无法直接提供UWB会话所需的全部参数,需通过自定义BLE广播/GATT数据的方式传递必要信息,具体对应方案如下:
BLE可获取的核心数据
- 扫描端通过
ScanCallback能拿到:- 设备MAC地址(
ScanResult.device.address) - 自定义广播数据(
ScanResult.scanRecord.bytes) - 信号强度(RSSI)
- 设备MAC地址(
- 广播端可通过
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字节传递 |
典型流程
- UWB受控端开启BLE广播,携带厂商数据(包含
uwbConfigType、updateRateType标识) - 控制器端扫描到BLE广播,解析参数后发起GATT连接
- 连接建立后,控制器生成
sessionId并通过GATT发送给受控端,双方协商sessionKeyInfo和complexChannel - 双方用所有参数初始化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
相关产品推荐
相关产品推荐

