2014-04-22 9 views
18

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.

Odpowiedz

0

nie mogę zaoferować rozwiązanie, bo mam podobny problem, ale mogę powiedzieć z drugiego linku, który UnknownPacket rozciąga Packet i wdraża PacketExtension, dlatego trzeba było oddać StreamHandlingPacket do (PacketExtension) w instrukcji return metody parse Extext.

Czy jesteś w stanie złapać xml <enabled xmlns='urn:xmpp:sm:3' etc>, który zwraca serwer XMP podczas wysyłania <enable xmlns='urn:xmpp:sm:3' etc>? Jeśli tak, to byłby początek twojego problemu.

Daj nam znać, jak to działa!

+0

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

+0

Obawiam się, że masz rację, a to, co próbujemy zrobić, nie jest możliwe: http://community.igniterealtime.org/message/238413#238413 – dbar

+0

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. –

0

połatany asmack zastosowania yaxim można znaleźć tutaj (twórca był rodzaj wystarczających do mnie skierować do niego, dzięki Ge0rG!):

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

Pamiętaj, aby dostać libidn również.

+0

Próbowałem już tej biblioteki, dodając do mojej ścieżki budowania, ale daje ona fatalny błąd podczas uwierzytelniania, ponieważ może być pewna zmiana w bibliotece (autoryzacja mogła zostać zmieniona). Chciałem tylko wiedzieć, jak załatać bibliotekę, aby móc zrobić łatkę z biblioteką zgodnie z moimi potrzebami. Czy muszę zobaczyć szczegóły implementacji yaxim i wszystkie metody –

+0

czy dodałeś bibliotekę libidn? – dbar

+0

Teraz dodałem libidn także i na razie działa. Przetestuję więcej w tym pierwszym –

1

Polecam za pomocą Smack 4.1, który działa na Androidzie i obsługuje zarządzanie strumieniem XEP-198.

+1

Czy jest samouczek dotyczący używania xep 198 z smack 4.1 w systemie Android? –

+0

Hi @Flow, czy możemy przesłonić zarządzanie strumieniem, aby wysłać potwierdzenie za każdym razem, kiedy chcemy? Chcę wysłać przesyłanie potwierdzenia po wstawieniu wiadomości do bazy danych, ale domyślne zarządzanie strumieniami wysyła potwierdzenie, gdy tylko otrzymam wiadomość. Z góry dziękuję. –

Powiązane problemy