DM协议中主要包含五步流程(用Package0~Package4表示),如下图所示:
注意:Package0表示Server发通知给终端设备。这一步不是必须的,很多终端并不是一直监听来自Server端的连接。
整个流程分为两个阶段:Setup和Management。
Management阶段是由一到多个 协议迭代 组成(所谓 协议迭代 就是终端发给服务器消息,然后服务器再回给终端消息)。
Server发给终端的消息包中的内容决定了当前会话是否要结束。如果Server发送的消息包中包含了需要终端作出响应的管理命令(终端在返回的消息中通过Status或Results返回响应),在协议的Management阶段,终端会向Server发送新的消息包,其中包含了终端对服务端的管理命令的响应。客户端对管理命令的响应会启动一个新的 协议迭代 。Server可以发送新的管理命令消息包,并可因此初始化Server想要的多次 协议迭代 过程。
当Server端发给终端的消息包中不包含管理命令时,终端会创建一个仅包含Status和SyncHdr响应的消息包,回送给Server。这时,不要再发送响应消息包,协议就止结束。Server必须对终端的所有消息包作出响应。
要处理的消息包中可能包含了需要耗费大量时间的管理命令,因此SyncML DM协议并没有规定处理消息包时的超时。
如果没有对管理命令作特别说明,终端和Server可以自由选择消息包中的管理命令的执行顺序。但是,如果在父管理命令中指明了执行顺序的话,那么就必须按管理命令发送的顺序来执行。
终端和服务端都可以在会话中的任何时候中止会话。中止会话的原因可能包括:Server端shutdown、终端关机、终端上的用户交互动作等等。这时,中止方应该发送一个SESSION ABORT的Alert消息。这个消息还必须包含所有正在执行的管理命令的Status信息。这条消息的接收方的响应被忽略,连接到此结束。
某些情况下,会话中止是不可控的,比如终端超出服务区或电池突然用完了。Server和终端必须能应对无信号情况下的会话中止。
终端不能向Server发送除Replace命令以外的其他任何管理命令 (终端发给Server的Replace命令仅针对DevInfo)。
Package 0: 从Server发给终端的初始化Alert消息
很多终端设备都不能持续监听来自DM Server的连接。还有一些设备从安全角度考虑根本不想开启一个端口用于接受连接。但是,大多数的设备都能接收未经请求的消息,这种消息有时称为“ 通知 ”。
DM Server可以使用“ 通知 ”能力让终端初始化一个向Server的连接。SyncML DM协议1.1规定了若干管理初始化通知消息方法。你可以在《SyncML DM Notification》文档中找到通知消息方法的定义和通知内容。
要注意的是可能有其他多种方式都可以达到因接收通知消息而产生的效果(这种效果就是触发了终端到Server的连接)。比如,终端设备上的UI界面可以让用户启动终端到Server的连接;或者是超过某个日期时,终端发起到Server的连接;再或者当终端上出现某种错误时终端发起到Server的连接。
Package 1: 终端向Server发送初始化消息包
Setup阶段的描述几乎与《SyncML Synchronization Protocol》中相同。客户端所发送的初始化包的目的是:
- 向DM Server发送设备信息(比如终端设备生产厂商、型号等) 。这些信息在《SyncML_DM_Std_Obj》文档中定义。终端向Server发送的第一条消息中必须包含设备信息
- Server鉴别终端设备
- 告诉Server当前的会话是由Server发起,还是由终端发起
1. SyncHdr元素内的格式要求:
- VerDTD的值必须是"1.1"
- VerProto的值必须是"DM/1.1"
- 必须包含SessionID,用于标识当前会话的ID。如果终端是要响应“通知”,Alert代码是SERVER-INITIATED MGMT
(1200),那么SessionID必须与通知信息中的相同。否则,终端要生成一个在本终端内唯一的SessionID。整个会话内的SessionID都是相同的。 - MsgID用于标识是从Server端发给Client的哪一条消息(一个消息迭代中的MsgID是相同的)
- Target用于标识目标设备
- Source用于标识源设备
- Cred可能包含在从终端到Server的认证消息中
- CmdID是必须的
- Data用于表示当前会话的类型,可以是SERVER-INITIATED MGMT (1200)或 CLIENT-INITIATED MGMT (1201)
- CmdID是必须的
- Item所对应的对象可以在设备的信息树中找到,设备信息树中所有可能的对象都在《SyncML_DM_Std_Obj》文档中定义。
- Item中的Source的值标识设备信息树中某个对象的URI。
- Data中的值表示设备信息对应的数据
4. Final必须包含在SyncBody中,它是消息包的最后一个元素。
Package 2: Server端向终端发送初始化消息包
Server所发送的初始化消息包的目的在于:- 标识Server到终端的动作
- Server可以发送用户交互命令(可选)
- Server可以发送管理数据和命令(可选)
Package 2的详细需求如下:
1. SyncHdr中的需求
- VerDTD的值必须是"1.1"
- VerProto的值必须是"DM/1.1"
- 必须包含SessionID,用于标识当前会话的ID。
- MsgID用于标识是从Server端发给Client的哪一条消息(一个消息迭代中的MsgID是相同的)
- Target用于标识目标设备
- Source用于标识源设备
- Cred可能包含在认证消息中。Server总是会对终端设备进行验证,虽然传输层可能已经完成了验证。
2. 为响应终端所发送的SyncHdr和Alert命令,SyncBody中必须包含Status
3. 任何管理命令包括用户交互都位于SyncBody中- CmdID是必须的
- Source是必须的
- Target是必须的
- 如果当前命令不是Delete,那么Data包含了当前命令的数据
- 管理命令中或Item内必须包含Meta,用于表示当前数据的类型
4. Final必须包含在SyncBody中,它是消息包的最后一个元素。
Package 3: 终端对Server作出响应
Package 3的内容是:- Server发给终端的管理命令的运行结果
- 用户交互命令的运行结果
Package 3的详细需求如下:
1. SyncHdr的需求:
- VerDTD的值必须是"1.1"
- VerProto的值必须是"DM/1.1"
- 必须包含SessionID,用于标识当前会话的ID。
- MsgID用于标识是从Server端发给Client的哪一条消息(一个消息迭代中的MsgID是相同的)
- Target用于标识目标设备
- Source用于标识源设备
- 必须包含Status,用于标识Server对当前终端的认证是否成功。Status中的CmdRef必须是SyncHdr
2. SyncBody中必须包含Server发来的SyncHdr和Alert命令所对应的Status
3. SyncBody中必须包含Server发来的Package 2中的管理命令所对应的Status
4. 如果Package 2中包含了Get命令,SyncBody中必须包含对应的Results。Results中必须包含Meta(Meta中包含Type和Format),用于描述Data的内容
5. Final必须包含在SyncBody中,它是消息包的最后一个元素。
Package 4: 更多的Server管理命令
Package 4常用于关闭管理会话。如果Server在Package 4中发送了任何需要终端作出响应的管理命令,协议将从Package 3开始一个新的协议迭代过程。
Package 4 的详细需求如下:1. SyncHdr的需求:
- VerDTD的值必须是"1.1"
- VerProto的值必须是"DM/1.1"
- 必须包含SessionID,用于标识当前会话的ID。
- MsgID用于标识是从Server端发给Client的哪一条消息(一个消息迭代中的MsgID是相同的)
- Target用于标识目标设备
- Source用于标识源设备
2. 对应于Server所发送的SyncHrd,必须在SyncBody中包含Status
3. 任何管理命令(包括用户交互命令)都位于SyncBody中- CmdID是必须的
- Source是必须的
- Target是必须的
- 如果当前命令不是Delete,那么Data包含了当前命令的数据
- 管理命令中或Item内必须包含Meta,用于表示当前数据的类型
4. Final必须包含在SyncBody中,它是消息包的最后一个元素。