Отправка и получение пользовательских 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 добавляют себя как функцию, сопоставляют входящие пакеты запросов по пространству имен и создают результат или ответ об ошибке.

Другие вопросы по тегам