【发布时间】:2016-08-30 21:08:16
【问题描述】:
我正在尝试自动化一些 xmpp 服务器测试。我向 xmpp 服务器发送一个 xml 节并验证响应。我可以成功发送该节,但在检索响应时遇到问题。
我正在使用 Smack 4.1.8 api。
这是我要发送的节:
<iq id='123' from='rmorgan@xmppserver.domain.net' to='sandbox@xmppserver.domain.net/resource' type='get'>
<control xmlns='http://domain.com/powertalk/control/2.0'>
<point id='00000000/relay_1A' />
<point id='00000000/relay_2A' />
</control>
</iq>
当我使用 PSI 客户端发送此信息时,我得到以下回报:
<iq from="sandbox@xmppserver.domain/resource" type="result" to="rmorgan@xmppserver.domain/resource" id="17">
<control xmlns="http://domain.com/powertalk/control/2.0">
<point val="0" id="00000000/relay_1A" ts="2016-08-30T15:52:41.068308Z"/>
<point val="0" id="00000000/relay_2A" ts="2016-08-30T15:52:41.148337Z"/>
</control>
</iq>
这就是我要检索的内容。
我实际收到的是:
<iq to='rmorgan@xmppserver.domain.net/resource' from='rmorgan@xmppserver.domain.net' id='c8QbM-8' type='result'>
<query xmlns='jabber:iq:roster'></query>
</iq>
这是我的代码。我想我必须做一些自定义的 IQ 提供程序,但我发现的示例主要用于 Smack 3.x,并且无效。
AbstractXMPPConnection mConnection = this.getConnection();
try
{
final IQ iq = new IQ("control","http://domain.com/powertalk/control/2.0")
{
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml)
{
xml.rightAngleBracket();
xml.halfOpenElement("point");
xml.attribute("id", "00000000/relay_1A");
xml.append(" />");
xml.halfOpenElement("point");
xml.attribute("id", "00000000/relay_2A");
xml.append(" />");
return xml;
}
};
iq.setStanzaId("123");
iq.setFrom("rmorgan@xmppserver.domain.net");
iq.setType(IQ.Type.get);
iq.setTo("sandbox@xmppserver.domain.net/resource");
mConnection.sendStanza(iq);
// Receive the packet
IQ iqReceived = (IQ)collector.nextResult(50000);
// Stop queuing results
collector.cancel();
System.out.println("Sent: " + iq.toXML());
System.out.println("Received: " + iqReceived.toXML());
System.out.println("Collector size = " + collector.getCollectedCount()); //returns 0
System.out.println("collector pollResult = " + collector.pollResult()); //returns null
System.out.println("collector StanzaFilter = " + collector.getStanzaFilter()); //returns: StanzaIdFilter: id=123
}
catch (Exception e)
{
e.printStackTrace();
}
}
我在这里错过了什么?
【问题讨论】:
-
我建议查看 Smack 的源代码。 XMPP ping 代码是一个如何发送 IQ ping 并监听结果的简单示例。
-
您是否使用 openfire 自定义插件进行此通信?
-
根据我对 ping 的理解,它只返回真/假。我没有看到从服务器检索 IQ 结果的方法。您能解释一下我将如何做到这一点并返回 PSI 客户端在我上面的示例中执行的结果吗?
-
我没有使用任何自定义插件
-
我已经完成了,但我使用插件进行通信