在Android上使用aSmack发送和接收自定义XMPP IQ

时间:2014-03-14 12:46:00

标签: android xmpp asmack

背景

我在Android上使用aSmack for XMPP实现了一对一聊天。我也能够发送和接收IQ消息。

问题是:

我无法发送和接收自定义IQ消息。例如,如果我想发送智商

<iq type='get'
    to='ssmack@web.mystudios.com/mack'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>

aSmack适用于此IQ,因为它不是自定义的,但是如果我将此处的name spacedisco#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 个答案:

答案 0 :(得分:1)

代码不完整。 addPacketListener()有两个论点。

我怀疑您没有在接收方注册自定义智商的提供商,这就是为什么它会返回<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>

您可能需要阅读一些文档:

答案 1 :(得分:-1)

您需要使用ServiceDiscoveryManager并注册您的自定义命名空间,如下所示:

ServiceDiscoveryManager sm = ServiceDiscoveryManager.getInstanceFor(connection);
sm.addFeature("your:namespace");

查看Smack sources,所有内部IQ处理程序都将自身添加为功能,按命名空间匹配传入的查询数据包,并构建结果或错误回复。