2015-05-15 16 views
5

Tôi muốn phát triển một ứng dụng nhắn tin tức thời. GCM, để đẩy dữ liệu là một cách phổ biến (và hiệu quả), nếu bạn đang sử dụng android, nhưng tôi không sử dụng nó vì các lý do sau:Cách sử dụng XMPP liên tục hiệu quả với android

  1. Nó xóa hơn 100 tin nhắn chưa được gửi.
  2. Nó sẽ không hoạt động trên các thiết bị không có ứng dụng google.

Thay vào đó, tôi quyết định thiết lập máy chủ XMPP truyền thống (openFire) và tôi đang sử dụng Smack api (kết nối TCP) để kết nối. Cho đến nay, nó đang diễn ra tốt đẹp, nhưng tôi có một vài lo ngại.

Đây là một mã thử nghiệm nhỏ tôi đã viết (nó chạy trong một dịch vụ):

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(); 

Chú ý phần cuối của đoạn này. Tôi phải chạy một vòng lặp vô hạn để tôi có thể tiếp tục nghe các gói tin đến (nếu tôi không bao gồm mã này, tôi không thể chặn bất kỳ gói dữ liệu gửi đến nào).

Câu hỏi của tôi là:

  1. là phương pháp này sẽ mất một lượng lớn pin?
  2. Phương pháp này có ngăn thiết bị ngủ không?
  3. Có cách nào tốt hơn để hoàn thành công việc (không sử dụng GCM) không?
  4. Có cách nào để tích hợp GCM với OPENFIRE không?

Trả lời

5

Chúng tôi đã có cùng một yêu cầu trong quá khứ, nơi Chúng tôi cung cấp một chức năng trò chuyện bên ngoài với ứng dụng của chúng tôi, mà chúng tôi sử dụng XMPP [sử dụng aSmack],

Đó là bí quyết tốt mà bạn có hình dung ra bạn cần phải sử dụng một dịch vụ bên ngoài để tạo kết nối xmpp bền vững với máy chủ, nhưng đảm bảo dịch vụ phải là dịch vụ nền và làm cho dịch vụ này trở nên hấp dẫn.

Hoặc sử dụng GCM hoặc XMPP thực sự phụ thuộc vào cách bạn thiết kế hệ thống, bạn có thể sử dụng cả hai trong ứng dụng của mình để làm cho nó ổn định hơn và gây phức tạp hơn !!!!!

Vẫn là một cú sút dài để tạo ra một hệ thống phức tạp như vậy, bạn luôn có thể đi với giải pháp đơn giản có sẵn đó là XMPP.

Phương pháp này có tốn nhiều pin không? Nó không nên !!! vì bạn đang sử dụng khoảng thời gian ping mặc định ở đây (là thực sự 30 phút), nó không nên tiêu thụ nhiều pin hơn. nếu bạn đã sử dụng khoảng thời gian ping dưới 5 phút thì bạn nên lo lắng về vấn đề về pin thoát nước !!!

Phương pháp này có ngăn thiết bị ngủ không? Theo hiểu biết của tôi, Bạn đang sử dụng kết nối TCP ở đây trừ khi không có dữ liệu trên thiết bị đầu vào có thể đi vào giấc ngủ, ngay sau một số dữ liệu đến thiết bị sẽ thức dậy và hoặc bạn gửi một số dữ liệu trên cùng một ổ cắm [như nhịp tim/ping] để giữ cho cpu tỉnh táo.nhưng vẫn còn hành vi này có thể khác nhau tùy theo từng sản phẩm di động khác nhau.

Có cách nào tốt hơn để hoàn thành công việc (không sử dụng GCM) không? XMPP luôn là lựa chọn thay thế mạnh mẽ của gcm, miễn là bạn biết những gì là bạn thực sự đang tìm kiếm. Bạn luôn có thể cố gắng tối ưu hóa hệ thống của mình để có kết quả đầu ra.

Có cách nào để tích hợp GCM với OPENFIRE không? Tôi đang bối rối ở đây những gì bạn thực sự muốn hỏi ở đây !!! gcm (CCS) là google triển khai máy chủ XMPP, bạn luôn có thể tạo máy khách XMPP bằng cách sử dụng smack nhưng để tích hợp GCM với Openfire nghĩa là bạn đang xem thông tin từ máy chủ đến máy chủ, nằm ngoài phạm vi của . sự hiểu biết của tôi!!!!

Dưới đây là một số liên kết hữu ích mà có thể giúp bạn ra ngoài với nghiên cứu

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

của bạn khi tôi nói 'tích hợp' với Openfire , ý của tôi là vậy : nếu ứng dụng không mở và tin nhắn đến, openfire sẽ gửi tin nhắn thông qua GCM. Nếu ứng dụng được khởi động, sau đó kết nối socket sẽ được thiết lập và nó sẽ nói trực tiếp với máy chủ xmpp –

+0

Tôi nghĩ bạn đang tìm kiếm trình cắm thêm servlet tùy chỉnh trong Openfire, tham khảo liên kết này 1. https: // community. igniterealtime.org/thread/50919 2. https://community.igniterealtime.org/thread/47895 – Dev

+0

lưu ý ở đây Tôi chưa bao giờ sử dụng trình cắm thêm như vậy bản thân mình instate tôi đã sử dụng tính năng Tin nhắn Ngoại tuyến của XMPP http: // xmpp .org/extensions/xep-0160.html, Sử dụng tính năng triển khai này nếu openfire phát hiện người dùng đang nhận là Offline nó lưu trữ tin nhắn và cung cấp tất cả các tin nhắn ngoại tuyến ngay sau khi nhận được người dùng trực tuyến và gửi sự hiện diện [online/available]. – Dev

Các vấn đề liên quan