XMPP学习9-远程命令

远程控制关键部分是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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值