2011-11-03 41 views
1

我目前正在開發一個應用程序,其中有一些非常需要。需要Android設備需要連接到服務器 - C2DM,輪詢或第三方?

項目

一種能夠與服務器進行通信的應用程序。 必須將小消息發送到可顯示通知或開始活動的應用程序。

需求

客戶的需求,以確保手機在任何時候都「已連接」。
客戶端希望應用程序可以知道它何時不再連接(或能夠連接)到它告訴用戶的服務器。

客戶端需要能夠將消息發送到各個設備
如果客戶需要廣播消息到所連接的設備和個人設備。

我thougts(或問題)

目前,該應用程序是輪詢HTTP請求每分鐘一次的服務器 - 如果應用程序無法連接到用戶得到通知的服務器。輪詢能夠告訴哪個設備正在呼叫並告訴它是否有消息。

但是...

IMO這是一個可怕的設計 - 它會產生大量過剩的流量,使用這可能是沒有必要的資源,它提供了很多的問題與連接(我」我不確定無論使用哪種方法,我都會過去)。

我需要你的經驗爲我的項目選擇正確的解決方案。

我一直在想C2DM,但我不確定這可以覆蓋我的需求嗎? 正在輪詢我唯一真正的解決方案嗎? 有沒有第三種選擇我沒有想過?

回答

1

我認爲MQTT是一個很好的解決方案,儘管這是我最熟悉的。免責聲明 - 我撰寫了一個開源MQTT經紀人。您可以實現我想要的想法:

讓MQTT代理運行在某個地方。手機上的服務連接到經紀人並訂閱獨特的主題,例如,設備/ 23412364,其中23412364是每個設備唯一的ID,並且在下面被稱爲<電話ID >。當您的客戶想要將消息發送至特定電話時,該消息將發送至設備/ <電話號碼>。如果你想讓消息去所有的電話,那麼電話也可以訂閱設備/全部例如。

如果您使訂閱和郵件的服務質量爲1或2,並將客戶端的「清理會話」選項設置爲false,那麼如果電話因任何原因斷開連接,郵件將在代理上排隊等候。 QoS = 1意味着「至少一次」,QoS = 2意味着「恰好一次」。當電話重新連接時,這些消息將被傳送。

您也可以讓電話在連接後立即發送如「註冊<電話號碼>」的消息給一個固定主題(例如「註冊」主題)。 MQTT的一個特性非常有用,就是「最後的遺囑和遺囑」。連接客戶端時,如果客戶端意外斷開連接(即不告知代理將斷開連接),您可以選擇指定Will消息和應該交付的主題。因此,您可以將意願消息設置爲「取消註冊<電話號碼>」並將其發送到與上述相同的固定主題(本例中的「註冊」)。然後,您可以在訂購了「註冊」的服務器端安裝另一個MQTT客戶端。當電話連接時,它發送一個「註冊<電話號碼>」消息,當它斷開連接時,經紀人發送「註銷<電話號碼>」。因此,MQTT客戶端可以跟蹤服務器端連接的客戶端。

在事情的電話端,如果TCP連接通過正常的網絡代碼關閉,您可以得到通知。

一些相關鏈接:

+0

感謝您發佈了一篇關於MQTT的更多信息的優秀文章。我接受了您的答案,詳細描述使我能夠隨着自己的發展而前進。 – Repox

4

我偶然發現了一個新的服務,稱爲Parse.com他們似乎提供易於推實施採用Android的後端功能。這是商業的,但他們也有一個免費的計劃。

如果你想做自己的實現,似乎有很多關於使用專爲低功耗設備設計的MQTT的文章。但是我還沒有看到任何現成的實現。