2015-05-15 21 views
5

Chcę opracować aplikację do obsługi wiadomości błyskawicznych. GCM, za popychanie danych jest popularnym (i wydajne) do zrobienia, jeśli jesteś na Android, ale nie używam go z powodu następujących powodów:Jak skutecznie korzystać z trwałego XMPP z Androidem

  1. To usuwa ponad 100 niedostarczonych wiadomości.
  2. Nie będzie działać na urządzeniach, które nie mają aplikacji Google.

Zamiast tego zdecydowałem się na skonfigurowanie tradycyjnego serwera XMPP (openFire), a do połączenia używam interfejsu API Smack (połączenie TCP). Do tej pory wszystko idzie dobrze, ale mam kilka obaw.

Jest to mały kod testowy pisałem (działa w służbie):

Log.d("TAG","service has started"); 
     SmackConfiguration.setDefaultPacketReplyTimeout(10000); 
     XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() 
       .setUsernameAndPassword("admin", "football100") 
       .setServiceName("harsh-pc") 
       .setHost("192.168.0.200") 
       .setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
       .build(); 

     final AbstractXMPPConnection conn2 = new XMPPTCPConnection(config); 
     try { 
      conn2.connect(); 

      conn2.login(); 

      Presence presence = new Presence(Presence.Type.available); 
      presence.setStatus("online"); 
      // Send the packet (assume we have an XMPPConnection instance called "con"). 
      conn2.sendStanza(presence); 

     } catch (SmackException | IOException | XMPPException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.d("TAG", e.toString()); 
     } 
StanzaFilter filter=new StanzaFilter() { 
    @Override 
    public boolean accept(Stanza stanza) { 
     return true; 
    } 
}; 
     StanzaListener listener= new StanzaListener() { 
      @Override 
      public void processPacket(Stanza packet) throws SmackException.NotConnectedException { 
       Log.d("TAG","recevied stuff"); 
       ChatManager chatmanager = ChatManager.getInstanceFor(conn2); 


       Chat newChat = chatmanager.createChat("[email protected]"); 
       newChat.sendMessage("Reply :) "); 
      } 
     }; 

     conn2.addAsyncStanzaListener(listener,filter); 
     ChatManager chatmanager = ChatManager.getInstanceFor(conn2); 


     Chat newChat = chatmanager.createChat("[email protected]"); 

     try { 
      Random r=new Random(); 

       // newChat.sendMessage(Integer.toString(r.nextInt())); 
      Thread.sleep(1500); 


      } 
     catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Log.d("TAG",e.toString()); 
     } 
    } 
}).start(); 


final Thread sleeper=new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for(;;){ 
      try { 
       Thread.sleep(100000); 
       Log.d("TAG","SLEEPI"); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
});sleeper.start(); 

Wskazówka ostatnia część tego fragmentu. Muszę uruchomić nieskończoną pętlę, aby móc dalej nasłuchiwać przychodzących pakietów (jeśli nie dołączę tego kodu, nie jestem w stanie przechwycić żadnych przychodzących pakietów).

Moje pytania są następujące:

  1. Czy metoda ta zajmie ogromne ilości baterii?
  2. Czy ta metoda zapobiegnie spaniu urządzenia?
  3. Czy istnieje lepszy sposób na załatwianie spraw (bez korzystania z GCM)?
  4. Czy istnieje sposób na integrację GCM z OPENFIRE?

Odpowiedz

5

Mieliśmy ten sam wymóg w przeszłości, w którym zapewniliśmy o funkcji czatu zewnętrznego z naszej aplikacji, dla których nie wykorzystaliśmy XMPP [użyciem aSmack]

Dobrze jest wiedzieć, że że trzeba wymyślić ci do korzystania z usługi xmpp z serwerem trzeba użyć usługi zewnętrznej, ale upewnij się, że usługa powinna być usługą działającą w tle i uczynić ją usługą lepką.

Albo Używaj GCM albo XMPP jest rzeczywiście zależny od tego, jak projektujesz swój system, możesz użyć ich obu w swojej aplikacji, aby uczynić ją bardziej stabilną i bardziej złożoną !!!!!

Wciąż jest to długa szansa na stworzenie tak złożonego systemu, do którego zawsze można przejść za pomocą prostego rozwiązania dostępnego w tym XMPP.

Czy ta metoda wymaga dużej ilości baterii? To nie powinno! ponieważ używasz tutaj domyślnego interwału ping (który jest faktycznie 30 min.), nie powinien zużywać więcej baterii. jeśli używałeś interwału pingowego mniejszego niż 5 min, powinieneś martwić się o problem z drenażem baterii !!!

Czy ta metoda zapobiegnie spaniu urządzenia? Zgodnie z moim rozumowaniem, korzystasz z połączenia TCP tutaj, chyba że nie ma danych o tym, że urządzenie wejściowe może wejść w tryb uśpienia, jak tylko pojawi się dane, urządzenie się obudzi i albo wyślesz dane do tego samego gniazda [takie jak bicie serca/ping], aby utrzymać stan uśpienia cpu.ale nadal to zachowanie może się różnić, jak w przypadku różnych produkcji mobilnych.

Czy istnieje lepszy sposób na załatwianie spraw (bez korzystania z GCM)? XMPP jest zawsze silną alternatywą dla gcm, o ile wiesz, czego naprawdę szukasz. . Zawsze możesz spróbować zoptymalizować swój system dla wyjścia z ciasta.

Czy istnieje sposób na integrację GCM z OPENFIRE? Jestem zdezorientowany, o co naprawdę chcesz zapytać tutaj !!! gcm (CCS) to implementacja google serwera XMPP zawsze możesz utworzyć klienta XMPP za pomocą smack, ale integracja GCM z Openfire oznacza, że ​​jesteś patrząc na komunikację między serwerami, co wykracza poza zakres wymagań aplikacji według moje zrozumienie!!!!

Poniżej przedstawiamy kilka przydatnych linków, które mogą pomóc z badaniach

Should applications using aSmack use foreground Services?

How to keep a XMPP connection stable on Android with (a)smack?

How To Create Service In Android Which Makes Persist Xmpp Connection With XMPP Server?

Keep XMPP connection (using asmack) alive on Android

+0

kiedy mówię 'integracji' z Openfire Miałem na myśli to : , jeśli aplikacja nie jest otwarta, a pojawi się wiadomość, openfire wyśle ​​wiadomość przez GCM. Jeśli aplikacja zostanie uruchomiona, to połączenie z gniazdem zostanie nawiązane i będzie rozmawiał bezpośrednio z serwerem xmpp. –

+0

Myślę, że szukasz niestandardowej wtyczki serwletu w Openfire, odnieś ten link 1. https: // community. igniterealtime.org/thread/50919 2. https://community.igniterealtime.org/thread/47895 – Dev

+0

uwaga tutaj nigdy nie korzystałem z takiej wtyczki instate Użyłem funkcji Offline Messages XMPP http: // xmpp .org/extensions/xep-0160.html, Korzystając z tej funkcji, jeśli openfire wykryje, że odbierający jest zalogowany, przechowuje wiadomości i dostarcza wszystkie wiadomości w trybie offline, gdy tylko użytkownik odbierze połączenie internetowe i wyśle ​​wiadomość [online/available]. – Dev