android消息推送

1.引言

  所謂的消息推送就是從服務器端向移動終端發送連接,傳輸一定的信息。比如一些新聞客戶端,每隔一段時間收到一條或者多條通知,這就是從服務器端傳來的推送消息;還比如常用的一些IM軟件如微信、GTalk等,都具有服務器推送功能。

  推送方法如下:

  1)通過SMS進行服務器端和客戶端的交流通信。

  在Android平臺上,你可以通過攔截SMS消息並且解析消息內容來了解服務器的意圖,可以實現完全的實時操作。但是問題是這個方案的成本相對比較高,且依賴於運營商。

  2)循環主動定時獲取

  這種方法需要客戶端來做一個定時或者週期性的訪問服務器端接口,以獲得最新的消息。輪詢的頻率太慢可能導致某些消息的延遲,太快則會大量消耗網絡帶寬和電池。

  3)持久連接

  這個方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池。我們需要開一個服務來保持和服務器端的持久連接(蘋果就和谷歌的C2DM是這種機制)。但是對於Android系統,當系統可用資源較低,系統會強制關閉我們的服務或者是應用,這種情況下連接會強制中斷。(Apple的推送服務之所以工作的很好,是因爲每一臺手機僅僅保持一個與服務器之間的連接,事實上C2DM也是這麼工作的。即所有的推送服務都是經由一個代理服務器完成的,這種情況下只需要和一臺服務器保持持久連接即可。C2DM=Cloud to Device Messaging)。

  相比之下第三種還是最可行的。爲軟件編寫系統服務或開機啓動功能;或者如果系統資源較低,服務被關閉後可以在onDestroy ()方法裏面再重啓該服務,進而實現持久連接的方式。

  C2DM內置於Android的2.2系統上,無法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM服務器,由於國內的網絡環境,這個服務經常不可用。

  建立在TCP協議之上的XMPP協議,不僅可提供可這種持久連接的功能,能實現服務器和客戶機的雙工通信,還能不依賴與系統版本和google服務器的限制,提供了比較好的解決方案。

2. XMPP協議

  XMPP全稱Extensible Messaging and Presence Protocol,前身是Jabber項目,是一種以XML爲基礎的開放式即時通訊協議。XMPP因爲被Google Talk和網易泡泡應用而被廣大網民所接觸。XMPP的關鍵特色是,分散式的即時通訊系統,以及使用XML串流。XMPP目前被IETF國際標準組織完成了標準化工作。

  Android push notification(androidpn) 是一個基於XMPP協議的java開源實現,它包含了完整的客戶端和服務器端。該服務器端基本是在另外一個開源工程openfire基礎上修改實現的。

  androidpn客戶端需要用到一個基於java的開源XMPP協議包asmack,這個包同樣也是基於openfire下的另外一個開源項目smack,不過我們不需要自己編譯,可以直接把androidpn客戶端裏面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與服務器建立持久連接,並通過該連接進行用戶註冊和登錄認證,同樣也是通過這條連接,接收服務器發送的通知。

  androidpn服務器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring框架,這一點與openfire是不同的。Androidpn服務器包含兩個部分,一個是偵聽在5222端口上的XMPP服務,負責與客戶端的XMPPConnection類進行通信,作用是用戶註冊和身份認證,併發送推送通知消息。另外一部分是Web服務器,採用一個輕量級的HTTP服務器,負責接收用戶的Web請求。服務器的這兩方式,意義非凡:當相應的TCP端口被防火牆封閉,可以使用輪詢的方式進行訪問,因此又有助於通過防火牆。


3. XMPP協議實現Android推送

     本文主要介紹AndroidPn項目實現推送的使用過程。


      在Android中實現信息推送,其中一個比較成熟的解決方案便是使用XMPP協議實現。而AndroidPn項目就是使用XMPP協議實現信息推送的一個開源項目。

Apndroid Push Notification的特點: 

快速集成:提供一種比C2DM更加快捷的使用方式,避免各種限制.  

無需架設服務器:通過使用"雲服務",減少額外服務器負擔.

可以同時推送消息到網站頁面,android 手機

耗電少,佔用流量少.

   

具體配置過程: 

首先, 我們需要下載androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。

