[Bluetooth] 下载电话本时OBEX反馈Not_Acceptable的问题分析

最近在调试蓝牙PBAP协议时遇到了一个问题,新写的代码“无法从Android手机下载电话本”,但是iPhone无此问题。

无法下载的原因如下图所示,在pull vCard-list时,手机反馈”Not Acceptable”,而且试验了多部主流Android手机都存在此问题。

[Bluetooth] 下载电话本时OBEX反馈Not_Acceptable的问题分析_第1张图片

对比了iPhone和Android手机的HCI Log,关键信息(除Connection ID)完全一致,对比了其他可以从Android手机下载电话本HCI Log,也未发现异常。

既然对比HCI Log无法发现差异点,只能从根源查找Root Cause:

1.查找了Spec说明,“请求可以被识别,参数合法,但是参数不能被Server处理”,

似乎也没有得到有帮助的信息,以前也遇到过个别手机无法下载SIM卡上的电话本,会回复该Error Code,但目前是所有Android手机都有问题,必须处理。

 

2.好在现在的Android手机蓝牙的代码都是开放的,手机厂商改动很小,查阅源码,查看什么情况会反馈“Not Acceptable”这一Error Code:

PBAP协议中主要集中在onConnect/onGet/pullVcardEntry/pullPhonebook,那么对于我们这一题,要重点关注的自然是onGet()

[Bluetooth] 下载电话本时OBEX反馈Not_Acceptable的问题分析_第2张图片

 

逐一甄别onGet函数中的各个Case,最终定位到了问题位置:type.equals(TYPE_LISTING)不成立!

[Bluetooth] 下载电话本时OBEX反馈Not_Acceptable的问题分析_第3张图片

根据代码,再次查看HCI Log,突然发现,Type: x-bt/vcard-listing后面居然还有一个“.”,其实该字节的值是0x12。(出错的原因就不细说了,0x12是个随机值,赋值的变量未初始化)

[Bluetooth] 下载电话本时OBEX反馈Not_Acceptable的问题分析_第4张图片

由此,也可以猜想iPhone没有问题是因为其过滤掉了后面这个点,只取了关键字,Android系统未作过滤,因此,暴露了此问题。

 

你可能感兴趣的:(蓝牙技术,Android系统)