Android UWB无OOB硬编码参数建立测距会话时添加Controlee崩溃问题
看起来你遇到的问题是在UWB控制器会话中添加被控端(Controlee)时触发了状态检查异常,我来帮你梳理下可能的原因和解决办法:
错误原因分析
你收到的报错java.lang.IllegalStateException: Please check that the ranging is active and the ranging profile supports multi-device ranging,核心指向两个关键点:
- 当前测距会话还未进入活跃状态
- 当前UWB配置可能不支持目标场景的测距(或参数不匹配)
具体修复方案
1. 等待会话完全激活后再添加Controlee
你的代码中,调用controllerSession.prepareSession()后立刻启动了sessionFlow的收集,但紧接着就调用addControlee——这时候会话可能还在初始化阶段,并没有真正进入活跃状态,触发了状态检查失败。
你需要监听会话启动的事件,确认会话激活后再执行添加操作。修改你的collect逻辑:
CoroutineScope(Dispatchers.Main.immediate).launch { sessionFlow.collect { when(it) { is RangingResult.RangingResultSessionStarted -> { // 会话已正式激活,此时再添加Controlee try { controllerSession.addControlee(uwbDevice.address) Log.d(TAG, "Controlee添加成功") } catch (e: Exception) { Log.e(TAG, "添加Controlee失败", e) } } is RangingResult.RangingResultPosition -> { doSomethingWithThePosition(it.position) } is RangingResult.RangingResultPeerDisconnected -> handlePeerDisconnect(it) is RangingResult.RangingResultError -> { Log.e(TAG, "会话发生错误: ${it.reason}") } // 处理其他可能的会话状态 } } }
2. 确保两端参数完全一致(硬编码场景的核心要求)
因为你没有使用BLE/WiFi等OOB机制传递参数,Controller和Controlee两端的所有关键参数必须完全匹配,否则会话无法建立:
sessionId和subSessionId:两端必须设置相同的值(你当前设为0,没问题,但要确保Controlee端也是0)uwbChannel:两端的通道号(5)和脉冲重复频率(9)必须一致uwbConfigType:两端都使用CONFIG_UNICAST_DS_TWR是没问题的(单播双向测距,支持一对一场景)
3. 检查Controlee端的会话初始化逻辑
Controlee端必须提前启动会话并处于等待状态,否则Controller端无法添加成功。参考Controlee端的初始化代码:
suspend fun startControleeSession() { val controleeSession = uwbManager.controleeSessionScope() val controleeParams = RangingParameters( uwbConfigType = RangingParameters.CONFIG_UNICAST_DS_TWR, sessionId = 0, // 和Controller端完全一致 subSessionId = 0, // 和Controller端完全一致 sessionKeyInfo = null, subSessionKeyInfo = null, complexChannel = uwbChannel, // 和Controller端完全一致 peerDevices = listOf(UwbDevice.createForAddress("Controller的UWB地址")), // 硬编码Controller地址 updateRateType = RangingParameters.RANGING_UPDATE_RATE_AUTOMATIC ) controleeSession.prepareSession(controleeParams).collect { result -> when(result) { is RangingResult.RangingResultSessionStarted -> { Log.d(TAG, "Controlee会话已启动,等待Controller连接") } // 处理其他结果事件 } } }
4. 修正UWB设备地址格式
你当前使用的"42:43"是不完整的UWB设备地址,UWB地址通常是6字节的MAC格式(比如"AA:BB:CC:DD:EE:FF"),错误的地址格式会导致设备识别失败,进而影响会话流程。请确认并使用完整的设备地址。
总结
最可能导致崩溃的原因是会话未激活就调用了addControlee,先通过监听RangingResultSessionStarted事件确认会话状态,再执行添加操作,同时确保两端参数完全匹配,应该就能解决问题。
备注:内容来源于stack exchange,提问作者Przemyslaw