下載地址:http://sourceforge.net/projects/androidpn/     (如果打開不了上面的網址,那就需要翻牆了,你懂得)。

     

解壓兩個包,Eclipse導入client,配置好目標平臺,打開raw/androidpn.properties文件,配置客戶端程序。

 

1. 如果是模擬器來運行客戶端程序,把xmppHost配置成10.0.2.2[模擬器把10.0.2.2認爲是所在主機的地址,127.0.0.1是模擬器   本身的迴環地址,10.0.2.1表示網關地址,10.0.2.3表示DNS地址,10.0.2.15表示目標設備的網絡地址],關於模擬器的詳細信息,大家可參閱相關資料,這裏不再詳述.

xmppPort=5222 是服務器的xmpp服務監聽端口
運行androidpn-server-0.5.0\bin\run.bat啓動服務器,從瀏覽器訪問http://127.0.0.1:7070/index.do (androidPN Server有個輕量級的web服務器,在7070端口監聽請求,接受用戶輸入的文本消息)

  運行客戶端,客戶端會向服務器發起連接請求,註冊成功後,服務器能識別客戶端,並維護和客戶端的IP長連接。


2. 如果是在同一個局域網內的其他機器的模擬器測試(或者使用同一無線路由器wifi上網的真機) ,則需要把這個值設置爲服務器機器的局域網ip.  

例如 你的電腦和android手機 都通過同一個無線路由器wifi上網, 電腦的ip地址爲 192.168.1.2 而 手機的ip地址爲 192.168.1.3, 這個時候 需要把這個值修改爲 xmppHost=192.168.1.1 或是電腦的IP地址,就可以在手機上使用了.

      3. 如果是不在同一個局域網的真機測試,我們需要將這個值設置爲服務器的IP地址。 

       具體配置如下圖所示:

      

       

      

我的電腦IP是:192.168.8.107 

服務器運行主界面:

    推送消息:

  

     測試結果如下圖: 

    

 

   


     模擬器和真機測試通過。


4. 其他消息推送方案概述

A、C2DM雲端推送方案

在Android手機平臺上,Google提供了C2DM(Cloudto Device Messaging)服務。Android Cloud to Device Messaging (C2DM)是一個用來幫助開發者從服務器向Android應用程序發送數據的服務。該服務提供了一個簡單的、輕量級的機制,允許服務器可以通知移動應用程序直接與服務器進行通信,以便於從服務器獲取應用程序更新和用戶數據。

該方案存在的主要問題是C2DM需要依賴於Google官方提供的C2DM服務器,由於國內的網絡環境,這個服務經常不可用。

B、MQTT協議實現Android推送

採用MQTT協議實現Android推送功能也是一種解決方案。MQTT是一個輕量級的消息發佈/訂閱協議,它是實現基於手機客戶端的消息推送服務器的理想解決方案。

wmqtt.jar 是IBM提供的MQTT協議的實現。我們可以從這裏(https://github.com/tokudu/AndroidPushNotificationsDemo)下載該項目的實例代碼,並且可以找到一個採用PHP書寫的服務器端實現(https://github.com/tokudu/PhpMQTTClient)。

C、RSMB實現推送功能

Really Small Message Broker (RSMB) ,是一個簡單的MQTT代理,同樣由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打開1883端口,應用程序當中,它負責接收來自服務器的消息並將其轉發給指定的移動設備。SAM是一個針對MQTT寫的PHP庫。我們可以從這個http://pecl.php.net/package/sam/download/0.2.0地址下載它.

D、XMPP協議實現Android推送

Google官方的C2DM服務器底層也是採用XMPP協議進行的封裝。XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息。

androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和服務器端。但也存在一些不足之處:

1) 比如時間過長時,就再也收不到推送的信息了。

2)性能上也不夠穩定。

3)如果將消息從服務器上推送出去,就不再管理了,不管消息是否成功到達客戶端手機上。

如果我們要使用androidpn,則還需要做大量的工作,需要理解XMPP協議、理解Androidpn的實現機制,需要調試內部存在的BUG。

E、使用第三方平臺

目前國內、國外有一些推送平臺可供使用,但是涉及到收費問題、保密問題、服務質量問題、擴展問題等等,又不得不是我們望而卻步


