MqttプロトコルPahoプロジェクトに基づいてAndroidメッセージプッシュを実現
6027 ワード
MqttプロトコルPahoプロジェクトに基づいてAndroidメッセージプッシュを実現
Pahoプロジェクトの公式住所:
PahoプロジェクトはMqttプロトコルをカプセル化し,本稿ではPahoプロジェクトの学習と修正によりAndroidプッシュ機能を簡単に実現した.
サービス側の導入
サービス側の選択は、筆者はApollo:公式サイトアドレス:およびMosquittoサーバ:公式サイトアドレスのみをテストしたことがある.の前者はインストール構成が便利で、バックグラウンドで現在接続されているクライアント、パブリッシュ、サブスクリプションのTopic、およびメッセージを直感的に表示できますが、メッセージを送信するためにサービス側を個別に書く必要があります. 後者はCygwinをインストールする必要があり、Apolloサーバに比べてインストールが煩雑であるが、利点の1つはコマンドラインを通じて直接メッセージを公開できることである.
いずれも非常に強力なサーバであり,筆者も入門したばかりで多くの機能を探索し続ける必要があるが,本稿ではプレゼンテーション効果のためにMosquittoサーバを選択してプレゼンテーションを行う.Mosquittoサーバの導入については、前の記事を参考にゲートを転送してください.
クライアントの実装
クライアントのインプリメンテーションはPahoプロジェクトに基づいており、主に
重要な点は、ローカルでテストを行う場合、その中のserverURIはlocalhostまたは127.0.0.1を使用しないで、自分のホストの実際のiアドレスに変更します.
いくつかの理由で、一部のキーコードのみを貼り付けて分析します.
優先的には、MqttClientおよびMqttConnectionOptionsを初期化する必要があります.
MqttClientを初期化します.hostはserverUriです.ここではローカルでテストしますが、localhostではなく実際のipアドレスを使用する必要があることに注意してください.コールバックインタフェースが別途設けられており,サブスクリプションのメッセージが受信されるとHandlerによって送信され処理される.
接続が成功した後、
プレゼンテーションGif:
中国語を直接発表したり、
Pahoプロジェクトの公式住所:
PahoプロジェクトはMqttプロトコルをカプセル化し,本稿ではPahoプロジェクトの学習と修正によりAndroidプッシュ機能を簡単に実現した.
サービス側の導入
サービス側の選択は、筆者はApollo:公式サイトアドレス:およびMosquittoサーバ:公式サイトアドレスのみをテストしたことがある.
いずれも非常に強力なサーバであり,筆者も入門したばかりで多くの機能を探索し続ける必要があるが,本稿ではプレゼンテーション効果のためにMosquittoサーバを選択してプレゼンテーションを行う.Mosquittoサーバの導入については、前の記事を参考にゲートを転送してください.
クライアントの実装
クライアントのインプリメンテーションはPahoプロジェクトに基づいており、主に
MqttClient
クラスを使用してサービス側との接続およびメッセージのサブスクリプションを実現する.重要な点は、ローカルでテストを行う場合、その中のserverURIはlocalhostまたは127.0.0.1を使用しないで、自分のホストの実際のiアドレスに変更します.
いくつかの理由で、一部のキーコードのみを貼り付けて分析します.
優先的には、MqttClientおよびMqttConnectionOptionsを初期化する必要があります.
MqttConnectOptions
を初期化し、ここではMosquittoサーバが設定したユーザ名とパスワードを設定し、接続タイムアウト時間とハートビートパケット送信間隔時間を設定する必要があり、これらは自分のニーズに応じて構成すればよい.private void initMqttConnectionOptions() {
conOpt = new MqttConnectOptions();
conOpt.setCleanSession(true);
conOpt.setUserName(userName);
conOpt.setPassword(passWord.toCharArray());
conOpt.setConnectionTimeout(CONNECTION_TIMEOUT);
conOpt.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);
}
MqttClientを初期化します.hostはserverUriです.ここではローカルでテストしますが、localhostではなく実際のipアドレスを使用する必要があることに注意してください.コールバックインタフェースが別途設けられており,サブスクリプションのメッセージが受信されるとHandlerによって送信され処理される.
private void initMqttClient() {
// TODO Auto-generated method stub
initMqttConnectionOptions();
try {
client = new MqttClient(host, "LHY", null);
client.setCallback(mCallBack);
//
connect();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private MqttCallback mCallBack = new MqttCallback() {
@Override
public void messageArrived(String topic, MqttMessage message)
throws Exception {
// TODO Auto-generated method stub
if (message != null) {
Log.d(TAG, "messageArrived, topic: " + topic + "; message: "
+ new String(message.getPayload()));
Message msg = Message.obtain();
Map map = new HashMap();
map.put("topic", topic);
map.put("mqttMsg", message);
msg.what = HandlerType.MESSAGEARRIVED.getType();
msg.obj = map;
handler.sendMessage(msg);
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// TODO Auto-generated method stub
if (token != null) {
try {
Log.d(TAG, "deliveryComplete: "
+ new String(token.getMessage().getPayload()));
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void connectionLost(Throwable cause) {
// TODO Auto-generated method stub
Log.d(TAG, "connectionLost");
//
}
};
接続が成功した後、
client.subscribe()
方法でトピックを購読し、内部は最終的にsocketを通じてサービス側のメッセージとのインタラクションを完了し、このときMosquittoサーバを通じて指定したTopicのメッセージを送信すると、クライアントは受信することができる. Log.d(TAG, getString(R.string.connect_success));
try {
client.subscribe(mqttTopic, QOS);
} catch (Exception e) {
e.printStackTrace();
}
プレゼンテーションGif:
中国語を直接発表したり、
utf-8
でエンコードしたりすると、クライアントで受信したメッセージが文字化けしてしまうため、GBK
のエンコード形式に変換する必要があります