5

Mosquitto Mqtt と paho API を使用して、Android デバイスでプッシュ メッセージを受信して​​います。しかし、ネットワーク接続が変更されるとすぐに、メッセージの受信が停止します。簡単なテスト ケースで問題を再現する手順は次のとおりです。

1) 簡単なアクティビティを作成します。

2) アクティビティの起動時に、paho API を介して mosquitto テスト サーバー (test.mosquitto.org:1883) に接続します。

3) トピックを購読します。

4) トピックにメッセージを発行します。

結果: Mqtt クライアントは、トピックに発行されたすべてのメッセージを受信します。今

5) モバイルのインターネット接続を無効にする (モバイルデータ)

6) トピックにメッセージを発行します。

7) インターネットに再接続します。

結果:クライアントは、インターネット接続が無効になった後に公開されたメッセージを受け取りません。

KeepAliveIntervalは高い値 (30 分) に保たれているため、インターネットに再接続した後、すべてのメッセージを受信する必要があります。

同じユース ケース (同じコード) は、ラップトップでインターネットを無効にしてユース ケースを実行する単純な Java プロジェクト (Android 以外) で機能しています。

Androidデバイスで動作しない理由はありますか??? 何か不足していますか?

ノート:

1) mqtt-client-0.4.1 の使用

2) Android ターゲット API レベル 11

3) テスト中にデバイスをスリープ モードにしない。

4) connectionLost コールバックで呼び出しを取得せず、mqtt コールバックの 4 つのスレッドすべてがテスト ケース全体で実行されています。つまり、mosquitto サーバーへの接続はそのままです。

4

6 に答える 6

1

あなたのサービスで:-

 //Receiver that notifies the Service when the phone gets data connection
  private NetworkConnectionIntentReceiver netConnReceiver;

次のクラスを作成します:-

/*
* Called in response to a change in network connection - after losing a
*  connection to the server, this allows us to wait until we have a usable
*  data connection again
*/
class NetworkConnectionIntentReceiver extends BroadcastReceiver
{
  private static  String TAG ="NetworkConnectionIntentReceiver";
  @Override
  public void onReceive(Context ctx, Intent intent)
  {
    // we protect against the phone switching off while we're doing this
    //  by requesting a wake lock - we request the minimum possible wake
    //  lock - just enough to keep the CPU running until we've finished

    PowerManager pm = (PowerManager) ctx.getSystemService(ctx.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MQTT");
    wl.acquire();

    Connection c = Connections.getInstance(ctx).getConnection(clientHandle);
    final ActionListener callback = new ActionListener(ctx,
                ActionListener.Action.CONNECT, clientHandle,null);
    c.getClient().setCallback(new MqttCallbackHandler(ctx, clientHandle,messenger_where_incoming_messages_tobe_sent));
    c.getClient().connect(c.getConnectionOptions(), null, callback);

    /*    The Above Reconnect Logic can be put up in a Reconnect() function.
     *    OR WRITE Any Other LOGIC TO RECONNECT TO MQTT
     */       

    // we're finished - if the phone is switched off, it's okay for the CPU
    //  to sleep now
    wl.release();
}

次に、OnResume() または onCreate の適切な場所で次のメソッドを呼び出して、BroadcastReceiver を登録します。

synchronized void handleNetworkChange()
{

    // changes to the phone's network - such as bouncing between WiFi
    //  and mobile data networks - can break the MQTT connection
    // the MQTT connectionLost can be a bit slow to notice, so we use
    //  Android's inbuilt notification system to be informed of
    //  network changes - so we can reconnect immediately, without
    //  haing to wait for the MQTT timeout
    if (netConnReceiver == null)
    {
        netConnReceiver = new NetworkConnectionIntentReceiver();
        registerReceiver(netConnReceiver,
                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

    }
}
于 2015-12-11T05:39:13.340 に答える