miracast投屏断开连接移除设备导致再次投屏失败
1、问题背景:【B0325】【GK6320】【Miracast投屏】【高概率1/5】Miracast投屏Source端可以看到Sink端,但概率连接不上(一旦出现会持续连不上)
https://e.gitee.com/kunyuan-hongke/projects/842189/bugs/table?issue=IHQQB3
2、预置条件:Sink端设备与HarmonyOS Next设备通过点对点方式连接成功,Sink端设备已在HarmonyOS Next设备的可用设备列表中被发现
3、问题概率:高概率1/5
4、恢复手段:重启TV端设备后,连接成功
5、初步分析:分析最初的日志发现组网过程不稳定,且存在频率冲突的问题,故合入指定TV端为GO的修改,编译后发现第二次投屏接近必现失败,重新抓日志继续分析
6、继续分析
打开投屏应用,创建持久GO组

首次连接

断开连接

再次连接

关键报错
Line 55179: 04-01 11:44:05.258 3236 7182 E C01563/P2pStateMachine: deviceList.size <= 0
Line 55180: 04-01 11:44:05.258 3236 7182 E C01563/P2pStateMachine: current connected device not found the Gc
Line 55181: 04-01 11:44:05.258 3236 7182 E C01563/P2pStateMachine: AddClientInfo failed
连接失败,断开连接

定位后发现底层P2P通路虽然成功建立,但是P2P状态机异常(见关键报错,devicelist列表不对),报错显示当前设备列表为0

设备列表从此处获取,发现这里返回的是p2pdevices的值,该值不大于0导致状态机连接失败

查找所有会影响到该值的位置,加打印追踪变更流程,发现是断开连接事件触发了设备移除,导致devicelist为空

如下的宏为138

代码流程如下,AP_STA_CONNECTED绑定了如下接口,接收到该消息时执行该回调,回调函数里面调用remove接口,设备被移除



综上,在每次断开连接时,当前连接的设备会被清除
继续分析设备的更新流程,发现是设备发现指令触发了devicelist的更新


流程如下



综上可知,无论devicelist的增加还是移除都是跟wpa的指令绑定的,每次收到P2P-DEVICE-FOUND指令框架层就会执行设备列表的更新动作,但是当前方案我们创建的是永久组,每次断开连接不会移除组,再次连接也不会有该P2P-DEVICE-FOUND指令,因此就无法触发设备的更新操作,而之前断开连接的时候AP-STA-DISCONNECTED指令会触发设备移除,所以再次连接时设备列表为空,投屏会报错。而如果退出投屏应用再次进入的话,此时会经历一遍完整的销毁组再创建组的流程,所有指令都会执行一遍,因此不会有异常。
7、解决方案
由于再次连接时不会有P2P-DEVICE-FOUND指令了,因此在第一次断开连接时就不应该有移除设备的操作,结合日志分析流程可知在每次退出投屏、移除P2P接口的时候设备也会被移除,因此可知不需要在每次断开连接时附带移除设备的动作,画蛇添足(正常由指令P2P_EVENT_DEVICE_LOST触发移除)

将上述代码行移除,问题解决
8、其他思路(供参考)
(1)、是否可以将设备更新跟其它每次连接必然触发的指令绑定起来
(2)、是否可以更换设备更新函数的触发方式,例如修改为自动扫描触发以规避难以实现的条件
(3)、是否可以调整WPA层的流程,使其每次连接都走一遍完整的流程
更多推荐


所有评论(0)