作者:馬建輝;呂夢(mèng)興;王知學(xué);于良杰;成巍
SyncML與藍(lán)牙協(xié)議
圖1為SyncML的藍(lán)牙應(yīng)用協(xié)議結(jié)構(gòu)圖。依據(jù)SyncML協(xié)會(huì)定義的藍(lán)牙綁定協(xié)議,SyncML服務(wù)器的藍(lán)牙實(shí)現(xiàn)需要用到SDP和OBEX協(xié)議,電話簿同步應(yīng)用需要用到vCard規(guī)范。SDP協(xié)議用于SyncML服務(wù)器藍(lán)牙服務(wù)的注冊(cè),查詢藍(lán)牙手機(jī)的SyncML客戶端服務(wù)以在RFCOMM層上建立藍(lán)牙連接,該RFCOMM連接是SyncML連接的基礎(chǔ);OBEX(Object Exchange)是對(duì)象交換協(xié)議,它管理SyncML服務(wù)的連接,將SyncML文檔封裝為Object進(jìn)行傳輸并控制傳輸過程;vCard規(guī)范是電子名片規(guī)范,定義了個(gè)人名片信息的標(biāo)準(zhǔn)格式,方便傳播和交換。下面從這三個(gè)方面介紹SyncML的電話薄同步應(yīng)用的關(guān)鍵點(diǎn)。
SDP在SyncML中的應(yīng)用
SyncML綁定協(xié)議中定義了SyncML客戶端和服務(wù)器的SDP紀(jì)錄。
SDP是藍(lán)牙服務(wù)發(fā)現(xiàn)協(xié)議,它提供了注冊(cè)藍(lán)牙服務(wù)和搜索及瀏覽藍(lán)牙服務(wù)的方法。注冊(cè)藍(lán)牙服務(wù)是本地行為,以Service Discovery DataBase即服務(wù)發(fā)現(xiàn)數(shù)據(jù)庫(kù)的形式紀(jì)錄,每條Record即服務(wù)發(fā)現(xiàn)數(shù)據(jù)庫(kù)中的一個(gè)條目。搜索及瀏覽則基于C/S結(jié)構(gòu)(客戶端/服務(wù)器)的請(qǐng)求-響應(yīng)形式,使得客戶端可以訪問服務(wù)器端的服務(wù)數(shù)據(jù)庫(kù)。
作為SyncML的服務(wù)器端,首先需要注冊(cè)該藍(lán)牙服務(wù)并處于pageable(可被尋呼)狀態(tài),這樣才能被藍(lán)牙手機(jī)發(fā)現(xiàn)本地設(shè)備的SyncML服務(wù)。SDP Record以結(jié)構(gòu)體形式定義,定義了若干屬性和數(shù)據(jù)類型,包括ServiceClassIDList、protocolDescriptorList、 Service Name、ServiceDescription等,其中ServiceClassIDList屬性是最為重要的,以全局唯一標(biāo)識(shí)符UUID表示,客戶端搜索服務(wù)器端服務(wù)的時(shí)候便是根據(jù)該屬性進(jìn)行定位。
Syncml服務(wù)器端的ServiceClassID為00000001-0000-1000-8000-0002EE000002,藍(lán)牙協(xié)議為OBEX,數(shù)據(jù)類型均為DataElSeq。注冊(cè)該服務(wù)時(shí)首先給server channel賦值為默認(rèn)值0,然后為該服務(wù)分配Rfcomm 通道,將分配的通道號(hào)給server channel重新賦值。
車載藍(lán)牙設(shè)備與手機(jī)建立免提連接后主動(dòng)發(fā)起跟手機(jī)的SyncML服務(wù)的連接,首先設(shè)備通過SyncML客戶端ServiceClassID定位手機(jī)端的SyncML服務(wù)記錄,然后在該服務(wù)記錄中查詢手機(jī)為SyncML服務(wù)分配的Rfcomm通道號(hào),然后建立Rfcomm層的連接。
OBEX綁定
SyncML應(yīng)用獨(dú)立于具體的傳輸方式,換言之,針對(duì)具體的傳輸方式,SyncML定義了相應(yīng)的綁定適配協(xié)議。對(duì)于藍(lán)牙應(yīng)用,SyncML OBEX綁定協(xié)議定義了SyncML在藍(lán)牙上的實(shí)現(xiàn)方式。下面介紹OBEX協(xié)議,以及SyncML在OBEX上綁定時(shí)需要注意的地方。
OBEX(Object Exchange)對(duì)象交換協(xié)議是采用C/S(客戶/服務(wù)器)結(jié)構(gòu)的面向會(huì)話的協(xié)議,它建立了“對(duì)象模型”以抽象描述各種實(shí)體,并定義了Header的概念來(lái)描述對(duì)象,一個(gè)對(duì)象便是一系列Header的集合。
OBEX定義了OBEX客戶端和服務(wù)器端的應(yīng)用規(guī)范,客戶端是指發(fā)起OBEX連接、初始化OBEX會(huì)話的一端。根據(jù)車載設(shè)備要在免提連接建立后進(jìn)行電話薄同步的應(yīng)用,車載設(shè)備需要實(shí)現(xiàn)OBEX客戶端。OBEX客戶端在之前建立的Rfcomm連接的通道上發(fā)起連接請(qǐng)求,請(qǐng)求數(shù)據(jù)為80 00 15 11 00 04 00 46 00 0e 53 59 4e 43 4d 4c 2d 53 59 4e 43。其中0x80為連接操作符,連接請(qǐng)求包長(zhǎng)度為0x0015,OBEX版本為version1.1,版本號(hào)表示為0x1100,最大OBEX包長(zhǎng)度為0x0400,0x46表示Target,Target表明連接的目的或服務(wù),在這里Target為53 59 4e 43 4d 4c 2d 53 59 4e 43即SYNCML-SYNC,表明建立的OBEX連接用于SyncML。
SyncML Document需要封裝為SyncML MIME類型的對(duì)象在OBEX請(qǐng)求或響應(yīng)主體內(nèi)傳輸,該類型為“application/vnd.syncml+wbxml”。SyncML同步電話薄的速度是個(gè)很關(guān)鍵的用戶體驗(yàn),相關(guān)的關(guān)鍵屬性值為最大OBEX包長(zhǎng)度,它決定了每次交互的OBEX包的大小,從而決定了交互次數(shù),該最大包長(zhǎng)度越大,交互次數(shù)越少,從而同步速度越快,反之,同步速度越慢。該最大包長(zhǎng)度在OBEX連接時(shí)協(xié)商決定,取雙方設(shè)備能夠支持的最大包長(zhǎng)度的較小值。
SyncML的藍(lán)牙應(yīng)用不可避免地會(huì)遇到兼容性問題,在測(cè)試過程中發(fā)現(xiàn)車載設(shè)備和Nokia6288手機(jī)進(jìn)行同步時(shí),車載設(shè)備通過PUT發(fā)給手機(jī)的SyncML Document的最后一包必須是空包82 00 03,否則無(wú)法繼續(xù)同步。
vCard解析
SyncML實(shí)現(xiàn)的藍(lán)牙手機(jī)和車載設(shè)備間電話薄同步應(yīng)用中,首先提取出采用vCard格式的個(gè)人信息數(shù)據(jù)和相關(guān)命令,將數(shù)據(jù)和命令映射在一起存儲(chǔ)為結(jié)構(gòu)體形式的列表,然后根據(jù) vCard規(guī)范解析出個(gè)人信息,根據(jù)命令完成添加、刪除和替代電話薄條目。解析出的個(gè)人信息包括人名、手機(jī)號(hào)碼、家庭電話、辦公電話和車載電話,命令為 ADD、DELETE、REPLACE。下面簡(jiǎn)要介紹vCard規(guī)范,以及vCard解析的實(shí)現(xiàn)。
vCard電子名片規(guī)范定義了個(gè)人公共信息交換(PDI)的描述標(biāo)準(zhǔn)和組織格式,該格式與信息傳送的方式無(wú)關(guān),方便了各種系統(tǒng)和應(yīng)用之間的信息交換。在vCard中,個(gè)人公共信息包括姓名、年齡、地址、電話等與個(gè)人緊密相關(guān)的基本信息。手機(jī)內(nèi)vCard樣例如下:
BEGIN:VCARD
VERSION:2.1
N:denglibao
TEL;WORK:045182605447
TEL;HOME:05307415684
TEL;CELL:13478951524
END:VCARD
現(xiàn)在使用的vCard規(guī)范版本為2.1和3.0,定義了數(shù)據(jù)的存儲(chǔ)格式及訪問接口的規(guī)范,vCard解析需要能夠解析這兩種版本。根據(jù)車載信息娛樂設(shè)備的應(yīng)用,vCard解析函數(shù)需要提取出姓名和電話號(hào)碼兩個(gè)屬性,其中電話號(hào)碼又包括手機(jī)、家庭電話、辦公電話、車載電話四類,其屬性值均為TEL,參數(shù)值分別為CELL、HOME、WORK、CAR,下面給出設(shè)計(jì)代碼的主要部分。
unsigned int vcard_parse(void)
{
unsigned int cnt,end,i,phone_index;
char* p;
end=vcard_length;
value_initia();
/*begin to parse vcard*/
for (cnt=13; cnt after“BEGIN:VCARD”*/
{
if((0xd==an_complete_vcard[cnt])&&(0xa==an_
complete_vcard[cnt+1]))
{
/*extract a property,another property parameter or vcard end*/
cnt=cnt+2;/*skip \r\n*/
/*if vcard end*/
p=&an_complete_vcard[cnt];
if(0==uCompareASCIIName(p,“END:VCARD”,9))
{
if(vcard_cmd==ADD)
{
phonebook_insert();
}//the vcard cmd ADD
else if(vcard_cmd==REPLACE)
{
}// the vcard cmd REPLACE
return 0;
}else if(0==uCompareASCIIName(p,“TEL;”,4))
{
cnt=cnt+4;/* TEL property ,first skip “TEL;”*/ …
p=&an_complete_vcard[cnt];
if(0==uCompareASCIIName(p,“PREF”,4))/*mobile
phonenumber*/
{
cnt=cnt+4;/*skip the “PREF”*/
。..
cnt=cnt-2;/*check next \r\n,in the “for”,cnt++,so -2,not -1*/
}else if(0==uCompareASCIIName(p,“VOICE”,5))
{
}else if(0==uCompareASCIIName(p,“CELL”,4))
{
}else if(0==uCompareASCIIName(p,“HOME”,4))
{
}else if(0==uCompareASCIIName(p,“WORK”,4))
{
} else if(0==uCompareASCIIName(p,“CAR”,3))
{
}
} else if(0==uCompareASCIIName(p,“TEL:”,4))
{ //some phone’s telephone have no parameter,
for example TEL:10086
}else if(0==uCompareASCIIName(p,“N”,1))
{ //name property
}
}
}
return 0;
}
其中,uCompareASCIIName是比較字符串函數(shù),對(duì)輸入的兩個(gè)字符串不分大小寫按字節(jié)進(jìn)行比較,具體代碼略。
結(jié)語(yǔ)
現(xiàn)在的一些文章中,對(duì)SyncML的藍(lán)牙實(shí)現(xiàn)只是泛泛而論,并沒有對(duì)具體的實(shí)現(xiàn)做深入的研究和分析,在一款車載信息娛樂設(shè)備上設(shè)計(jì)實(shí)現(xiàn)了基于藍(lán)牙技術(shù)的嵌入式SyncML服務(wù)器,從SDP和OBEX綁定上具體指出了SyncML藍(lán)牙應(yīng)用的設(shè)計(jì)要點(diǎn),并結(jié)合vCard規(guī)范給出了電話薄數(shù)據(jù)解析的具體實(shí)現(xiàn)代碼。實(shí)踐證明,車載藍(lán)牙設(shè)備的嵌入式SyncML服務(wù)器運(yùn)行穩(wěn)定,有很好的應(yīng)用價(jià)值。
責(zé)任編輯:gt
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5823瀏覽量
170353 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9165瀏覽量
85437 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3800瀏覽量
64402
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論