SyncML. SyncML, or Synchronization Markup Language, was originally developed as a platform-independent standard for information synchronization. Established by the SyncML Initiative, this project has evolved to become a key component in data synchronization and device management. The project is currently referred to as Open Mobile Alliance Data Synchronization and Device Management. The purpose of SyncML is to offer an open standard as a replacement for existing data synchronization solutions; which have mostly been somewhat vendor, application, or operating system specific. SyncML 1.0 specification was released on December 17, 2000, and 1.1 on February 26, 2002.

A SyncML message is a well-formed XML document that adheres to the document type definition (DTD), but which does not require validation.

Internals

SyncML works by exchanging commands, which can be requests and responses. As an example:

 the mobile phone sends an Alert command for signaling the wish to begin a refresh-only synchronization
 the computer responds with a Status command for accepting the request
 the phone sends one or more Sync command containing an Add sub-command for each item (e.g., phonebook entry); if the number of entries is large, it does not include the  tag;
 in the latter case, the computer requests to continue with an appropriate Alert message, and the mobile sends another chunk of items; otherwise, the computer confirms it received all data with a Status command

Commands (Alert, Sync, Status, etc.) are grouped into messages. Each message and each of its commands has an identifier, so that the pair (MsgID, CmdID) uniquely determines a command. Responses like Status commands include the pair identifying the command they are responding to.

Before commands, messages contain a header specifying various data regarding the transaction. An example message containing the Alert command for begin a refresh synchronization, like in the previous example, is:

<?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>

The response from the computer could be an XML document like (comments added
for the sake of explanation):

<?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>

The transaction then proceeds with a message from the mobile containing the Sync command, and so on.

This example is a refresh where the mobile sends all its data to the computer and nothing in the other way around. Different codes in the initial Alert command can be used to initiate other kinds of synchronizations. For example, in a "two-way sync", only the changes from the last synchronization are sent to the computer, which does the same.

The Last and Next tags are used to keep track of a possible loss of sync. Last represents the time of the last operation of synchronization, as measured by each device. For example, a mobile may use progressive numbers (1, 2, 3, ...) to represent time, while the computer uses strings like "20140112T213401Z". Next is the current time in the same representation. This latter data is stored and then compared with Last in the next synchronization. Any difference indicates a loss of sync. Appropriate actions involving sending all data can be then taken to put the devices back in sync.

Anchors are only used to detect a loss of sync; they do not indicate which data is to be sent. Apart from the loss-of-synchronization situation, in a normal (non-refresh) synchronization, each device sends a log of changes since the last synchronization.

SyncML client connectors and plugins

SyncML servers

1SAN = Server Alert Notification. This SyncML Push technology is based on definitions by the Open Mobile Alliance and extends the existing SyncML protocol specification by offering a method of server initiated synchronization.

SyncML hosted services

See also
 CalDAV
 CardDAV
 Critical Path SyncML Server
 iCalendar
 The SyncML Initiative
 Yahoo! Mobile and Yahoo! Calendar - Yahoo services offered in some countries that uses SyncML technology.

References 

 
Open formats
Computer standards
Web syndication formats
XML-based standards