Я пытаюсь автоматизировать некоторые тесты сервера xmpp. Я отправляю xml-строфу на сервер xmpp и проверяю ответ. Я могу успешно отправить строфу, но у меня возникли проблемы с получением ответа.Как получить ответ IQ
Я использую Smack 4.1.8 api.
Это строфа, что я посылаю:
<iq id='123' from='[email protected]' to='[email protected]/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="[email protected]/resource" type="result" to="[email protected]/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='[email protected]/resource' from='[email protected]' 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("[email protected]");
iq.setType(IQ.Type.get);
iq.setTo("[email protected]/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();
}
}
Что мне здесь не хватает?
Я предлагаю глядя на исходный код хлопать. Пинг-код XMPP - простой пример того, как отправлять сообщения IQ и слушать результаты. – Flow
Вы используете плагин openfire для этого общения? – Saveen
от того, что я понимаю в ping, он просто возвращает true/false. Я не вижу способ получить результат IQ с сервера. Можете ли вы объяснить, как я буду это делать и вернуть результат, который клиент PSI делает в моем примере выше? – user6776106