SyncML

SyncML （Synchronization Markup Language）は、クロスプラットフォームで使えるXMLを基にしたデータ同期のオープン規格の以前の名前である。2000年12月17日にSyncML 1.0がリリース、1.1は2002年2月26日にリリースされた。このプロジェクトは現在、 オープン・モバイル・アライアンス (Open Mobile Alliance、OMA)で Data Synchronization (データ同期) プロジェクトとDevice Management (デバイス管理) プロジェクトとなっている。 SyncMLの目的は、既存のデータ同期ソリューションの代わりとなるオープン標準を提供することである。既存のデータ同期ソリューションは、ほとんどがベンダー、アプリケーション、オペレーティングシステムに固有となっている。
詳細.
SyncMLは、以下のように要求と応答のコマンドを交換することで機能する。
コマンド（codice_1、codice_3、codice_2など）はメッセージにグループ化される。各メッセージとその各コマンドには識別子があるため、MsgID、CmdIDのペアがコマンドを一意に決定する。 codice_2コマンドなどの応答には、コマンドを識別するペアが続く。
コマンドの前に、メッセージにはトランザクションに関するさまざまなデータを指定するヘッダーが含まれる。前の例のように、更新同期を開始するためcodice_1コマンドを含むメッセージの例は次の通りとなる。
<?xml version="1.0"?>
<!DOCTYPE SyncML PUBLIC "-//SYNCML//DTD SyncML 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/OMA-TS-SyncML_RepPro_DTD-V1_2.dtd">
<SyncML xmlns="SYNCML:SYNCML1.2">
 <SyncHdr>
 <VerDTD>1.1</VerDTD>
 <VerProto>SyncML/1.1</VerProto>
 <SessionID>1</SessionID>
 <MsgID>1</MsgID>
 <Target><LocURI>PC Suite</LocURI></Target>
 <Source><LocURI>IMEI:3405623856456</LocURI></Source>
 <Meta><MaxMsgSize xmlns="syncml:metinf">8000</MaxMsgSize></Meta>
 </SyncHdr>
 <SyncBody>
 <Alert>
 <CmdID>1</CmdID>
 <Data>203</Data> <!-- 203 = mobile signals a refresh from it to computer -->
 <Item>
 <Target><LocURI>Events</LocURI></Target>
 <Source><LocURI>/telecom/cal.vcs</LocURI></Source>
 <Meta><Anchor xmlns="syncml:metinf"><Last>42</Last><Next>42</Next></Anchor></Meta>
 </Item>
 </Alert>
 <Final/>
 </SyncBody>
</SyncML>
コンピュータからの応答は、次のようなxmlドキュメントとなる（説明のためにコメントが追加されている）。
<?xml version="1.0"?>
<!DOCTYPE SyncML PUBLIC "-//SYNCML//DTD SyncML 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/OMA-TS-SyncML_RepPro_DTD-V1_2.dtd">
<SyncML>
 <SyncHdr>
 <VerDTD>1.1</VerDTD>
 <VerProto>SyncML/1.1</VerProto>
 <SessionID>1</SessionID>
 <MsgID>1</MsgID>
 <Target><LocURI>IMEI:3405623856456</LocURI></Target>
 <Source><LocURI>PC Suite</LocURI></Source>
 </SyncHdr>
 <SyncBody>
 <!-- accept the header of the last message from the client -->
 <Status>
 <CmdID>1</CmdID>
 <MsgRef>1</MsgRef>
 <CmdRef>0</CmdRef> <!-- 0 = header of the message -->
 <Cmd>SyncHdr</Cmd>
 <TargetRef>PC Suite</TargetRef>
 <SourceRef>IMEI:3405623856456</SourceRef>
 <Data>200</Data> <!-- 200 = ok, accepted -->
 </Status>
 <!-- accept the request of the mobile for a sync -->
 <Status>
 <CmdID>2</CmdID> <!-- this is command #2 -->
 <MsgRef>1</MsgRef>
 <CmdRef>1</CmdRef> <!-- it respond to command msg=1,cmd=1 -->
 <Cmd>Alert</Cmd>
 <TargetRef>Events</TargetRef>
 <SourceRef>/telecom/cal.vcs</SourceRef>
 <Meta><Anchor xmlns="syncml:metinf"><Next>0</Next><Last>0</Last></Anchor></Meta>
 <Data>200</Data> <!-- 200 = ok, accepted -->
 </Status>
 <Final/>
 </SyncBody>
</SyncML>
このトランザクションでは、その後、codice_3コマンドを含む携帯機器からのメッセージを続行する。
この例は、携帯機器がすべてのデータをコンピュータに送信し、その逆は何も送信しない更新である。 codice_1コマンドのさまざまなコードを使用して、他の種類の同期も開始できる。たとえば、「双方向同期」では、最後の同期からの変更のみがコンピュータに送信される。これでも同様のことが行われる。
codice_13タグとcodice_14タグは、同期が失われる可能性の追跡に使用される。 codice_13は、各デバイスで測定された、同期の最後の操作の時刻を表す。例えば、携帯機器側では、時間の順序を表す単調増加の番号(codice_16、codice_17、codice_18、...)を使ったり、コンピュータ側ではcodice_19 のような文字列を使ったりする。 codice_14は現在の時刻を表し、codice_13と同じ書式である。このタイミングで保存されたデータと、次の同期の際にcodice_13と違いがある場合は、同期が失われていることを示す。非同期を検出すると、適切なアクションを実行して、デバイスを同期に戻す。必要に応じてすべてのデータの送信をすることもある。
アンカーは同期の喪失を検出するためにのみ使用され、送信されるデータを示すものではない。同期が失われた場合を除いて、通常の（更新されない）同期では、各デバイスは最後の同期以降のすべての変更を送信する。