远程控制关键部分是Ad-Hoc命令的协议,在[XEP- 0050]中定义
ad-hoc命令交互的基本流程
通常情况下,这样的工作流可以使用单级的,独立的命令(不带有效载荷)或一个多阶段的命令
实例分析(多设备间操作)
操作目的-将user@ejabberd.org/rabbithole客户端信息转发到user@ejabberd.org/party客户端(操作方)
发送http://jabber.org/commands查询发现服务到客户端rabbithole获取可用命令
<iq from="user@ejabberd.org/party"
id="a1266a"
to="user@ejabberd.org/rabbithole"
type="get">
<query xmlns="http://jabber.org/protocol/disco#items"
node="http://jabber.org/protocol/commands"/>
</iq>
rabbithole客户端返回结果-rabbithole资源支持设置状态和她感兴趣的转送命令
<iq from="user@ejabberd.org/rabbithole"
id="a1266a"
to="user@ejabberd.org/party"
type="result">
<query xmlns="http://jabber.org/protocol/disco#items"
node="http://jabber.org/protocol/commands">
<item node="http://jabber.org/protocol/rc#set-status"
name="Set Status"
jid="user@ejabberd.org/rabbithole"/>
<item node="http://jabber.org/protocol/rc#forward"
name="Forward Messages"
jid="user@ejabberd.org/rabbithole"/>
<item node="http://jabber.org/protocol/rc#set-options"
name="Set Options"
jid="user@ejabberd.org/rabbithole"/>
</query>
</iq>
执行消息转发命令转发消息给party客户端
<iq from="user@ejabberd.org/party"
id="a126aa"
to="user@ejabberd.org/rabbithole"
type="set">
<command xmlns="http://jabber.org/protocol/commands"
node="http://jabber.org/protocol/rc#forward"
action="execute"/>
</iq>
作为回应,rabbithole客户端开始发送它的挂起消息到party客户端
<message from="user@ejabberd.org/rabbithole"
id="a1268a"
to="user@ejabberd.org/party">
<body>I"m late, I"m late, for a very important date.</body>
//注释消息的延迟信息
<delay xmlns="urn:XMPP:delay"
from="user@ejabberd.org/rabbithole"
stamp="2008-11-12T13:05:00Z"/>
<addresses xmlns="http://jabber.org/protocol/address">
<address type="ofrom" jid="rabbit@ejabberd.org/transit"/>
<address type="oto" jid="user@ejabberd.org"/>
</addresses>
</message>
消息发送完成,rabbithole客户端就发送一个回应,明命令被成功执行
<iq from="user@ejabberd.org/party/rabbithole"
id="a126aa"
to="user@ejabberd.org/party/party"
type="result">
<command xmlns="http://jabber.org/protocol/commands"
node="http://jabber.org/protocol/rc#forward"
status="completed"/>
</iq>
命令和数据表单
实例分析
设置在线状态,无法直接执行操作,需提供额外信息(状态信息,出席优先级等),则需涉及数据表单
操作目的-设置user@ejabberd.org/rabbithole客户端状态
远程user@ejabberd.org/rabbithole客户端执行状态控制命令
<iq from="user@ejabberd.org/party"
id="afd4a"
to="user@ejabberd.org/rabbithole"
type="set">
<command xmlns="http://jabber.org/protocol/commands"
node="http://jabber.org/protocol/rc#set-status"
action="execute"/>
</iq>
修改状态信息,rabbithole客户端需要party客户端提供更多的信息
<iq from="user@ejabberd.org/rabbithole"
id="afd4a"
to="user@ejabberd.org/party"
type="result">
<command xmlns="http://jabber.org/protocol/commands"
node="http://jabber.org/protocol/rc#set-status"
//上下文会话跟踪
sessionid="b82nsd82nfdos51vs9"
//表示正在执行的状态
status="executing">
<x xmlns="jabber:x:data" type="form">
<title>Set Status</title>
<instructions>Choose the status and status message</instructions>
<field type="hidden" var="FORM_TYPE">
<value>http://jabber.org/protocol/rc</value>
</field>
<field type="list-single" label="Status" var="status">
<required/>
<option label="Online">
<value>online</value>
</option>
<option label="Away">
<value>away</value>
</option>
<option label="Extended Away">
<value>xa</value>
</option>
<option label="Offline">
<value>offline</value>
</option>
//当前状态
<value>online</value> 3
</field>
<field type="text-single" label="Priority" var="status-priority">
<value>5</value>
</field>
<field type="text-multi" label="Message" var="status-message">
<value/>
</field>
</x>
</command>
</iq>
party客户端完成表格,提交远程habbithole客户端
<iq from="user@ejabberd.org/party"
id="afd5a"
to="user@ejabberd.org/rabbithole"
type="set">
<command xmlns="http://jabber.org/protocol/commands"
action="complete"
sessionid="b82nsd82nfdos51vs9"
node="http://jabber.org/protocol/rc#set-status">
<x xmlns="jabber:x:data" type="submit">
<field type="hidden" var="FORM_TYPE">
<value>http://jabber.org/protocol/rc</value>
</field>
<field var="status">
<value>offline</value>
</field>
<field var="status-priority">
<value>5</value>
</field>
<field var="status-message">
<value>I'm at the party, talk to me there.</value>
</field>
</x>
</command>
</iq>
rabbithole远程客户端返回处理成功信息
<iq from="user@ejabberd.org/rabbithole"
id="afd5a"
to="user@ejabberd.org/party"
type="result">
<command xmlns="http://jabber.org/protocol/commands"
node="http://jabber.org/protocol/rc#set-status"
sessionid="b82nsd82nfdos51vs9"
status="completed"/>
</iq>
远程habbithole客户端离线,发送不可用出席信息
<presence from="user@ejabberd.org/rabbithole"
to="user@ejabberd.org/party"
type="unavailable">
<status>I'm at the party, talk to me there.</status>
</presence>