背景
之前在https://blog.csdn.net/Jzj1234555/article/details/142518444?spm=1001.2014.3001.5501 这个帖子介绍了调试LE AUDIO碰到的手机UI界面显示“连接成功但听不到音乐的问题”,原本以为是手机创建L2CAP CB CONNECTION的时候credit给的太小,通过加大credit也许能解决这个问题,于是我把credit从原来的3个改成了20个,足够大了吧,以为能解决,结果发现事与愿违,依然是”已连接(无手机或媒体信号)“,于是乎继续巴拉巴拉,看看到底问题出在哪里。
问题分析
-
首先查看手机的logcat log,发现依然是credit不够导致手机发包不出去:
从上面logcat log看问题发生在14:52:48.532 ,然后查看手机的HCI btsnoop log:
-
最左边蓝色方格的是L2CAP CB创建,也就是packet #3280,能看到耳机回复了初始化credit为20,DCID == 0x4E。
-
红色框框里是手机在DCID 0x4E上的ATT操作,每一个包都需要申请一个credit,数一下一共有20个,从packet #3281到#3386。 可以看到申请的第20个credit packet #3386的时间点是14:52:48.503,logcat显示问题点在14:52:48.532,所以比较吻合。
-
红色方格表示耳机在DCID 0x4E上的credit update(packet #3391),也就是说20个credit耗完了,耳机才更新credit,告诉手机,我还有20个buffer可以用。
总结
综上所述,耳机只有在所有credit耗完才会更新credit,如果手机在申请不到credit,就把数据包丢弃,而不是存储起来等待耳机更新了credit之后择机再发送的话,就会有问题。当然耳机这边也是有问题的,不应该等所有credit耗尽才更新,而应该是自己设置好处理了多少个credit之后,能够及时更新反馈给手机(比如耳机的credit 为6,处理完3个credit就更新给手机)。