Android 伺服器推送技術

來源:互聯網
上載者:User

在開發Android和iPhone應用程式時,我們往往需要從伺服器不定的向手機用戶端即時推送各種通知訊息,iPhone上已經有了比較簡單的和完美的推播通知解決方案,可是Android平台上實現起來卻相對比較麻煩,最近利用幾天的時間對Android的推播通知服務進行初步的研究。

在Android手機平台上,Google提供了C2DM(Cloudto Device Messaging)服務,起初我就是準備採用這個服務來實現自己手機上的推送功能。

Android Cloud to Device Messaging (C2DM)是一個用來協助開發人員從伺服器向Android應用程式發送資料的服務。該服務提供了一個簡單的、輕量級的機制,允許伺服器可以通知行動裝置 App程式直接與伺服器進行通訊,以便於從伺服器擷取應用程式更新和使用者資料。C2DM服務負責處理諸如訊息排隊等事務並向運行於目標裝置上的應用程式分發這些訊息。

但是經過一番研究發現,這個服務存在很大的問題:

1)C2DM內建於Android的2.2系統上,無法相容老的1.6到2.1系統;

2)C2DM需要依賴於Google官方提供的C2DM伺服器,由於國內的網路環境,這個服務經常不可用,如果想要很好的使用,我們的App Server必須也在國外,這個恐怕不是每個開發人員都能夠實現的;

有了上述兩個使用上的制約,導致我最終放棄了這個方案,不過我想利用另外一篇文章來詳細的介紹C2DM的架構以及用戶端和App Server的相應設定方法,可以作為學習與參考之用。

即然C2DM無法滿足我們的要求,那麼我們就需要自己來實現Android手機用戶端與App Server之間的通訊協定,保證在App Server想向指定的Android裝置發送訊息時,Android裝置能夠及時的收到。下面我來介紹幾種常見的方案:

1)輪詢:應用程式應當階段性的與伺服器進行串連並查詢是否有新的訊息到達,你必須自己實現與伺服器之間的通訊,例如訊息排隊等。而且你還要考慮輪詢的頻率,如果太慢可能導致某些訊息的延遲,如果太快,則會大量消耗網路頻寬和電池。

2)SMS:在Android平台上,你可以通過攔截SMS訊息並且解析訊息內容來瞭解伺服器的意圖。這是一個不錯的想法,我就見過採用這個方案的應用程式。這個方案的好處是,可以實現完全的即時操作。但是問題是這個方案的成本相對比較高,你很難找到免費的短訊息發送網關,關於這個方案的實現,可以參考如下連結:https://labs.ericsson.com/apis/mobile-java-push/。

3)持久串連:這個方案可以解決由輪詢帶來的效能問題,但是還是會消耗手機的電池。Apple的推送服務之所以工作的很好,是因為每一台手機僅僅保持一個與伺服器之間的串連,事實上C2DM也是這麼工作的。不過這個方案也存在不足,就是我們很難在手機上實現一個可靠的服務。Android作業系統允許在低記憶體情況下殺死系統服務,所以你的通知服務很可能被作業系統Kill掉了。

前兩個方案存在明顯的不足,第三個方案也有不足,不過我們可以通過良好的設計來彌補,以便於讓該方案可以有效工作。畢竟,我們要知道GMail,GTalk以及GoogleVoice都可以實現即時更新的。

 

Ø  採用MQTT協議實現Android推送

MQTT是一個輕量級的訊息發布/訂閱協議,它是實現基於手機用戶端的訊息推送伺服器的理想解決方案。

我們可以從這裡下載該項目的執行個體代碼,並且可以找到一個採用PHP書寫的伺服器端實現。

架構如下所示:

wmqtt.jar 是IBM提供的MQTT協議的實現。你可以從如下網站下載它。你可以將該jar包加入你自己的Android應用程式中。

Really Small Message Broker (RSMB) ,他是一個簡單的MQTT代理,同樣由IBM提供。預設開啟1883連接埠,應用程式當中,它負責接收來自伺服器的訊息並將其轉寄給指定的行動裝置。

SAM是一個針對MQTT寫的PHP庫。你可以從這個下載它.

send_mqtt.php是一個通過POST接收訊息並且通過SAM將訊息發送給RSMB的PHP指令碼。

執行個體代碼:

可以從GitHub上下載執行個體應用。運行該應用以後,通過手機瀏覽器訪問http://tokudu.com/demo/android-push/,在第一個輸入框輸入裝置ID,在第二個輸入框輸入想要發送的訊息內容,按下“Send Push Message”按鈕,你就應該可以看到手機上收到了通知了。你也可以從這個GitHub地址上下載android-push原始碼,它包含了send_mqtt.php指令碼。

 

Ø  採用XMPP協議實現Android推送

這是我在項目中採用的方案。事實上Google官方的C2DM伺服器底層也是採用XMPP協議進行的封裝。

XMPP(可擴充通訊和表示協議)是基於可延伸標記語言 (XML)(XML)的協議,它用於立即訊息(IM)以及線上探測。這個協議可能最終允許網際網路使用者向網際網路上的其他任何人傳送立即訊息。

androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的用戶端和伺服器端。經過原始碼研究我發現,該伺服器端基本是在另外一個開源工程openfire基礎上修改實現的,不過比較鬱悶的是androidpn的文檔是由韓語寫的,所以整個研究過程基本都是讀源碼。它的實現如下:

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

androidpn伺服器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring架構,這一點與openfire是不同的。Androidpn伺服器包含兩個部分,一個是偵聽在5222連接埠上的XMPP服務,負責與用戶端的XMPPConnection類進行通訊,作用是使用者註冊和身份認證,並發送推播通知訊息。另外一部分是Web伺服器,採用一個輕量級的HTTP伺服器,負責接收使用者的Web請求。伺服器架構如下:

最上層包含四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負責管理用戶端與伺服器之間的會話,Auth Manager負責用戶端使用者認證管理,Presence Manager負責管理用戶端使用者的登入狀態,NotificationManager負責實現伺服器向用戶端推送訊息功能。

伺服器端介面如下,分別對應了上述的幾個功能模組:

      發送以後,我們可以在手機端看到接收的訊息:

      這個解決方案的最大優勢就是簡單,我們不需要象C2DM那樣依賴作業系統版本,也不會擔心某一天Google伺服器不可用。利用XMPP協議我們還可以進一步的對協議進行擴充,實現更為完善的功能。

採用這個方案,我們目前只能發送文字訊息,不過對於推送來說一般足夠了,因為我們不能指望通過推送得到所有的資料,一般情況下,利用推送只是告訴手機端伺服器發生了某些改變,當用戶端收到通知以後,應該主動到伺服器擷取最新的資料,這樣才是推送服務的完整實現。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.