4. 消息推送完美方案

綜合以上論述,在建立Android消息推送方面可謂方案多多,但每一款方案都有其優缺點。但無論如何,還是自己搭建一個推送平臺是上策。因爲你有、他有不如自己有。

舉個例子,在搭建自有推送平臺上建議使用《某某Android消息推送組件》。該組不僅可以拿來即用,並且還可以提供源碼以便擴展,實現自己的特殊需求。

A、推送原理

Android消息推送組件基於XMPP協議實現Android推送。XMPP(可擴展通訊和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息。

Android消息推送組件實現原理見下圖:

圖1-消息推送原理圖

Android消息推送組件由服務器部分和客戶端部分組成。每一部分都由XMPP協議組件和外部接口組件構成。XMPP協議組件負責服務器和Android客戶端間的連接管理、消息通訊,外部接口組件負責接收應用系統、客戶端應用的命令,嚮應用系統發送接收到的通知消息。

Android消息組件提供基於Tomcat的服務器應用和Android開發jar包。其中基於Tomcat的服務器應用直接在Tomcat上部署即可,Android開發jar包引入Android項目即可。

B 集成方式

1)服務器部署

Android消息組件Tomcat的服務器應用直接部署在Tomcat中,端口號任意設定。

2)客戶端jar包引用

在Android項目中建立libs目錄,然後將提供的Android開發jar包複製到該目錄即可。見下圖:

圖2-jar包引入圖

3)Android項目AndroidManifest.xml文件修改

在該文件中增加以下權限:

1. <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

2. 

3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

4. 

5. <uses-permission android:name="android.permission.INTERNET" /> 

6. 

7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

8. 

9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 

10. 

11. <uses-permission android:name="android.permission.VIBRATE" /> 

在該文件中註冊服務:

1.  <service android:enabled="true"

2. 

3.  android:name="com.bjjrs.server.NotificationService"

4. 

5.  android:label="NotificationService"> 

6. 

7.       <intent-filter> 

8. 

9.          <action android:name="com.bjjrs.server.NotificationService" /> 

10. 

11.      </intent-filter> 

12. 

13. </service> 

至此,Android消息組件集成工作完成。

C、接口方式

1)服務器端接口採用基於http協議的訪問方式,採用http協議從服務器中獲取各種信息,實現通知消息的推送。

如使用以下方式和參數就可以實現各種用戶消息的查詢:

http://localhost:8080/user.do?action=getAllUser&isOnline=&userID=&userType=&deptID=&deptName=&realName=

使用如下方式就可以實現各種消息的推送:

http://localhost:8080/notification.do?action=pushNoti&userNames=&title=&content=

2)Android客戶端接口採用廣播機制。

消息接收:當XMPP協議組件接收到推送消息時,將按照一定格式廣播該消息,通知客戶端其他應用接收並處理該消息。

消息發送:客戶端應用需要向服務器或者其他客戶端發送即時消息時,只需按一定格式廣播該消息,XMPP組件就會自動接收該消息併發送到指定的其他客戶端。

D、優勢特點

1)系統集成簡單,無需複雜的設置。

2)Android客戶端應用和Android消息推送組件完全分離,通過接口相互調用,實現模塊應用最優化。

3)客戶端通訊機制採用廣播方式,給客戶端應用帶來極大的靈活性和可擴展性,可以自由處理接收到的推送消息。

4)Android消息推送組件在服務器端具備消息存儲、消息重發、消息路由等功能,在客戶端部分具備斷線重連、、收到確認、閱讀確認、消息發送、命令執行等功能,確保消息能夠推送到客戶端,同時也保證客戶端能夠收到、閱讀消息。

E、 應用範圍

Android消息推送組件可在以下場景中使用:

1)用於消息推送。如:通知下達、應急指揮等。

2)用戶及時消息交互。如在線聊天、工作情況交互等。

3)用於遠程控制。如控制遠程客戶端的狀態、數據上報等


轉載自http://blog.csdn.net/wangkuifeng0118/article/details/7848977#comments

與http://jingyan.baidu.com/article/ff42efa91805bbc19e220231.html


另外收藏一個使用百度雲推送包實現的消息推送聊天實現:http://www.2cto.com/kf/201306/218763.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章