PBAP协议 简单介绍
以下的内容摘自PBAP规范1.2.3
1,phone book object类型
- pb:主电话本。有的电话本数据是存储在手机本身里,还有的存储在SIM卡里。
- ich:接电话列表。
- och:打电话列表。
- mch:未接电话列表。
- cch:所以通话记录列表。包括ich,och,mch
- spd:快速拨号列表。
- fav:收藏号码列表。
2,phone book object里放的是啥
放的是vcard object的集合。
vcard object:包括联系人的具体信息。比如,姓名,住址,电话,邮件等。所使用的字符集是UTF-8.
vcard例子:必须以BEGIN:VCARD开头,以END:VCARD结尾。
BEGIN:VCARD
VERSION:2.1
FN:Jean Dupont
N:Dupont;Jean
ADR;WORK; QUOTED-PRINTABLE:;Paris 75010;91 Rue du Faubourg Saint-Martin
TEL;CELL;PREF:+1234 56789
EMAIL;INTERNET:jean.dupont@example.com
X-BT-SPEEDDIALKEY:F1
END:VCARD
3,phone book object representation
- File representation:被看作成一个单一的文件,包含所有响应的phone book entries。
- Folder representation:被看作成一个虚拟的文件夹,包含所有响应的phone book entries。里面的每个entry被看作成一个文件。
4,如何区分vcard里的电话是未接的还是打出的等
vcard object里有区分MISSED(未接的),RECEIVED(接听的),DIALED(拨出的)
例子:2005年3月20日,上午10点,有一个未接电话。
-
vCard 2.1的标识形式:
BEGIN:VCARD ... X-IRMC-CALL-DATETIME;MISSED:20050320T100000 ... END:VCARD
-
vCard 3.0的标识形式:
BEGIN:VCARD ... X-IRMC-CALL-DATETIME;TYPE=MISSED:20050320T100000 ... END:VCARD
如果来电的时候,恰巧设备的时间系统出了问题,无法取得时间的话,vcard object如下:
BEGIN:VCARD
...
X-IRMC-CALL-DATETIME;TYPE=MISSED:
...
END:VCARD
快速拨号,怎么标识呢?字符串F1是任意的,推荐使用"5","A","ALT","SPACE","F1"等。
BEGIN:VCARD
...
X-BT-SPEEDDIALKEY:F1
...
END:VCARD
5,phone book的组织形式
是用虚拟文件夹组织的。
handle.vcf就代表一个vcard objec。handle是不可以被修改的,handle不能重复。handle是4个字节,用16进制标识。比如:0x791A2F23.vcf。handle就是0x791A2F23。
5.1 本地存储:pb 和 SIM卡
存放在pb里的vcard object是在文件夹:telecom下。
存放在SIM卡1里的vcard object是在文件夹:SIM1/telecom下。
0x00000000.vcf里放的是本手机的号码,如果本手机有号码的话。
5.2 vCard-listing object
除了vcard object外,还有vCard-listing object,它是xml格式的,字符集的UTF-8。规定vCard-listing object格式的DTD如下:
<!DTD for the PBAP vCard-Listing Object-->
<!ELEMENT vcard-listing ( card )* >
<!ATTLIST vcard-listing version CDATA #FIXED “1.0”>
<!ELEMENT card EMPTY>
<!ATTLIST card
handle CDATA #REQUIRED
name CDATA #IMPLIED >
vCard-listing object例子:
<?xml version=“1.0”?>
<!DOCTYPE vcard-listing SYSTEM “vcard-listing.dtd”>
<vCard-listing version=“1.0”>
<card handle = ”0.vcf” name = ”Miyajima;Andy”/>
<card handle = ”1.vcf” name = ”Poujade;Guillaume”/>
<card handle = ”2.vcf” name = ”Hung;Scott”/>
<card handle = ”3.vcf” name = ”Afonso;Arthur”/>
<card handle = ”6.vcf” name = ”McHardy;Jamie”/>
<card handle = ”7.vcf” name = ”Toropov;Dmitri”/>
<card handle = ”10.vcf” name = ”Weinans;Erwin”/>
</vCard-listing>
-
name属性的格式:“LastName;FirstName;MiddleName;Prefix;Suffix”
对应vcard objec里的N属性。
vCard-listing object可以用于表示未接电话列表等。
6,PABP都有哪功能
如下表:
PBAP协议是使用obex协议的,obex协议里有很多种header(参考obex协议),其中有个header叫做:Application Parameters header。Application Parameters header里面可以放很多tag-length-value triplet。
- tag:代表具体的功能
- length:长度
- value:功能的值。
代表PBAP功能的tagid是:0x10;length是4个字节,有32个bit位,每一个bit位代表一个PBAP的功能。
- Bit0 = Download
- Bit 1 = Browsing
- Bit 2 = Database Identifier
- Bit 3 = Folder Version Counters
- Bit 4 = vCard Selecting
- Bit 5 = Enhanced Missed Calls
- Bit 6 = X-BT-UCI vCard Property
- Bit 7 = X-BT-UID vCard Property
- Bit 8 = Contact Referencing
- Bit 9 = Default Contact Image Format
- Bit 10 ~ 31 Reserved
6.1 download功能
下载phone book objec里的所有entry。使用function:PullPhonebook
6.2 Browsing
有3个function: SetPhonebook,PullvCardListing,PullvCardEntry
- SetPhonebook:选择感兴趣的phone object
- PullvCardListing:client使用此function获取感兴趣的phone object 列表
- PullvCardEntry:client使用此function获取感兴趣的phone object
6.3 Application Parameters header里的tag介绍
-
PropertySelector{PropertyMask (64-bit value)}:每个bit位代表一个vcard object里的属性。
如果client想让server返回的vcard objec里包含,生日和地址的话,则需要把bit4和bit5设置为1.
如果想让server返回下表所有的vcard object属性,则全部设置为0.
-
Format
-
MaxListCount
client告诉server我能处理的最大vcard object的数量。如果值为0,有特殊含义,参考pbap规范说明。
-
ListStartOffset
假设返回多个vcard object,这些vcard object会被排序,如果能返回10个,而且ListStartOffset为0的话,则10个全部返回;如果ListStartOffset为2,则返回8个?? 第一个和第二个不返回??
-
vCardSelector
假设server找到了符合条件的100个entry,还可以继续根据vCardSelector指定的筛选条件,来继续筛选,最后可能剩下30个entry返回给client。所谓的筛选条件就是返回的vcard object里的某个属性必须不是空。如果为空,则此vcard object不返回给client。它经常和vCardSelectorOperator一起使用。vCardSelectorOperator是指定复数属性的条件关系是OR 还是 AND,如果没有使用vCardSelectorOperator则是OR。
例子:筛选生日和地址都不为空的vcard object。
则必须指定vCardSelector和vCardSelectorOperator,并且vCardSelectorOperator的值是AND,vCardSelector的生日bit位和地址bit位必须设置为1.具体哪个bit位代表哪个属性,则参考PropertySelector
-
vCardSelectorOperator
不出现在Application Parameters header里,则是OR。
-
PhonebookSize
如果client没有使用MaxListCount,则server返回PhonebookSize,告诉client,server返回了几个非空的vcard objec。
-
ResetNewMissedCalls
client发起重新设置server的mch的数量时,设置ResetNewMissedCalls的值为0x01,0x01以外的值都会被server忽略。server收到后,重新设置mch的数量后,并使用NewMissedCalls,设置它的值为上一次mch的数量给client。ResetNewMissedCalls设置只对mch和cch有效。
-
NewMissedCalls
-
Folder Version
包含2个,PrimaryFolderVersion和SecondaryFolderVersion。
当response成功时,server必须返回PrimaryFolderVersion和SecondaryFolderVersion。前提是pse和pce的Folder Version Counters的功能bit位都处于打开状态。
- PrimaryFolderVersion:每次完成对vCard中任何属性的更改以及插入或删除条目时,主文件夹版本计数器应递增。
- SecondaryFolderVersion:二级文件夹版本计数器只能在每次更改vCard的N、FN、TEL、EMAIL、MAILER、ADR、X-BT-UCI属性以及插入或删除条目时增加
-
Database Identifier
当response成功时,server都会返回Database Identifier。它由server做成,并且唯一,而且server还会存储它。是128bit的值。
需要数据库标识符来检测上一个会话中的Contact X-BT-UIDs或文件夹版本计数器是否仍然可以用于当前数据库。如果由于任何原因必须重置数据库,客户机将能够通过比较当前会话的数据库标识符与前一个会话期间检索到的标识符来检测到这一点。
如果此值为0,则说明server不保存Contact X-BT-UID(蓝牙联系人的唯一标识)和Folder Version Counter,所有client则不要使用Contact X-BT-UID和Folder Version Counter
只有当pce和pse的Database Identifier功能bit被设定后,Database Identifier才有作用。
7,phone book access profile functions
7.1 PullPhoneBook function
这个function,检索整个phone book object,一般用户从root目录开始检索。phone book downloading and phone book browsing services都使用此function。也可以从别的目录开始检索。
The request is formatted as follows:
请求pse当前目录下的所有vcf文件(*.vcf);类型是:x-bt/phonebook
主要关注一下Application Parameters header,其他的header可以参考obex规范里的介绍。
- PropertySelector:指定vcard object里包含哪些属性。
- Format:指定vcard的版本号
- MaxListCount:告诉pse,pce能处理的最大vcard object的数量
- ListStartOffset:偏移位置
- ResetNewMissedCalls:让pse重置mch的数量
- vCardSelector:指定vcard object的属性,来进行筛选
- vCardSelectorOperator:筛选的办法(or或者and)
The response is formatted as follows:
返回所有vcf文件给pce。
主要关注一下Application Parameters header,其他的header可以参考obex规范里的介绍。
- PhonebookSize:pse返回的vcard object的数量
- NewMissedCalls:pse返回的重置前的mch的数量
- PrimaryFolderVersion:参考PrimaryFolderVersion
- SecondaryFolderVersion:SetPhoneBook functionSecondaryFolderVersion
- DatabaseIdentifier:参考DatabaseIdentifier
7.2 SetPhoneBook function
设置pse的当前文件夹
The request is formatted as follows:
- flags header:
- up:向上一级
- down:进入当前目录的子目录,子目录的名字在name header里
- root:进入root目录
- name header:当flags为down时,name header放子目录的名字。
The response is formatted as follows:
7.3 PullvCardListing function
This function retrieves the PSE’s Phonebook-listing object.
The request is formatted as follows:
要求pse返回name header指定的文件夹下的符合要求的vcard objec 列表文件。
-
order:指定排序方法。0x00:indexed;0x01:Alphabetical;0x02 =:phonetic
-
Indexed order:按照handle.vcf的handle部分排序(按文件的名字排序)
-
Alphabetical order:根据N property排序
-
phonetic order:根据Sond property排序
-
SearchProperty
由于请求的是vard object列表,所有就要指定你想要哪些vcard object,怎么指定呢,就是通过此属性。如果没有指定,则默认用name属性去搜索了,具体搜索哪些,则由SearchValue 指定。
注意:如果指定的是Sound的话,必须把Sound转化成UTF-8文本格式后,才能做比较。
-
SearchValue
指定具体的搜索值。比较的字符集必须是UTF-8的
The response is formatted as follows:
7.4 PullvCardEntry Function
This function retrieves a specific vCard from the object exchange server.
The request is formatted as follows:
- name:指定想要的具体的vcard object。这里不可以加路径信息,只能要当前目录下的某个vcf文件。但是如果指定了X-BT-UID(varc object的唯一标识),如果pse里有此object,则不管这个object在哪个文件夹,都会返回给pce,如果没有则返回NOT FOUND。
The response is formatted as follows: