Ответ 1
Я рекомендую использовать Smack 4.1, который работает на Android и, поддерживает XEP-198 Stream Management.
У меня возникла проблема с использованием управления потоком 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.
Я рекомендую использовать Smack 4.1, который работает на Android и, поддерживает XEP-198 Stream Management.
Я не могу предложить вам решение, потому что у меня есть аналогичная проблема, но я могу сказать вам из второй ссылки, что UnknownPacket расширяет пакет И реализует PacketExtension, поэтому вам пришлось отдать свой StreamHandlingPacket to (PacketExtension) в операторе return вашего метода parseExtension.
Вы можете поймать <enabled xmlns='urn:xmpp:sm:3' etc>
xml, который сервер XMPP возвращает при отправке <enable xmlns='urn:xmpp:sm:3' etc>
? Если это так, это будет началом вашей проблемы.
Сообщите нам, как это происходит!
Здесь можно найти исправленную утилиту asmack yaxim (создатель был достаточно любезен, чтобы направить меня на него, спасибо Ge0rG!):
https://github.com/pfleidi/yaxim/tree/master/libs
Обязательно получите libidn.