1

私は現在、いくつかの非常に厳しいニーズを持つアプリを開発中です。

プロジェクト

サーバーと通信できるアプリケーションが必要です。通知を表示したり、アクティビティを開始したりできる小さなメッセージをアプリに送信する必要があります。

要求

クライアントは、電話が常に「接続」されていることを確認する必要があります。
クライアントは、アプリがサーバーに接続されなくなった (または接続できなくなった) ことをアプリがユーザーに通知できることを期待しています。

クライアントは個々のデバイスにメッセージを送信できる必要が
ある クライアントが接続されたデバイスと個々のデバイスにメッセージをブロードキャストする必要がある場合。

私の考え(または問題)

現在、アプリは 1 分に 1 回、http 要求でサーバーをポーリングしています。アプリがサーバーに接続できない場合、ユーザーは通知を受け取ります。ポーリングは、どのデバイスが呼び出しを行っているかを判断し、そのデバイスにメッセージがあるかどうかを伝えることができます。

しかし...

IMO これはひどい設計です。過剰なトラフィックを大量に生成し、おそらく必要のないリソースを使用し、接続に関する多くの問題を引き起こします (どの方法を使用しても問題を解決できるかどうかはわかりません)。使用済み)。

私のプロジェクトに適したソリューションを選択するには、あなたの経験が必要です.

C2DM を検討していますが、これで私のニーズが満たされるかどうかわかりません。私の唯一の本当の解決策はポーリングですか?私が考えていない 3 番目のオプションはありますか?

4

2 に答える 2

4

Parse.comという新しいサービスを偶然見つけました。このサービスは、バックエンドを使用して Android に簡単にプッシュ実装する機能を提供しているようです。商用ですが、無料プランもあります。

独自の実装を行いたい場合は、低電力デバイス用に設計された MQTT の使用に関する記事がたくさんあるようです。しかし、これのすぐに使える実装はまだ見たことがありません。

于 2011-11-03T22:42:34.857 に答える
1

私が最もよく知っているのは MQTT ですが、MQTT は良い解決策だと思います。免責事項 - 私はオープン ソース MQTT ブローカーを作成します。あなたは次のようにあなたが望むと思うものを達成することができます:

MQTT ブローカーをどこかで実行します。電話のサービスはブローカーに接続し、一意のトピック (device/23412364 など) にサブスクライブします。ここで、23412364 はデバイスごとの一意の ID であり、以下では <phone id> と呼ばれます。クライアントが特定の電話にメッセージを送信する場合、メッセージは device/<phone id> に送信されます。メッセージをすべての電話に送信したい場合は、電話を device/all にサブスクライブすることもできます。

サブスクリプションとメッセージのサービス品質を 1 または 2 にし、クライアントの「クリーン セッション」オプションを false に設定すると、何らかの理由で電話が切断された場合に、メッセージがブローカーのキューに入れられます。QoS=1 は「少なくとも 1 回」を意味し、QoS=2 は「正確に 1 回」を意味します。電話が再接続すると、これらのメッセージが配信されます。

電話が接続された直後に、固定トピック (たとえば、「登録」のトピック) に「register <phone id>」などのメッセージを送信することもできます。非常に便利な MQTT の機能は、「遺言書」です。クライアントを接続するとき、クライアントが予期せず切断された場合 (つまり、切断することをブローカーに通知せずに) に備えて、Will メッセージとそれが配信されるトピックを指定するオプションがあります。そのため、意志メッセージを「unregister <phone id>」に設定し、上記と同じ固定トピック (この例では「登録」) に配信することができます。次に、サーバー側で別の MQTT クライアントを「登録」にサブスクライブすることができます。電話が接続されると、「register <phone id>」メッセージが送信されます。切断されると、ブローカーは「unregister <phone id>」を送信します。したがって、MQTT クライアントは、接続されているクライアントをサーバー側で追跡できます。

電話側では、通常のネットワーク コードを介して TCP 接続がダウンした場合に通知を受け取ることができます。

関連リンク:

于 2011-11-05T09:44:27.303 に答える