【问题标题】:Send and Receive IQ XMPP ASMACK Android发送和接收 IQ XMPP ASMACK Android
【发布时间】:2014-04-16 03:42:42
【问题描述】:

背景:

我已经能够使用asmack 库在android 中通过XMPP 实现一对一聊天。我也可以将状态发送到服务器。我正在为基于聊天的应用程序使用OpenFire 服务器。

问题: 我正在使用connection.addPacketListener(new PacketListener() 接收消息和 IQ 数据包,对于消息数据包我已经这样分类了

PacketFilter Chatfilter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(new PacketListener() {
        public void processPacket(Packet packet) {
            Message message = (Message) packet;
            if (message.getBody() != null) {
                String fromName = StringUtils.parseBareAddress(message.getFrom());
                Log.i("XMPPClient", "Got text [" + message.getBody() + "] from [" + fromName + "]");
                messages.add(fromName + ":");
                m1=message.getBody();
                messages.add(message.getBody());
                // Add the incoming message to the list view
                /* mHandler.post(new Runnable() {
                public void run() {
                setListAdapter();
                recieve.setText(m1);
                }
                });*/
            }
        }
}, Chatfilter);

一切正常,但是问题出现了我使用类似的东西来接收 IQ 数据包

这是我用来接收 IQ 数据包的代码

PacketFilter Iqfilter = new IQTypeFilter(IQ.Type.RESULT);
connection.addPacketListener(new PacketListener() {
    public void processPacket(Packet packet) {
        IQ iq = (IQ) packet;
        String fromName = StringUtils.parseBareAddress(iq.getFrom());
        Log.i("XMPPClient", "Got text [" + iq.toString() + "] from [" + fromName + "]");
        m1=iq.getFrom();
        mHandler.post(new Runnable() {
            public void run() {
                setListAdapter();
                recieve.setText(m1);
            }
        });
    }
}, Iqfilter);

我正在发送一个简单的disco#items 查询并且它没有响应,即使它没有进入函数,我也尝试过调试它,我也尝试过发送简单的PING 命令但它确实也不回应。 我在这里错过了什么?

其次,我在向服务器或其他客户端发送 IQ 数据包时也遇到了问题。我在某处读到我应该这样做。但它不起作用。

final IQ iq = new IQ() {
            public String getChildElementXML() { 
            return "<query xmlns='http://jabber.org/protocol/disco#info'/>"; // here is your query
            //this returns "<iq type='get' from='User@YourServer/Resource' id='info1'> <query xmlns='http://jabber.org/protocol/disco#info'/></iq>";
             }};
            // set the type
            iq.setType(IQ.Type.GET);

            // send the request
            connection.sendPacket(iq);

令人困惑的是,当我阅读 XMPP 和 asmack for android 的文档时,写到要发送 IQ,您还需要有接收者的地址。但在这段代码中,我们没有设置任何接收器。

互联网上有关 XMPP asmack 和 Android 的信息要少得多。

【问题讨论】:

    标签: java android sockets xmpp asmack


    【解决方案1】:

    例如发送自定义消息时,

    <iq id='123' type='get' from='client@xmpp/B' to='client2@xmpp/s2'><req var='read'><attr var='temprature'/></req></iq>
    

    您需要定义自己的 IQ 并发送此 IQ:

    public class MyIQ extends IQ {
            @Override
            public String getChildElementXML() {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("&lt;req var='read'&gt;&lt; attr var='temprature'/&gt;&lt;/req&gt;");
                return stringBuilder.toString();
            }
        }
    
        MyIQ packet = new MyIQ();
        packet.setType(IQ.Type.GET);
        packet.setFrom("client@xmpp/B");
        packet.setTo("client2@xmpp/s2");
        xmppConnection.sendPacket(packet);
    

    【讨论】:

      【解决方案2】:

      发送出去,其实只需要构造xml字符串并在getChildElementXML()中返回,不需要其他设置。

      为了接收IQ响应,首先需要创建IQProvider并添加到ProviderManager,匹配查询对象中的xmlns。 IQProvider 用于将响应数据包转换为您自定义的 IQ 对象。然后,您需要扩展 PacketListener,并在创建连接对象时,将侦听器添加到其中,并使用 PacketTypeFilter 来匹配您的 IQ 类。正确设置提供者和侦听器后,您应该能够收到 IQ 的响应。

      这是参考:https://billynyh.github.io/blog/2014/09/28/android-xmpp-dev/

      【讨论】:

        【解决方案3】:

        我认为问题在于您的提供商未注册。请查看this。在 Android 上,您必须在建立 XMPP 连接之前手动注册提供程序。将下面的类复制到您的项目中

        import org.jivesoftware.smack.provider.PrivacyProvider;
        import org.jivesoftware.smack.provider.ProviderManager;
        import org.jivesoftware.smackx.GroupChatInvitation;
        import org.jivesoftware.smackx.PrivateDataManager;
        import org.jivesoftware.smackx.packet.ChatStateExtension;
        import org.jivesoftware.smackx.packet.LastActivity;
        import org.jivesoftware.smackx.packet.OfflineMessageInfo;
        import org.jivesoftware.smackx.packet.OfflineMessageRequest;
        import org.jivesoftware.smackx.packet.SharedGroupsInfo;
        import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;
        import org.jivesoftware.smackx.provider.BytestreamsProvider;
        import org.jivesoftware.smackx.provider.DataFormProvider;
        import org.jivesoftware.smackx.provider.DelayInformationProvider;
        import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
        import org.jivesoftware.smackx.provider.DiscoverItemsProvider;
        import org.jivesoftware.smackx.provider.MUCAdminProvider;
        import org.jivesoftware.smackx.provider.MUCOwnerProvider;
        import org.jivesoftware.smackx.provider.MUCUserProvider;
        import org.jivesoftware.smackx.provider.MessageEventProvider;
        import org.jivesoftware.smackx.provider.MultipleAddressesProvider;
        import org.jivesoftware.smackx.provider.RosterExchangeProvider;
        import org.jivesoftware.smackx.provider.StreamInitiationProvider;
        import org.jivesoftware.smackx.provider.VCardProvider;
        import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;
        import org.jivesoftware.smackx.search.UserSearch;
        
        import android.util.Log;
        
        public class ServiceProviders {
            public static void Register_Providers(ProviderManager pm) {
        
                // Private Data Storage
                pm.addIQProvider("query", "jabber:iq:private",
                        new PrivateDataManager.PrivateDataIQProvider());
        
                // Time
                try {
                    pm.addIQProvider("query", "jabber:iq:time",
                            Class.forName("org.jivesoftware.smackx.packet.Time"));
                } catch (ClassNotFoundException e) {
                    Log.w("TestClient",
                            "Can't load class for org.jivesoftware.smackx.packet.Time");
                }
        
                // Roster Exchange
                pm.addExtensionProvider("x", "jabber:x:roster",
                        new RosterExchangeProvider());
        
                // Message Events
                pm.addExtensionProvider("x", "jabber:x:event",
                        new MessageEventProvider());
        
                // Chat State
                pm.addExtensionProvider("active",
                        "http://jabber.org/protocol/chatstates",
                        new ChatStateExtension.Provider());
        
                pm.addExtensionProvider("composing",
                        "http://jabber.org/protocol/chatstates",
                        new ChatStateExtension.Provider());
        
                pm.addExtensionProvider("paused",
                        "http://jabber.org/protocol/chatstates",
                        new ChatStateExtension.Provider());
        
                pm.addExtensionProvider("inactive",
                        "http://jabber.org/protocol/chatstates",
                        new ChatStateExtension.Provider());
        
                pm.addExtensionProvider("gone",
                        "http://jabber.org/protocol/chatstates",
                        new ChatStateExtension.Provider());
        
                // XHTML
                pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
                        new XHTMLExtensionProvider());
        
                // Group Chat Invitations
                pm.addExtensionProvider("x", "jabber:x:conference",
                        new GroupChatInvitation.Provider());
        
                // Service Discovery # Items
                pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
                        new DiscoverItemsProvider());
        
                // Service Discovery # Info
                pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
                        new DiscoverInfoProvider());
        
                // Data Forms
                pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
        
                // MUC User
                pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
                        new MUCUserProvider());
        
                // MUC Admin
                pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
                        new MUCAdminProvider());
        
                // MUC Owner
                pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
                        new MUCOwnerProvider());
        
                // Delayed Delivery
                pm.addExtensionProvider("x", "jabber:x:delay",
                        new DelayInformationProvider());
        
                // Version
                try {
                    pm.addIQProvider("query", "jabber:iq:version",
                            Class.forName("org.jivesoftware.smackx.packet.Version"));
                } catch (ClassNotFoundException e) {
                    // Not sure what's happening here.
                }
        
                // VCard
                pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
        
                // Offline Message Requests
                pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
                        new OfflineMessageRequest.Provider());
        
                // Offline Message Indicator
                pm.addExtensionProvider("offline",
                        "http://jabber.org/protocol/offline",
                        new OfflineMessageInfo.Provider());
        
                // Last Activity
                pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
        
                // User Search
                pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
        
                // SharedGroupsInfo
                pm.addIQProvider("sharedgroup",
                        "http://www.jivesoftware.org/protocol/sharedgroup",
                        new SharedGroupsInfo.Provider());
        
                // JEP-33: Extended Stanza Addressing
                pm.addExtensionProvider("addresses",
                        "http://jabber.org/protocol/address",
                        new MultipleAddressesProvider());
        
                // FileTransfer
                pm.addIQProvider("si", "http://jabber.org/protocol/si",
                        new StreamInitiationProvider());
        
                pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
                        new BytestreamsProvider());
        
                // Privacy
                pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
        
                pm.addIQProvider("command", "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider());
                pm.addExtensionProvider("malformed-action",
                        "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider.MalformedActionError());
                pm.addExtensionProvider("bad-locale",
                        "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider.BadLocaleError());
                pm.addExtensionProvider("bad-payload",
                        "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider.BadPayloadError());
                pm.addExtensionProvider("bad-sessionid",
                        "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider.BadSessionIDError());
                pm.addExtensionProvider("session-expired",
                        "http://jabber.org/protocol/commands",
                        new AdHocCommandDataProvider.SessionExpiredError());
        
                pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
                        new DiscoverInfoProvider());
                pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
                // pm.addExtensionProvider("status ","", new XMLPlayerList());
        
            }
        }
        

        这样调用这个方法

        ServiceProviders.Register_Providers(ProviderManager.getInstance());
        

        因此,请尝试在您的应用启动时或在建立连接之前调用此方法。

        希望对你有帮助

        【讨论】:

        • 太好了,现在我收到了一侧的回复,这太棒了,非常感谢,但现在我该如何回复服务器。例如,我正在使用 xmpp 分析器,并向我的客户端发送 disco#items 查询,该查询由我的客户端接收,但客户端没有响应服务器。我需要添加响应处理程序或类似的东西吗?
        • 其次,如何将原始 xml 查询从客户端发送到服务器。?我在代码中是否也遗漏了什么?
        • @HassaanRabbani Nic 知道上述解决方案有效。我没有玩太多 asmack xmpp,也没有使用 disco#items 查询的经验。所以我建议你为此提出另一个问题,以便比我更有经验的人可以指导你。如果以上答案解决了您的问题,请接受:)
        • 上述解决方案解决了一个问题,即接收 IQ,发送 IQ 呢?如何从另一个客户端或从客户端到服务器向客户端发送 IQ?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多