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

Android UWB无OOB硬编码参数建立测距会话时添加Controlee崩溃问题

Android UWB无OOB硬编码参数建立测距会话时添加Controlee崩溃问题

看起来你遇到的问题是在UWB控制器会话中添加被控端(Controlee)时触发了状态检查异常,我来帮你梳理下可能的原因和解决办法:

错误原因分析

你收到的报错java.lang.IllegalStateException: Please check that the ranging is active and the ranging profile supports multi-device ranging,核心指向两个关键点:

  1. 当前测距会话还未进入活跃状态
  2. 当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 13:02:57