Отправка и получение пользовательских IQ XMPP с помощью aSmack на Android
Фон:
Я реализовал чат один на один, используя aSmack для XMPP на Android. Я также могу отправлять и получать сообщения IQ.
Вопрос заключается в следующем:
Я не могу отправлять и получать собственные сообщения IQ. например, если я хочу отправить IQ
<iq type='get'
to='ssmack@web.mystudios.com/mack'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>
aSmack отлично работает для этого IQ, поскольку это не обычай, но если я изменю name space
здесь из disco#items
в Match
он не будет работать, он отправит обратно серверу ответ
<error code='503'
type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
и этот ответ отправлен от моего клиента. но я попытался отладить его, я поставил точки останова на все коды приема и отправки пакетов. но это не входит туда.
Мой код для получения пакета:
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet p) {
// TODO Auto-generated method stub
String fromName1 = StringUtils.parseBareAddress(p.getFrom());
Log.i("XMPPClient", "Got text [" + p.toXML() + "] from [" + fromName1 + "]");
m1=p.getFrom();
mHandler.post(new Runnable() {
public void run() {
setListAdapter();
recieve.setText(m1);
}
});
Я думаю, мне нужно добавить несколько слушателей, чтобы получить индивидуальный ответ. кто-нибудь может направить меня через это?
2 ответа
Код неполный. addPacketListener()
принимает два аргумента.
Я подозреваю, что вы не регистрируете провайдера для пользовательского IQ на принимающей стороне, поэтому он возвращает <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
Вы можете прочитать некоторые документы:
Вам нужно использовать ServiceDiscoveryManager и зарегистрировать свое собственное пространство имен следующим образом:
ServiceDiscoveryManager sm = ServiceDiscoveryManager.getInstanceFor(connection);
sm.addFeature("your:namespace");
Посмотрите на источники Smack, все внутренние обработчики IQ добавляют себя как функцию, сопоставляют входящие пакеты запросов по пространству имен и создают результат или ответ об ошибке.