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

Posted

技术标签:

【中文标题】在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ【英文标题】:Sending and Receiving custom XMPP IQs with aSmack on Android 【发布时间】:2014-03-14 12:46:00 【问题描述】:

背景:

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

问题是:

我无法发送和接收自定义 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);
                        
                    );

我想我需要添加一些侦听器来获取自定义响应。有人可以指导我吗?

【问题讨论】:

@Flow 我在 android 设备上使用 asmack 从 xmpp 服务器发送和接收消息时遇到问题,你能过来这个link 帮助我吗,谢谢 我在 android 设备上使用 asmack 从 xmpp 服务器发送和接收消息时遇到问题,你能过来这个link 帮助我吗,谢谢 【参考方案1】:

代码不完整。 addPacketListener() 接受两个参数。

我怀疑您没有在接收方为自定义 IQ 注册提供程序,这就是它返回 &lt;service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/&gt; 的原因

您可能想阅读一些文档:

Provider Architecture: Packet Extensions and Custom IQ's Brief Tutorial on IQ Providers

【讨论】:

当我尝试使用相同的代码接收正常的智商时。有用。当我尝试接收 disco#items 时,它可以工作,但是当我输入自定义名称空间时,会生成以下错误 如何在接收方注册自定义 IQ 提供者?【参考方案2】:

您需要使用ServiceDiscoveryManager 并像这样注册您的自定义命名空间:

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

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

【讨论】:

你能引用一个编码的例子吗..? ServiceDiscoveryManager.addfeature? 以及我需要在哪里调用这个函数。在发送数据包之前? 我已经添加了示例代码,还检查了指向 ServiceDiscoveryManager 参考的链接,有一个注释可以更好地调用addFeature 缺少特征定义不会导致所描述的问题。

以上是关于在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ的主要内容,如果未能解决你的问题,请参考以下文章

Android aSmack - 如何为文件发送自定义消息扩展名?

asmack + android + 聊天应用程序

无法在 Android 上使用 asmack 登录 Facebook

使用新访问令牌在 android 上使用 asmack 进行 Facebook 聊天

Android中实现自定义XMPP消息包收发

Android中实现自定义XMPP消息包收发