启用流管理asmack android

时间:2014-04-22 14:47:30

标签: android xmpp asmack

我遇到了使用XEP-0198流管理的问题。

基本上,我想在互联网断开连接且服务器仍然在线存在客户端时,在Android上启用此消息丢弃问题。

要解决此问题,我想使用XEP-0198,它使用请求和确认过程。 您可以找到更多here

基本上我使用的是sm:3。问题是,当我设置

XMPPConnection.DEBUG_ENABLED=true;

我在日志中得到sm:3,这是asmack内部的,但我无法通过连接找到任何packetListner来获得它。

这就是asmack调试打印内容:

<r xmlns='urn:xmpp:sm:3'/><message from='test1@pinmessage.com/Smack' to='test1@pinmessage.com' id='CQUe6-5'><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message><r xmlns='urn:xmpp:sm:3'/>

这是我从packetFilter得到的:

<message id="CQUe6-5" to="test1@pinmessage.com" from="test1@pinmessage.com/Smack"><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message>

我通过查看聊天安全和yaxim的代码尝试了自定义数据包过滤器,但我没有得到如何在我的代码中获得此<r xmlns='urn:xmpp:sm:3'/>以便我可以返回已接收的数据包数量直到现在服务器,以便服务器可以将任何丢失的数据包发回给我。

我还通过添加以下代码为此配置了提供程序管理器:

        addSimplePacketExtension("sm", URN_SM_3);
        addSimplePacketExtension("r", URN_SM_3);
        addSimplePacketExtension("a", URN_SM_3);
        addSimplePacketExtension("enabled", URN_SM_3);
        addSimplePacketExtension("resumed", URN_SM_3);
        addSimplePacketExtension("failed", URN_SM_3);


private static final String URN_SM_3 = "urn:xmpp:sm:3";
    private static void addSimplePacketExtension(final String name, final String namespace) {
        Log.e("adding simple packet extension", namespace+"---"+name);
        ProviderManager.getInstance().addExtensionProvider(name, namespace,
                new PacketExtensionProvider() {
            public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
                StreamHandlingPacket packet = new StreamHandlingPacket(name, namespace);
                Log.e("Stream ahndling packet ","------>"+packet.toXML());
                int attributeCount = parser.getAttributeCount();
                for (int i = 0 ; i < attributeCount ; i++) {
                    packet.addAttribute(parser.getAttributeName(i), parser.getAttributeValue(i));
                }
                return (PacketExtension) packet;
            }
        });
    }


static class StreamHandlingPacket extends Packet {
        private String name;
        private String namespace;
        Map<String, String> attributes;

        StreamHandlingPacket(String name, String namespace) {
            this.name = name;
            this.namespace = namespace;
            attributes = Collections.emptyMap();
        }

        public void addAttribute(String name, String value) {
            if (attributes == Collections.EMPTY_MAP)
                attributes = new HashMap<String, String>();
            attributes.put(name, value);
        }

        public String getAttribute(String name) {
            return attributes.get(name);
        }

        public String getNamespace() {
            return namespace;
        }

        public String getElementName() {
            return name;
        }

        public String toXML() {
            StringBuilder buf = new StringBuilder();
            buf.append("<").append(getElementName());

            // TODO Xmlns??
            if (getNamespace() != null) {
                buf.append(" xmlns=\"").append(getNamespace()).append("\"");
            }
            for (String key : attributes.keySet()) {
                buf.append(" ").append(key).append("=\"").append(StringUtils.escapeForXML(attributes.get(key))).append("\"");
            }
            buf.append("/>");
            Log.e("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&","&&&&&&&&&&&&&&&&&&&&&&&&&&&&=>"+buf.toString());
            return buf.toString();
        }

    }

基本上我通过看到聊天安全实现来获得这个想法,但它扩展了UnkownPacket而不是Packet。我从here获得了帮助。

我也看过a git branch of asmack like this,但无法理解如何实现它。

如果您以任何方式使用chat secure,yaxim或任何其他Android XMPP客户端等库实现它,请提供帮助。

3 个答案:

答案 0 :(得分:1)

我建议使用在Android上运行的Smack 4.1 支持XEP-198流管理。

答案 1 :(得分:0)

我无法为您提供解决方案,因为我遇到了类似的问题,但我可以从第二个链接告诉您UnknownPacket扩展Packet 并实现PacketExtension ,这就是为什么你必须投射你的您的parseExtension方法的return语句中的StreamHandlingPacket到(PacketExtension)。

您是否能够捕获发送<enabled xmlns='urn:xmpp:sm:3' etc>时XMPP服务器返回的<enable xmlns='urn:xmpp:sm:3' etc> xml?如果是这样,那将是你问题的开始。

告诉我们它是怎么回事!

答案 2 :(得分:0)

可以在这里找到补丁的asmack yaxim用途(创建者非常友好地指导我,感谢Ge0rG!):

https://github.com/pfleidi/yaxim/tree/master/libs

一定要得到libidn。