Mam do czynienia z problemem z korzystaniem z zarządzania strumieniowego XEP-0198.Włącz zarządzanie strumieniem asmack android
Zasadniczo chcę włączyć tę funkcję w przypadku problemu z pomijaniem wiadomości na Androidzie, gdy dyskontuje się losowo, a serwer nadal ma obecność klienta w Internecie.
Aby rozwiązać ten problem, chcę użyć XEP-0198, który wykorzystuje proces żądania i potwierdzenia. Możesz znaleźć więcej here.
Zasadniczo używam sm: 3 do tego. Problemem jest to, że kiedy ustawić
XMPPConnection.DEBUG_ENABLED=true;
mam SM: 3 w dzienniku, który jest wewnętrzny do asmack ale jestem w stanie dostać się, że przez ading żadnego packetListner nad połączeniem.
To co wewnątrz asmack wydruków debug:
<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'/>
To, co dostaję od packetFilter:
<message id="CQUe6-5" to="[email protected]" from="[email protected]/Smack"><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message>
próbowałem filtra niestandardowego pakietu widząc kod czat bezpieczne i yaxim jak również, ale nie dostaję, jak mogę uzyskać ten <r xmlns='urn:xmpp:sm:3'/>
w moim kodzie, dzięki czemu mogę zwrócić liczbę pakietów odebranych do serwera, aby serwer mógł wysłać mi brakujący pakiet.
ja również skonfigurować menedżera dostawcy za to dodając poniższy kod:
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();
}
}
Zasadniczo mam ten pomysł widząc czat bezpieczną realizację lecz rozciąga UnkownPacket zamiast pakietu. Przyjąłem pomoc od here.
Widziałem również a git branch of asmack like this, ale nie byłem w stanie zrozumieć, jak go wdrożyć.
Pomóż, jeśli zaimplementowałeś ją w jakikolwiek sposób z dowolną biblioteką, taką jak czat bezpieczny, yaxim lub dowolny inny klient XMPP dla systemu Android.
Nie jestem w stanie uzyskać znacznika, to jest główny problem, ponieważ wszystkie te są drukowane w dzienniku, ale na mojej warstwie nie jestem w stanie go uzyskać. Mogę uzyskać wszystkie inne
Obawiam się, że masz rację, a to, co próbujemy zrobić, nie jest możliwe: http://community.igniterealtime.org/message/238413#238413 – dbar
Ale widzę, że niektórzy klienci go zaimplementowali. Yoc może sprawdzić ChatSecure i Yaxim na linkach poniżej: http://yaxim.org/blog/2014/01/30/yaxim-0-dot-8-7-stream-management-and-more/ https://github.com/devrandom/asmack/commit/5f8bee65064006ba6e479f2c515516f4670be1b5 https://github.com/guardianproject/ChatSecureAndroid/pull/116 i jak na mojej wiedzy są one również przy użyciu aSmack. –