目前在嵌入式系統(tǒng)與其他通信設(shè)備的數(shù)據(jù)同步方面,業(yè)界還沒有統(tǒng)一的標(biāo)準(zhǔn)、協(xié)議。為了解決這個(gè)問題,IBM、Lotus、Motorola、Nokia、Palm Inc、Psion、Starfish Software已經(jīng)形成了SyncML協(xié)議的標(biāo)準(zhǔn)草案。這個(gè)草案將會(huì)發(fā)展成為一個(gè)通用的可以被用在工業(yè)界的同步協(xié)議。本文簡(jiǎn)單介紹了SyncML協(xié)議與應(yīng)用該協(xié)議的工具包。
目前,移動(dòng)計(jì)算和通信設(shè)備的流行很大部分原因是因?yàn)樗鼈兙哂幸恍┓奖愕墓δ?,比如說在需要時(shí)可以發(fā)送信息給其他用戶,用戶希望隨時(shí)隨地都可以利用掌上設(shè)備訪問信息和執(zhí)行應(yīng)用程序,甚至在飛行中也可以獲得和更新信息。
具有在一臺(tái)掌上設(shè)備運(yùn)行應(yīng)用程序和處理信息、還可以將應(yīng)用程序和信息的更新同步回到辦公室的設(shè)備或者網(wǎng)上的這種能力對(duì)于普遍、離線計(jì)算的效用和流行是一個(gè)關(guān)鍵。
遺憾的是,到今天為止還有兩種方式?jīng)]有實(shí)現(xiàn):
這樣一來,需要為移動(dòng)設(shè)備增加很多用來同步不同的,盡可能多的數(shù)據(jù)所需要的協(xié)議,這些協(xié)議中的每一個(gè)僅適用于在一個(gè)選定的設(shè)備子集上進(jìn)行選定的傳輸和運(yùn)行,并且可以訪問一部分網(wǎng)絡(luò)數(shù)據(jù),單一同步標(biāo)準(zhǔn)的缺乏為最終用戶、設(shè)備制造商、應(yīng)用程序開發(fā)者和設(shè)備提供商制造了很多問題
SyncML是一個(gè)新的標(biāo)準(zhǔn),為了開發(fā)一個(gè)簡(jiǎn)單、通用的可以用于工業(yè)界方面的數(shù)據(jù)同步協(xié)議,推進(jìn)這個(gè)標(biāo)準(zhǔn)的有IBM、Lotus、Motorola、Nokia、Palm Inc、Psion、Stafish Software。其他的公司、企業(yè)不斷的被補(bǔ)充進(jìn)來。
1.1 通用同步協(xié)議的優(yōu)點(diǎn)
下面讓我們看看適合工業(yè)界范圍的數(shù)據(jù)同步協(xié)議對(duì)于每組角色的有益之處。
1. 最終用戶:今天移動(dòng)設(shè)備用戶可能在每一種設(shè)備上使用了不同的同步產(chǎn)品。這樣就會(huì),有一種程序用來在膝上電腦和網(wǎng)絡(luò)數(shù)據(jù)之間同步文件,另一種用來同步掌上電腦的日歷,還有遠(yuǎn)程email訪問,每一種技術(shù)只能用來同步少數(shù)應(yīng)用程序或者被限制成特殊類型的網(wǎng)絡(luò)連接。這種安排安裝昂貴、配置和操作復(fù)雜、管理昂貴。使用SyncML,用戶可以購買可以使用廣泛的數(shù)據(jù)類型的設(shè)備。
2. 設(shè)備制造商:當(dāng)每一個(gè)設(shè)備制造商想要支持這種能支持所有用戶和服務(wù)提供商進(jìn)行數(shù)據(jù)訪問的技術(shù)。實(shí)際上一個(gè)設(shè)備會(huì)支持一種數(shù)據(jù)同步技術(shù)。這種選擇迫使制造商壓縮存儲(chǔ)空間、內(nèi)存、電源的用量和消耗。設(shè)備制造商會(huì)從通用的協(xié)議中獲得好處,這種通用的協(xié)議使設(shè)備共同使用廣泛的應(yīng)用程序、服務(wù)、網(wǎng)絡(luò)和傳輸技術(shù)。
3. 服務(wù)提供商:正在進(jìn)入快速增長(zhǎng)的應(yīng)用程序舞臺(tái)的服務(wù)提供商非常關(guān)注這樣一個(gè)現(xiàn)象,即同步技術(shù)的增多會(huì)使在有效的成本下擴(kuò)展用戶和支持用戶成為不可能。現(xiàn)在服務(wù)提供商已經(jīng)支持一定范圍的數(shù)據(jù)類型和應(yīng)用中的設(shè)備;還必須安裝、配置多種服務(wù)的基礎(chǔ)結(jié)構(gòu),維護(hù)和支持這些基礎(chǔ)結(jié)構(gòu),并且保證兼容性和性能?,F(xiàn)在可選的是利用單獨(dú)的數(shù)據(jù)連通方案,陷入了避免緊密結(jié)合的私有解決方案。使用SyncML,將會(huì)使提供支持廣闊的應(yīng)用程序的連接成為可能。
4. 應(yīng)用程序開發(fā)者:選擇支持多種同步技術(shù)可以使應(yīng)用程序支持更多的設(shè)備類型 和網(wǎng)絡(luò)數(shù)據(jù),但是這種選擇有一些浪費(fèi)。為了保持向下兼容性開發(fā)者失去了選擇網(wǎng)絡(luò)數(shù)據(jù)倉庫的靈活性,這也會(huì)增加程序開發(fā)的消耗和最終產(chǎn)品的復(fù)雜性。增加了復(fù)雜性的網(wǎng)絡(luò)數(shù)據(jù)倉庫對(duì)服務(wù)供應(yīng)商的安裝和采用是一個(gè)障礙。使用SyncML,可以開發(fā)能連接更多設(shè)備集合和網(wǎng)絡(luò)數(shù)據(jù)的應(yīng)用程序。
1.2 通用同步協(xié)議的描述
通用同步協(xié)議的目標(biāo)是普遍適用,同步兩端可以是任何一種類型、在任一種網(wǎng)絡(luò)上面,這樣會(huì):
數(shù)據(jù)同步協(xié)議會(huì)同步網(wǎng)絡(luò)數(shù)據(jù)和很多不同的設(shè)備,包括掌上電腦、移動(dòng)電話、自動(dòng)計(jì)算機(jī)和桌面計(jì)算機(jī)。一個(gè)用戶可以在不同的設(shè)備上訪問、操作同樣的數(shù)據(jù)集合,舉個(gè)例子,用戶可以使用掌上設(shè)備或者移動(dòng)電話閱讀電子郵件,還可以維護(hù)一個(gè)一致的、更新的紀(jì)錄。
同樣的,同步兩端可以使用任意類型,這使得移動(dòng)設(shè)備可以支持更多數(shù)據(jù)類型,包括電子郵件、日歷、事務(wù)管理信息、數(shù)據(jù)庫中的企業(yè)數(shù)據(jù)和Web文檔。這種功能使得想要通過電子郵件接收訂單的用戶可以在同樣的設(shè)備上訪問公司的目錄清單系統(tǒng),用來最后決定交付日期。
實(shí)現(xiàn)這個(gè)目標(biāo),協(xié)議需要下列特性:
-
可以有效的在有線和無線網(wǎng)絡(luò)上運(yùn)作
-
支持多種傳輸協(xié)議
-
支持任意的網(wǎng)絡(luò)數(shù)據(jù)
-
可由多種應(yīng)用程序訪問
-
考慮到移動(dòng)設(shè)備的資源限制
-
構(gòu)造于現(xiàn)有的全球互聯(lián)網(wǎng)和Web技術(shù)之上
-
協(xié)議最小功能就是賦予所有設(shè)備最常用的同步能力
2.1 綁定Http
2.1.1 Tcp 傳輸服務(wù)
Http通信一般是在 Tcp連接之上的,這個(gè)綁定不是必需的,如果Http基于其它的協(xié)議,那么需求也和下面Tcp定義的相似
2.1.1.1 連接
在Http客戶端連接到Http服務(wù)器端的時(shí)候,SyncML客戶端建立一個(gè)Tcp連接在客戶和服務(wù)器之間通過使用Tcp open操作,在超時(shí)的情況下還需要SyncML客戶端從新建立連接。
2.1.1.2連接選項(xiàng)
關(guān)于端口和協(xié)議版本的一些選項(xiàng)。
2.1.1.3 斷開連接
當(dāng)連接不需要的時(shí)候,SyncML客戶端負(fù)責(zé)使用tcp close操作結(jié)束連接。如果固定連接存在于Http請(qǐng)求中,Http連接的關(guān)閉有Http客戶端來完成,當(dāng)Http客戶端接收到來自服務(wù)器的Http應(yīng)答中指明這是最后一個(gè)SyncML的包。
2.1.1.4 終止
有時(shí)候非正常時(shí)間發(fā)生會(huì)要求應(yīng)用程序中斷Tcp連接,這種情況下,Tcp從新初始化來結(jié)束當(dāng)前連接。
2.1.1.5 超時(shí)
當(dāng)服務(wù)器超時(shí),SyncML客戶端需要重建一個(gè)新的HTTP會(huì)話并且Http服務(wù)器端會(huì)嘗試從新發(fā)送當(dāng)前的SyncML包
2.1.2. SyncML信息交換
一旦Http連接建立,一個(gè)或者多個(gè)SyncML消息會(huì)通過連接由SyncML客戶端傳輸,它們存在于Http客戶端的請(qǐng)求或者Http服務(wù)器端的應(yīng)答中。
在Http請(qǐng)求中POST方法用來傳遞SyncML消息。
2.1.2.1 每包一個(gè)消息
下面是Http請(qǐng)求的部分代碼:
|
POST ./servlet/syncit HTTP/1.1Host: www.datasync.org
Content-Type: application/vnd.syncml-xml; charset="utf-8"Content0Length: 1023
Accept: application/vnd.syncml-xml
|
下面是Http應(yīng)答的部分代碼:
|
HTTP/1.1 200 ok
Content-Type: application/vnd.syncml-wbxml; charset="utf-8"Content-LengthL 1023
--HTTP body---
|
2.1.2.2 一個(gè)包里包含多個(gè)消息
每一個(gè)Sync消息必須使用SyncML MIME媒體類型在HTTP請(qǐng)求或應(yīng)答中傳遞,當(dāng)每個(gè)包里有多個(gè)SyncML消息的時(shí)候,每一個(gè)消息是否在分離的HTTP請(qǐng)求或應(yīng)答傳遞依賴于它是否是SyncML的請(qǐng)求和應(yīng)答??梢愿鶕?jù)每一個(gè)SyncML消息是否有最后一個(gè)元素來判斷這個(gè)包中是否有更多的SyncML消息,如夠有最后一個(gè)元素,那么這消息就是該包中最后一個(gè)消息。
2.1.3 傳輸命令
HTTP使用一系列的命令,包括傳輸方法,頭部信息,請(qǐng)求的頭部信息,應(yīng)答的頭部信息
2.1.3.1 傳輸方法
SyncML客戶端必須使用POST方法或者可以使用CONNECT方法(如果支持的話)來給SyncML服務(wù)器發(fā)送SyncML請(qǐng)求。CONNECT方法用來初始化SSL會(huì)話以驗(yàn)證HTTP客戶和服務(wù)器,其他的方法目前沒有用在SyncML客戶端。
2.2 綁定Obex
2.3 綁定Wsp
3.1 動(dòng)機(jī):
3.2 設(shè)計(jì)原則
-
滿足網(wǎng)絡(luò)延遲的需要
-
滿足各種設(shè)備
-
滿足現(xiàn)有的各種儲(chǔ)存模式
-
滿足多種安全需求
-
多種使用模式
3.3 Sync 類型
3.3.1雙向同步
-
客戶端和服務(wù)器端雙向傳輸信息
-
在特殊情況下采用Slow sync 作為傳輸模式
3.3.2 客戶端單向同步
-
只有客戶端提出修改信息
-
特殊情況下,數(shù)據(jù)可以被輸出
3.3.3 服務(wù)器端單向同步
-
只有服務(wù)器端提出修改信息
-
特殊情況下,數(shù)據(jù)可以被輸入
3.3.4 服務(wù)器端通告
3.3.5 雙向同步例子
下面是一個(gè)例子,描述同步傳輸?shù)拇篌w過程。同步傳輸有七種方式,下面的例子是雙向傳輸,最復(fù)雜的一種。首先進(jìn)行初始的準(zhǔn)備工作,然后進(jìn)行傳輸,再進(jìn)行確認(rèn)。
3.3.5.1客戶端發(fā)出同步請(qǐng)求
<SyncML> 相當(dāng)于同步的頭文件,基本為固定模式 <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>1</MsgID> 同步初始化時(shí)數(shù)值為一,相當(dāng)于第幾個(gè)回合 目標(biāo)地址 <Target><LocURI>http://www./sync-server</LocURI></Target> 源地址 <Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source> 認(rèn)證 <Cred> <!--The authentication is optional.--> 認(rèn)證模式 <Meta><Type xmlns=‘syncml:metinf‘>syncml:auth-basic</Type></Meta> 相當(dāng)于密碼 <Data>dXNlcmlkOnBhc3N3b3Jk=</Data> <!--base64 formatting of "userid:password"--> </Cred> <Meta> <!--The Meta is now used to indicate the maximum SyncML message size, which client can receive.--> <mi:MaxMsgSize xmlns:mi=‘syncml:metinf‘>5000</mi:MaxMsgSize> </Meta> </SyncHdr> 頭文件結(jié)束 <SyncBody> 喚醒對(duì)方,相當(dāng)于發(fā)出信號(hào) <Alert> <CmdID>1</CmdID> 命令I(lǐng)D為1 <Data>200</Data> <!-- 200 = TWO_WAY_ALERT --> 共有七種連接方式,200代表其中一種 <Item> <Target><LocURI>./contacts/james_bond</LocURI></Target> 進(jìn)行操作的目標(biāo)和地址,相當(dāng)于數(shù)據(jù)庫 <Source><LocURI>./dev-contacts</LocURI></Source> <Meta> 相當(dāng)于認(rèn)證 <Anchor xmlns=‘syncml:metinf‘> <Last>234</Last> <Next>276</Next> </Anchor> </Meta> </Item> </Alert> 上傳 <Put> <CmdID>2</CmdID> <Meta><Type xmlns=‘syncml:metinf‘>application/xml</Type></Meta> 固定的格式 <Item> <Source><LocURI> devinf10</LocURI></Source> 固定的格式 <Data> <DevInf xmlns=‘syncml:devinf‘> 相當(dāng)于本地的數(shù)據(jù)描述 <Man>Big Factory, Ltd.</Man> <Mod>4119</Mod> <OEM>Jane‘s phones</OEM> <FwV>2.0e</FwV> <SwV>2.0</SwV> <HwV>1.22I</HwV> <DevId>1218182THD000001-2</DevId> <DevTyp>phone</DevTyp> <DataStore> <SourceRef>./contacts</SourceRef> <DisplayName>Phonebook</DisplayName> <MaxGUIDSize>32</MaxGUIDSize>GUID 相當(dāng)于索引 <Rx-Pref> <CTType>text/x-vcard </CTType> <VerCT>2.1</VerCT> </Rx-Pref> <Tx-Pref> <CTType>text/x-vcard</CTType> <VerCT>2.1</VerCT> </Tx-Pref> 數(shù)據(jù)存儲(chǔ)能力 <DSMem> <MaxMem>32650</MaxMem> <MaxID>250</MaxID> <FreeMem>22430</FreeMem> <FreeID>122</FreeID> </DSMem> </DataStore> <CTCap> <CTType>text/x-vcard</CTType> <PropName>BEGIN</PropName> <ValEnum>VCARD</ValEnum> <PropName>END</PropName> <ValEnum>VCARD</ValEnum> <PropName>VERSION</PropName> <ValEnum>2.1</ValEnum> <PropName>N</PropName> <PropName>TEL</PropName> <ParamName>VOICE</ParamName> <ParamName>CELL</ParamName> </CTCap> <SyncCap> <SyncType>01</SyncType> <SyncType>02</SyncType> </SyncCap> </DevInf> </Data> </Item> </Put> <Get> <CmdID>3</CmdID> <Meta><Type xmlns=‘syncml:metinf‘>application/xml</Type></Meta> <Item> <Target><LocURI> devinf10</LocURI></Target> </Item> </Get> <Final/> </SyncBody> </SyncML> 3.3.5.2服務(wù)器端發(fā)出同步請(qǐng)求 <SyncML> 頭文件 <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>1</MsgID> <Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target> <Source><LocURI>http://www./sync-server</LocURI></Source> <Cred> <!--The authentication is optional.--> <Meta><Type xmlns=‘syncml:metinf‘>syncml:auth-basic</Type></Meta> <Data>dXNlcmlkOnBhc3N3b3Jk=</Data> <!--base64 formatting of "userid:password"--> </Cred> </SyncHdr>
<SyncBody> 相當(dāng)于回復(fù)客戶端請(qǐng)求 回復(fù)頭文件 <Status> <MsgRef>1</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd> <TargetRef>http://www./sync-server</TargetRef> <SourceRef>IMEI:493005/10/059280/0</SourceRef> 212代表正常 <Data>212</Data> <!--Statuscode for OK, authenticated for session--> </Status> 回復(fù)Alert <Status> <MsgRef>1</MsgRef><CmdRef>1</CmdRef><Cmd>Alert</Cmd> <TargetRef>./contacts/james_bond</TargetRef> <SourceRef>./dev-contacts</SourceRef> <Data>200</Data> <!--Statuscode for OK--> 200代表正常 把認(rèn)證對(duì)上,對(duì)方請(qǐng)求的值 <Item> <Data><Anchor xmlns=‘syncml:metinf‘><Next>276</Next></Anchor></Data> </Item> </Status> <Status> 回復(fù)Put <MsgRef>1</MsgRef><CmdRef>2</CmdRef><Cmd>Put</Cmd> <SourceRef> devinf10</SourceRef> <Data>200</Data> <!--Statuscode for OK--> </Status> 返回值,請(qǐng)求對(duì)方 <Results> <MsgRef>1</MsgRef><CmdRef>3</CmdRef> <Meta><Type xmlns=‘syncml:metinf‘>application/xml</Type></Meta> 固定格式 <Item> <Source><LocURI>devinf10</LocURI></Source> 固定格式 <Data> 相當(dāng)于數(shù)據(jù)描述 <DevInf xmlns=‘syncml:devinf‘> <Man>Small Factory, Ltd.</Man> <Mod>Tiny Server</Mod> <OEM>Tiny Shop</OEM> <DevId>485749KR</DevId> <DevTyp>Server</DevTyp> <DataStore> <SourceRef>./contacts</SourceRef> <DisplayName>Addressbook</DisplayName> <Rx-Pref> <CTType>text/x-vcard </CTType> <VerCT>2.1</VerCT> </Rx-Pref> <Rx> <CTType>text/vcard </CTType> <VerCT>3.0</VerCT> </Rx> <Tx-Pref> <CTType>text/x-vcard</CTType> <VerCT>2.1</VerCT> </Tx-Pref> <Tx> <CTType>text/vcard</CTType> <VerCT>3.0</VerCT> </Tx> 存儲(chǔ)能力 <DSMem> <MaxMem>132650</MaxMem> <MaxID>1250</MaxID> <FreeMem>122430</FreeMem> <FreeID>1122</FreeID> </DSMem> </DataStore> <CTCap> <CTType>text/x-vcard</CTType> <PropName>BEGIN</PropName> <ValEnum>VCARD</ValEnum> <PropName>END</PropName> <ValEnum>VCARD</ValEnum> <PropName>VERSION</PropName> <ValEnum>2.1</ValEnum> <PropName>N</PropName> <PropName>TEL</PropName> <ParamName>VOICE</ParamName> <ParamName>CELL</ParamName> <CTType>text/vcard</CTType> <PropName>BEGIN</PropName> <ValEnum>VCARD</ValEnum> <PropName>END</PropName> <ValEnum>VCARD</ValEnum> <PropName>VERSION</PropName> <ValEnum>3.0</ValEnum> <PropName>N</PropName> <PropName>TEL</PropName> <ParamName>VOICE</ParamName> <ParamName>FAX</ParamName> <ParamName>CELL</ParamName> <CTType>text/vcard</CTType> <PropName>BEGIN</PropName> <ValEnum>VCARD</ValEnum> <PropName>END</PropName> <ValEnum>VCARD</ValEnum> <PropName>VERSION</PropName> <ValEnum>3.0</ValEnum> <PropName>N</PropName> <PropName>TEL</PropName> <ParamName>VOICE</ParamName> <ParamName>FAX</ParamName> <ParamName>CELL</ParamName> </CTCap> <SyncCap> <SyncType>01</SyncType> <SyncType>02</SyncType> <SyncType>07</SyncType> </SyncCap> </DevInf> </Data> </Item> </Results> 進(jìn)行雙向傳輸,喚醒對(duì)方 <Alert> <CmdID>1</CmdID> <Data>201</Data> <!-- 201 = TWO_WAY_ALERT --> <Item> <Target><LocURI>./dev-contacts</LocURI></Target> <Source><LocURI>./contacts/james_bond</LocURI></Source> <Meta> 發(fā)送認(rèn)證 <Anchor xmlns=‘syncml:metinf‘> <Last>200005021T081812Z </Last> <Next>200005022T093223Z </Next> </Anchor> </Meta> </Item> </Alert> <Final/> </SyncBody> </SyncML> 3.3.5.3客戶端提交數(shù)據(jù) <SyncML> <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>2</MsgID> <Target><LocURI>http://www./sync-server</LocURI></Target> <Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source> </SyncHdr> <SyncBody> 回復(fù)服務(wù)器的請(qǐng)求 <Status> <MsgRef>1</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd> <TargetRef>IMEI:493005/10/059280/0</TargetRef> <SourceRef> http://www./sync-server </SourceRef> <Data>212</Data> <!--Statuscode for OK, authenticated for session--> </Status> 回復(fù)服務(wù)器的請(qǐng)求 <Status> <MsgRef>1</MsgRef><CmdRef>1</CmdRef><Cmd>Alert</Cmd> <TargetRef>./dev-contacts</TargetRef> <SourceRef>./contacts/james_bond</SourceRef> <Data>200</Data> <!--Statuscode for Success--> <Item> <Data> Anchor回復(fù)對(duì)方請(qǐng)求的<next>值 <Anchor xmlns=‘syncml:metinf‘><Next>200005022T093223Z </Next></Anchor> </Data> </Item> </Status> <Sync> <CmdID>1</CmdID> <Target><LocURI>./contacts/james_bond</LocURI></Target> <Source><LocURI>./dev-contacts</LocURI></Source> <Meta> 存儲(chǔ)能力 <DSMem xmlns=‘syncml:devinf‘> <FreeMem>8100</FreeMem> <!--Free memory (bytes) in Calendar database on a device --> <FreeId>81</FreeId> <!--Number of free records in Calendar database--> </DSMem> </Meta> <Replace> <CmdID>2</CmdID> <Meta><Type xmlns=‘syncml:metinf‘>text/x-vcard</Type></Meta> <Item> <Source><LocURI>1012</LocURI></Source> 數(shù)據(jù)項(xiàng)地址 <Data><!--The vCard data would be placed here.--></Data> </Item> </Replace> </Sync> <Final/> </SyncBody> </SyncML> 3.3.5.4服務(wù)器端提交數(shù)據(jù) <SyncML> <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>2</MsgID> <Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target> <Source><LocURI>http://www./sync-server</LocURI></Source> </SyncHdr> <SyncBody> 回復(fù)客戶請(qǐng)求 <Status> <MsgRef>2</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd> <TargetRef>http://www./sync-server</TargetRef> <SourceRef>IMEI:493005/10/059280/0</SourceRef> <Data>200</Data> </Status> 回復(fù)Sync請(qǐng)求 <Status><!--This is a status for the client modifications to the server.--> <MsgRef>2</MsgRef><CmdRef>1</CmdRef><Cmd>Sync</Cmd> <TargetRef>./contacts/james_bond</TargetRef> <SourceRef>./dev-contacts</SourceRef> <Data>200</Data> <!--Statuscode for Success--> </Status> 回復(fù)Replace <Status> <MsgRef>2</MsgRef><CmdRef>2</CmdRef><Cmd>Replace</Cmd> <SourceRef>1012</SourceRef> <Data>200</Data> <!--Statuscode for Success--> </Status> 發(fā)出同步請(qǐng)求 <Sync> <CmdID>1</CmdID> <Target><LocURI>./dev-contacts</LocURI></Target> <Source><LocURI>./contacts/james_bond</LocURI></Source> <Replace> <CmdID>2</CmdID> <Meta><Type xmlns=‘syncml:metinf‘>text/x-vcard</type></Meta> <Item> <Target><LocURI>1023</LocURI></Target> <Data><!--The vCard data would be placed here.--></Data> </Item> </Replace> <Add> <CmdID>3</CmdID> <Meta><Type xmlns=‘syncml:metinf‘>text/x-vcard</type></Meta> <Item> <Source><LocURI>10536681</LocURI></Source> <Data><!--The vCard data would be placed here.--></Data> </Item> </Add> </Sync> <Final/> </SyncBody> </SyncML> 3.3.5.5客戶端顯示數(shù)據(jù)更改情況 <SyncML> <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>3</MsgID> <Target><LocURI>http://www./sync-server</LocURI></Target> <Source><LocURI>IMEI:493005/10/059280/0</LocURI></Source> </SyncHdr> <SyncBody> 回復(fù)同步請(qǐng)求 <Status> <MsgRef>2</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd> <TargetRef>IMEI:493005/10/059280/0</TargetRef> <SourceRef> http://www./sync-server </SourceRef> <Data>200</Data> </Status> <Status> <MsgRef>2</MsgRef><CmdRef>1</CmdRef><Cmd>Sync</Cmd> <TargetRef>./dev-contacts</TargetRef> <SourceRef>./contacts/james_bond</SourceRef> <Data>200</Data> </Status> <Status> <MsgRef>2</MsgRef><CmdRef>2</CmdRef><Cmd>Replace</Cmd> <TargetRef>1023</TargetRef> <Data>200</Data> </Status> <Status> <MsgRef>2</MsgRef><CmdRef>3</CmdRef><Cmd>Add</Cmd> <SourceRef>10536681</SourceRef> <Data>200</Data> </Status> <Map>服務(wù)器和客戶端的數(shù)據(jù)保持同步 <CmdID>1</CmdID> <Target><LocURI>./contacts/james_bond</LocURI></Target> <Source><LocURI>./dev-contacts</LocURI></Source> <MapItem> 10536681和1024指的是同一個(gè)數(shù)據(jù) <Target><LocURI>10536681</LocURI></Target> <Source><LocURI>1024</LocURI></Source> </MapItem> </Map> <Final/> </SyncBody> </SyncML> 3.3.5.6服務(wù)器端確認(rèn)更改 <SyncML> <SyncHdr> <VerDTD>1.0</VerDTD> <VerProto>SyncML/1.0</VerProto> <SessionID>1</SessionID> <MsgID>3</MsgID> <Target><LocURI>IMEI:493005/10/059280/0</LocURI></Target> <Source><LocURI>http://www./sync-server</LocURI></Source> </SyncHdr> <SyncBody> <Status> <MsgRef>3</MsgRef><CmdRef>0</CmdRef><Cmd>SyncHdr</Cmd> <TargetRef>http://www./sync-server</TargetRef> <SourceRef>IMEI:493005/10/059280/0</SourceRef> <Data>200</Data> </Status> 證實(shí)數(shù)據(jù)已經(jīng)做了更改 <Status> <MsgRef>3</MsgRef><CmdRef>1</CmdRef><Cmd>Map</Cmd> <TargetRef>./contacts/james_bond </TargetRef> <SourceRef>./dev-contacts</SourceRef> <Data>200</Data> </Status> <Final/> </SyncBody> </SyncML>
SyncML表示協(xié)議沒有指定數(shù)據(jù)同步協(xié)議、同步引擎。而是指定了一些同步框架、格式使之適應(yīng)不同的數(shù)據(jù)同步模型。SyncML指定了很多同步操作的結(jié)果。
4.1 SyncML 命令
4.1.1 請(qǐng)求的命令
-
Add:允許發(fā)送者將數(shù)據(jù)元素加入到接收者可以識(shí)別的同步數(shù)據(jù)中去,該命令必須在Sync命令中指定。
-
Alert:允許發(fā)送者通知接收者,通知可以作為應(yīng)用程序和應(yīng)用程序之間消息或者是接收用戶接口的顯示消息擴(kuò)展。
-
Atomic:允許發(fā)送者指明一個(gè)命令集合可在帶有語義或者沒有任何語義的執(zhí)行。
-
Copy:允許發(fā)送者復(fù)制可被接受者接收的數(shù)據(jù)。
-
Delete:允許發(fā)送者刪除可被接受者接收的數(shù)據(jù)。Delete命令可以包含一個(gè)請(qǐng)求魏實(shí)現(xiàn)數(shù)據(jù)存檔,刪除可以是回收刪除或者實(shí)際刪除。
-
Exec:發(fā)送者可以要求接收者調(diào)用一個(gè)命名的、可執(zhí)行的程序。
-
Get:發(fā)送者可以從接收者那里申請(qǐng)數(shù)據(jù)元素,這個(gè)命令不能被Sync命令指定。
-
Map:發(fā)送者可以接收者更新標(biāo)識(shí)符在兩個(gè)數(shù)據(jù)集合之間。
-
Put:允許發(fā)送者發(fā)送數(shù)據(jù)給接收者,這個(gè)命令不能被Sync命令指定。
-
Release:允許發(fā)送者對(duì)接收者可以接受的數(shù)據(jù)元素進(jìn)行替換,這個(gè)命令不能被Sync命令指定。
-
Search:允許發(fā)送者進(jìn)行數(shù)據(jù)元素的查詢。
-
Sequence:允許發(fā)送者指定一系列按順序執(zhí)行。
-
Sync:允許發(fā)送者指定包含的命令作為同步兩個(gè)數(shù)據(jù)集合的部分。
4.1.2 應(yīng)答的命令
4.2 SyncML數(shù)據(jù)格式
SyncMl不但提供了通用的指令集合,還指明了一個(gè)小的通用的數(shù)據(jù)格式。數(shù)據(jù)格式提供了普通的為交換訪問信息的媒體集合。例如通訊錄、日歷和消息。這三種數(shù)據(jù)格式是為了這個(gè)規(guī)范強(qiáng)制的,另外對(duì)于這些一般格式,SyncML允許鑒定其他的登記格式。SyncML利用MiME內(nèi)容類型框架來鑒別數(shù)據(jù)格式。
4.3 使用XML
SyncML消息是使用一種標(biāo)記語言,而SynML表示協(xié)議其實(shí)是一個(gè)XML應(yīng)用。SyncML DTD定義了用來表示SyncML消息的XML文檔。SyncML大量的使用了XML的名空間,名空間必須在第一個(gè)元素類型聲明。在SyncML DTD中的元素類型被定義在一個(gè)URI為“http://www./docs/syncml_represent_v10_20001207.dtd或者URN為syncml:syncml。SyncML DTD也可以被ISO 9070標(biāo)準(zhǔn)公用標(biāo)示符-//SYNCML//DTD SyncML 1.0//EN識(shí)別。任何XML 的標(biāo)準(zhǔn)屬性可以被用在SyncML文檔中。
4.4使用 MIME
互聯(lián)網(wǎng)標(biāo)準(zhǔn)提供了一個(gè)工業(yè)界廣泛接受的機(jī)制來鑒別不同的內(nèi)容種類。SyncML消息用MiME媒體類型來鑒別,SyncML消息的媒體類型被登記在生產(chǎn)廠家列表中。目前有兩個(gè)MIME內(nèi)容可以用在SyncML消息中。applicattion/vnd.syncml+xml的MIME內(nèi)容類型鑒別了SyncML消息基于文本的XML表達(dá)。applicattion/vnd.syncml+wbxml的MIME內(nèi)容類型鑒別了SyncML消息基于文本的WBXML二進(jìn)制表達(dá)。
4.5 SyncML標(biāo)記語言描述
4.5.1 一般使用元素
Archive、Chal、Cmd、CmdID、CmdRef、Cred、Final、Lang、LocURI、MsgID、MsgRef、NoResp、NoResult、RespURI、SessionID、SftDel、Source、SourceRef、Target、TargetRef、VerDTD、VerProto。
4.5.2 消息容器元素
SyncML、SyncHdr、SyncBody。
4.5.3 數(shù)據(jù)描述元素
Data、Item、Meta。
4.5.4 協(xié)議管理元素
Status。
4.5.5 協(xié)議命令元素
Add、Alert、Atomic、Copy、Delete、Exec、Get、Map、MapItem、Put、Replace、Result、Search、Sequence、Sync。
詳細(xì)內(nèi)容請(qǐng)查閱相關(guān)文檔。
工具包在XML語言和SyncML之間起到橋梁的作用
5.1使用 SyncML 工具包
5.2 使用SyncML工具包的工作空間 當(dāng)同步開始,工作空間被創(chuàng)建:
|
instanceOptions.encoding = SML_WBXML;
instanceOptions.workspaceName ="MyWorkspace";
instanceOptions.workspaceSize =20000;
callbacks.addCmdFunc = &handleAddCmdFunc;
...rc = smlInitInstance(callbacks, instanceOptions,
&instanceID);
|
5.3 使用SyncML工具包解析器
體積小而且經(jīng)過了優(yōu)化處理(代替 DOM XML 解析器)支持以下格式:
回調(diào)函數(shù)將把解析后的信息送到應(yīng)用程序,開始解析SyncML :
|
smlProcessData(instanceID, // pass the instance
SML_ALL_COMMANDS, // parse entire Msg pUserData); // a void ptr
|
5.4 使用工具包 編碼器
需要編碼的信息要經(jīng)過Toolkit.
|
pAddStruct->elementType = SML_PE_ADD;
pAddStruct->cmdID = ... ;pAddStruct->itemList = ... ;
pAddStruct->cred = ... ;smlAddCmd(instanceID, pAddStruct);
|
5.5 內(nèi)容與通信
5.5.1 整合負(fù)載
解析、編碼嵌入式數(shù)據(jù)格式
數(shù)據(jù)庫接口
-
Lotus Domino
-
Outlook
-
DB2
-
...
5.5.2 發(fā)布同步信息
傳輸綁定
-
HTTP
-
OBEX (Infrared)
-
WSP
-
Floppy Disk
|