小弟开发android,遇到关于基于蓝牙的"电话本访问协议(PBAP)"的一个问题。。
小弟在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所写,所以小弟十分困惑,期待各路达人的解救,百分送上!万分感谢!~~~~~~^-^ socket 蓝牙 pbap obex 电话本 --------------------编程问答-------------------- 有没有试一下SetPhoneBook 请求能不能走通? --------------------编程问答-------------------- 我最近也在研究这个,不知道楼主研究的怎么样了,求资料! --------------------编程问答-------------------- 楼主给个联系方式吧,真心有问题请教!跪求!!!
补充:移动开发 , Android