小弟开发android,遇到关于基于蓝牙的"电话本访问协议(PBAP)"的一个问题。。

D_ning D_ning 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
小弟在Android系统上开发一个通过蓝牙获取他机联系人及通话记录的程序,参考相关资料后采用了PBAP协议,首先通过UUID:0000112f-0000-1000-8000-00805f9b34fb 建立BluetoothSocket连接。建立socket连接后,根据IrOBEX文档所述规则及PBAP Specification的描述,通过socket的IO流向他机传字节流,首先是写入request:
0x80 //Opcode

0x00 //packet length
0x1f

0x10 //Version 1.0 of OBEX
0x00 //flag
0x20 //8K maximum packet size
0x00

0x46 //header of target
0x00 //length
0x13

0x79 //pbap target 796135f0-f0c5-11d8-0966-0800200c9a66
0x61
0x35
0xf0
0xf0
0xc5
0x11
0xd8
0x09
0x66
0x08
0x00
0x20
0x0c
0x9a
0x66

0xc3 //irOBEX里说是 一个length header 不知道有啥用
0x00 //length为十六进制 f483
0x00
0xf4
0x83


将这一长段字节码传走后,从他机得到reaponse packet
0xa0 //成功

0x00
0x1f
0x10
0x00

0xff //他机可提供的最大packet size
0xfe

0xcb //Connection ID
0x00
0x00
0x00
0x01

0x4a //Header of Who
0x00
0x13

0x79 //pbap target 796135f0-f0c5-11d8-0966-0800200c9a66
0x61
0x35
0xf0
0xf0
0xc5
0x11
0xd8
0x09
0x66
0x08
0x00
0x20
0x0c
0x9a
0x66

得到这样的反馈即表明对OBEX服务的连接已经成功,pbap服务启动,之后进行get操作,写request字节流:


os.write((0x83));//Get Header 0x83
os.write(0x00);
os.write(0x4F);
///

os.write(0xCB);//Connection ID 0xCB
os.write(0x00);
os.write(0x00);
os.write(0x00);
os.write(0x01);




os.write(0x01);//Name
os.write(0x00);
os.write(0x21);


char[] cs = new char[] { 't', 'e', 'l', 'e', 'c', 'o', 'm','/' ,'p' ,'b' ,'.' ,'v' ,'c' ,'f'};//要转换的char数组
String str = new String(cs);
byte[] bs = str.getBytes("Unicode");
/*
for(int i0 = 0;i0<bs.length;i0++)
{
bs[i0] = (byte) (bs[i0]&0xff);
}
*/
os.write(bs);





os.write(0x42);//Type
os.write(0x00);
os.write(0x12);


char[] cs2 = new char[] { 'x', '-', 'b', 't', '/', 'p', 'h','o' ,'n' ,'e' ,'b' ,'o' ,'o' ,'k'};//要转换的char数组
String str2 = new String(cs2);
byte[] bs2 = str2.getBytes();
/*
for(int i1 = 0;i1<bs2.length;i1++)
{
bs2[i1] = (byte) (bs2[i1]&0xff);
}
*/
os.write(bs2);
os.write(0x00);

os.write(0x4C);//AppParam
os.write(0x00);//appParam length
os.write(0x14);

os.write(0x06);//Tag for Filter
os.write(0x08);//length field


os.write(0x00);//不对vcard做任何过滤 os.write(0x00);
os.write(0x00);
os.write(0x00);
os.write(0x00);
os.write(0x00);
os.write(0x00);
os.write(0x00);





os.write(0x07);//Tag for Format
os.write(0x01);//length field
os.write(0x01);//format value vcard 3.0

os.write(0x04);//Tag for MLC
os.write(0x02);//length
os.write(0xff);//0xff
os.write(0xff);//0xff



之后得到一个8字节长的response packet,opcode为C6,查询irOBEX,C6对应一个错误码,是 Not Acceptable
同时在PBAP specification上找到对Not Acceptable的一个解释:
The request is recognized and all the parameter values are legal, but there is a problem with a parameter value that indicates a request that cannot be met by the Server.
翻译一下既是:请求被识别且参数合法,但是参数不能被服务器(即他机)处理。



但是这样的一个request是参照PBAP的官方specificati所写,所以小弟十分困惑,期待各路达人的解救,百分送上!万分感谢!~~~~~~^-^
...全文

相关推荐

【BlueDroid】【PBAP】蓝牙电话本协议分析(超详细)

PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作为Server,比如手机;PCE:Phone Book Client Equipment,向PSE端请求电话本源数据的设备,作为Client,例如车机;因为PBAP协议是基于OBEX协议实现的,那PBAP协议获取数据的方式也是通过request-response形式传输的;

风云说通信

【BlueDroid】【PBAP】蓝牙电话本协议之同步通讯录分析(超详细)

Header - Type = "x-bt/vcard-listing":代表了该Request对应的Function为PullvCardListing;Profile:PBAP (4),上层应用层协议为PBAP,OBEX协议的上层应用层协议除了PBAP,还有OPP、MAP协议;Response in Frame:该request frame-485对应的Response frame为489;在PBAP协议同步通讯录和通讯记录中,都是基于OBEX协议实现的,PBAP协议作为了应用层协议;

风云说通信

Android 蓝牙 PBAP obex协议详解 - 史上最全

android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙 pbap obex rfcomm拉取联系人协议源码分析大全 - 点击下载 一、 PBAP简介 PBAP:Phone Book Access Profile的简称,电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能的设备上的通讯录和通话记录等信息。 角色定义: PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作.

短距WCN协议开发分享

【BlueDroid】【PBAP】蓝牙电话本协议之同步所有联系人分析(超详细)

我们在上述过程中,其实对很多属性都进行了保留,但是需要确保手机联系人信息中包含这些属性,例如联系人头像这一属性,很多联系人方式中并没有设置,所以同步下来的信息中没有该属性的描述,只有在极少数的联系人信息中设置过,所以会同步头像信息;同步 SIM 联系人方式和同步手机联系人方式一样,只是在SIM卡中没有保存联系人,所有获取到的信息为空,Parameter - End Of Body的value标识为;Parameter - Max List Count = 101:手机中联系人最大的count = 101;

风云说通信

Android 蓝牙——PBAP协议(十)

SDK路径:frameworks/base/core/java/android/bluetooth/服务路径:packages/apps/Bluetooth/src/com/android/bluetooth/在使用协议类的时候无法找到该类,由于安卓源码中关于蓝牙协议的 Client 部分或相关接口都被 @hide 给隐藏掉了,这样 android.jar 满足不了安卓源码 framework 层开发人员的需求,可以使用反射机制或者引用 framework.jar 代替 android.jar。

c小旭
评论 13
收藏 已收藏
分享
返回顶部
D_ning
Android 80,489 成员 91,375 内容