以下的內容摘自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 { vCard2.1 | vCard3.0 }
-
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{ OR | AND }
不出現在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 {Name | Number | Sound }
由於請求的是vard object列表,所有就要指定你想要哪些vcard object,怎么指定呢,就是通過此屬性。如果沒有指定,則默認用name屬性去搜索了,具體搜索哪些,則由SearchValue 指定。
注意:如果指定的是Sound的話,必須把Sound轉化成UTF-8文本格式后,才能做比較。
-
SearchValue {<text string>}
指定具體的搜索值。比較的字符集必須是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: