Подтвердить что ты не робот

Включить управление потоками asmack android

У меня возникла проблема с использованием управления потоком XEP-0198.

В принципе, я хочу включить это для проблемы с выпуском сообщения на Android, когда интернет случайно отключается, а сервер все еще имеет присутствие в Интернете в Интернете.

Чтобы решить эту проблему, я хочу использовать XEP-0198, который использует процесс запроса и подтверждения. Вы можете найти здесь .

В основном я использую sm: 3 для этого. Проблема в том, что когда я устанавливаю

XMPPConnection.DEBUG_ENABLED=true;

Я получаю sm: 3 в журнале, который является внутренним для asmack, но я не могу это получить, добавив какой-либо пакетный список через соединение.

Это то, что внутри отладки отладки asmack:

<r xmlns='urn:xmpp:sm:3'/><message from='[email protected]/Smack' to='[email protected]' id='CQUe6-5'><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message><r xmlns='urn:xmpp:sm:3'/>

Это то, что я получаю от packageFilter:

<message id="CQUe6-5" to="[email protected]" from="[email protected]/Smack"><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message>

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

Я также видел ветку asmack git как это, но не смог понять, как ее реализовать.

Помогите, если вы каким-либо образом внедрили его в любую библиотеку, такую ​​как чат, yaxim или любой другой клиент XMPP для Android.

4b9b3361

Ответ 1

Я рекомендую использовать Smack 4.1, который работает на Android и, поддерживает XEP-198 Stream Management.

Ответ 2

Я не могу предложить вам решение, потому что у меня есть аналогичная проблема, но я могу сказать вам из второй ссылки, что UnknownPacket расширяет пакет И реализует PacketExtension, поэтому вам пришлось отдать свой StreamHandlingPacket to (PacketExtension) в операторе return вашего метода parseExtension.

Вы можете поймать <enabled xmlns='urn:xmpp:sm:3' etc> xml, который сервер XMPP возвращает при отправке <enable xmlns='urn:xmpp:sm:3' etc>? Если это так, это будет началом вашей проблемы.

Сообщите нам, как это происходит!

Ответ 3

Здесь можно найти исправленную утилиту asmack yaxim (создатель был достаточно любезен, чтобы направить меня на него, спасибо Ge0rG!):

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

Обязательно получите libidn.