MqttプロトコルPahoプロジェクトに基づいてAndroidメッセージプッシュを実現

6027 ワード

MqttプロトコルPahoプロジェクトに基づいてAndroidメッセージプッシュを実現
Pahoプロジェクトの公式住所:
PahoプロジェクトはMqttプロトコルをカプセル化し,本稿ではPahoプロジェクトの学習と修正によりAndroidプッシュ機能を簡単に実現した.
サービス側の導入
サービス側の選択は、筆者はApollo:公式サイトアドレス:およびMosquittoサーバ:公式サイトアドレスのみをテストしたことがある.
  • の前者はインストール構成が便利で、バックグラウンドで現在接続されているクライアント、パブリッシュ、サブスクリプションのTopic、およびメッセージを直感的に表示できますが、メッセージを送信するためにサービス側を個別に書く必要があります.
  • 後者はCygwinをインストールする必要があり、Apolloサーバに比べてインストールが煩雑であるが、利点の1つはコマンドラインを通じて直接メッセージを公開できることである.

  • いずれも非常に強力なサーバであり,筆者も入門したばかりで多くの機能を探索し続ける必要があるが,本稿ではプレゼンテーション効果のために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のエンコード形式に変換する必要があります