すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:Paho MQTT Androidクライアントを使用する

最終更新日:Apr 17, 2025

このトピックでは、Paho Android Serviceを使用してデバイスをIoT Platformに接続し、メッセージングを有効にする方法について説明します。

前提条件

プロダクトとデバイスは、IoT Platformコンソールのインスタンスに作成されます。 デバイス証明書とMQTTエンドポイントが取得されます。 デバイス証明書情報には、ProductKey、DeviceName、およびDeviceSecretが含まれます。 詳細については、以下のトピックをご参照ください。

背景情報

Paho Android Serviceは、Java用のPaho MQTTライブラリに基づいて開発されたMQTT (Message Queuing Telemetry Transport) クライアントです。

開発環境の準備

この例では、バージョン3.5.1のAndroid Studioとバージョン3.5.1のGradleが使用されています。

Android Studioをダウンロードするには、公式Android Studio Webサイトにアクセスしてください。 Android開発の詳細については、Android Studioの公式ドキュメントを参照してください。

Paho Androidクライアントをインストールする

  1. Androidプロジェクトを作成します。

    重要

    build.gradleファイルでtargetSdkVersionパラメーターの値が30より大きい場合は、30以下の値に変更します。

  2. Gradleファイルに、Paho Androidクライアントの依存関係を追加します。 この例では、Paho Android Client 1.1.1が使用されています。 次の依存関係を追加する必要があります。

    • build.gradleファイルに、Pahoリポジトリのアドレスを追加します。 この例では、リリースリポジトリが使用されています。

      リポジトリ {
          maven {
              url "https://repo.eclipse.org/content/repositories/paho-releases/"
          }
      }
    • build.gradleファイルに、Paho Androidサービスの依存関係を追加します。 この例では、Paho Android Service 1.1.1が使用されています。 それはpaho.client.mqttv3-1.1.0に基づいています。

      依存関係 {
          実装 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
          実装 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
      } 
  3. アプリをPaho Android Serviceにバインドするには、次の情報をAndroidManifest.xmlファイルに追加します。

    • 次のサービスを宣言します。

      <!-- Mqttサービス -->
      <service android:name="org.eclipse.paho.android.service.MqttService">
      </service> 
    • Paho MQTTサービスに必要な権限を追加します。

      <uses-permission android:name="android.permission.WAKE_LOCK" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

デバイスから IoT Platform への接続

  1. android_sameple_code.zipパッケージをダウンロードし、パッケージを解凍して、Alibaba Cloudが提供するAiotMqttOption.javaファイルを取得します。 このようにして、MQTT接続パラメータを取得できます。

    AiotMqttOption.javaファイルは、AiotMqttOptionクラスを定義します。

    • プロトタイプ

      クラスAiotMqttOption
    • 説明

      このクラスを使用すると、MQTT接続パラメーターusernamepasswordclientidを取得できます。

    • メンバー

      タイプ

      メソッド

      パブリックAiotMqttOption

      getMqttOption(String productKey, String deviceName, String deviceSecret)

      productKeydeviceName、およびdeviceSecretパラメーターの値に基づいて、usernamepassword、およびclientidパラメーターの値を計算します。

      public文字列

      getUsername()

      usernameパラメーターを取得します。

      public文字列

      getPassword()

      passwordパラメーターを取得します。

      public文字列

      getClientid()

      clientidパラメーターを取得します。

  2. AiotMqttOption.javaファイルをAndroidプロジェクトにインポートします。

  3. Androidプロジェクトで、デバイスをIoT Platformに接続できるプログラムファイルを追加します。

    AiotMqttOption.javaファイルでAiotMqttOptionクラスを使用して、IoT PlatformへのMQTT接続を確立するために必要なパラメーターの値を計算するプログラムを記述する必要があります。

    このセクションでは、開発手順とサンプルコードについて説明します。

    • MQTT接続パラメーターclientIdusername、およびpasswordの値を計算します。 MqttConnectOptionsオブジェクトでusernamepasswordパラメーターを設定します。

      最終プライベート文字列PRODUCTKEY = "a11xsrW ****";
      最終的なプライベート文字列DEVICENAME = "paho_android";
      最終的なプライベート文字列DEVICESECRET = "tLMT9QWD36U2SArglGqcHCDK9rK9 ****";
      
      /* MQTT接続パラメーターclientId、ユーザー名、およびパスワードを取得します。  * /
      AiotMqttOption aiotMqttOption = new AiotMqttOption().getMqttOption(PRODUCTKEY、DEVICENAME、DEVICESECRET);
      if (aiotMqttOption == null) {
          Log.e(TAG、"device info error");
      } else {
          clientId = aiotMqttOption.getClientId();
          userName = aiotMqttOption.getUsername();
          passWord = aiotMqttOption.getPassword();
      }
      
      /* MqttConnectOptionsオブジェクトを作成し、ユーザー名とパスワードのパラメーターを設定します。  * /
      MqttConnectOptions mqttConnectOptions=新しいMqttConnectOptions();
      mqttConnectOptions.setUserName(userName);
      mqttConnectOptions.setPassword(passWord.toCharArray()); 
    • クライアントをIoT Platformに接続します。

      MqttAndroidClientオブジェクトを作成し、コールバックを設定します。 mqttConnectOptionsオブジェクトを使用してconnect() メソッドを呼び出し、接続を確立します。

      /* MqttAndroidClientオブジェクトを作成し、コールバックを設定します。  * /
      mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), host, clientId);
      mqttAndroidClient.setCallback(new MqttCallback() {
          @オーバーライド
          public void connectionLost(Throwable cause) {
              Log.i(TAG、"接続が失われた");
          }
      
          @オーバーライド
          public void messageArrived(String topic, MqttMessage message) throws Exception {
              Log.i(TAG、"topic: " + topic + "、msg: " + new String(message.getPayload()));
          }
      
          @オーバーライド
          public void deliveryComplete(IMqttDeliveryToken token) {
              Log.i(TAG、"msg delivered");
          }
      });
      
      /* MQTT経由でIoT Platformへの接続を確立します。  * /
      try {
          mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
              @オーバーライド
              public void onSuccess(IMqttToken asyncActionToken) {
                  Log.i(TAG、"connect success");
      
                  subscribeTopic(SUB_TOPIC);
              }
      
              @オーバーライド
              public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                  Log.i(TAG、"connect failed");
              }
          });
      
      } catch (MqttException e) {
          e.printStackTrace();
      } 
    • メッセージを公開します。 publishMessage() メソッドを定義して、指定したペイロードを持つメッセージを /${prodcutKey}/${deviceName}/user/updateトピックにパブリッシュします。

      public void publishMessage(String payload) {
          try {
              if (mqttAndroidClient.isConnected() == false) {
                  mqttAndroidClient.connect();
              }
      
              MqttMessage message=新しいMqttMessage();
              message.setPayload(payload.getBytes());
              message.setQos(0);
              mqttAndroidClient.publish(PUB_TOPIC, message,null, new IMqttActionListener() {
                  @オーバーライド
                  public void onSuccess(IMqttToken asyncActionToken) {
                      Log.i(TAG、"publish success!");
                  }
      
                  @オーバーライド
                  public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                      Log.i(TAG、"publish failed!");
                  }
              });
          } catch (MqttException e) {
              Log.e(TAG, e.toString());
              e.printStackTrace();
          }
      }

      トピックの詳細については、「トピック」をご参照ください。

    • subscribeTopic() メソッドを定義して、指定したトピックをサブスクライブし、IoT Platformからメッセージを取得します。

      public void subscribeTopic (文字列トピック) {
          try {
              mqttAndroidClient.subscribe(topic, 0, null, new IMqttActionListener() {
                  @オーバーライド
                  public void onSuccess(IMqttToken asyncActionToken) {
                      Log.i(TAG、「サブスクライブ成功」);
                  }
      
                  @オーバーライド
                  public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                      Log.i(TAG、"subscribed failed");
                  }
              });
      
          } catch (MqttException e) {
              e.printStackTrace();
          }
      }

    デバイス、サーバー、およびIoT Platformの通信方法については、「デバイス、IoT platform、およびサーバー間の通信の概要」をご参照ください。

  4. プロジェクトをコンパイルします。

サンプルコード

次のサンプルコードは、IoT Platformに接続する方法を示しています。

  1. デモパッケージをダウンロードして解凍します。

  2. aiot-android-demoをAndroid Studioにインポートします。

  3. app/src/main/java/com.linkkit.aiot_android_demoディレクトリで、デバイス情報をMainActivityファイルのデバイス情報に置き換えます。

    • PRODUCTKEYDEVICENAME、およびDEVICESECRETをデバイス証明書情報に置き換えます。

    • 置き換えます。最終的なString host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443"; インスタンスのエンドポイントでコードをiot-as-mqtt.cn-shanghai.aliyuncs.com:443します。

      • Enterprise Editionインスタンスまたは新しいバージョンのパブリックインスタンスを使用する場合は、final String host = "tcp://" + "${MQTT endpoint of your instance}" を指定します。

        MQTTエンドポイントを取得するには、次の手順を実行します。IoT Platformコンソールにログインします。 [概要] ページで、管理するインスタンスのカードをクリックします。 [インスタンスの詳細] ページの右上隅にある [開発設定の表示] をクリックします。 詳細は、「インスタンスのエンドポイントの表示」をご参照ください。

      • 旧バージョンのパブリックインスタンスを使用する場合は、次の手順を実行します。

        コード内のcn-shanghaiを、デバイスが存在するリージョンのIDに置き換えます。 リージョンIDの詳細については、「サポートされているリージョン」をご参照ください。

  4. デモをビルドして実行します。

    デモの実行後、Logcatでローカルログを表示できます。

    2019-12-04 19:44:01.824 5952-5987/com.linkkit.aiot_android_demo W/OpenGLRenderer: EGL_SWAP_BEHAVIOR_PRESERVEDで設定を選択できませんでした。2019-12-04 19:44:01.829 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglCreateContext: 0xec073240: maj 3 min 0 rcv 3
    2019-12-04 19:44:01.830 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglMakeCurrent: 0xec073240: ver 3 0 (tinfo 0xec09b470)
    2019-12-04 19:44:01.852 5952-5987/com.linkkit.aiot_android_demo W/Gralloc3: mapper 3.xはサポートされていません
    2019-12-04 19:44:01.854 5952-5987/com.linkkit.aiot_android_demo D/HostConnection: createUnique: call
    ...
    ...
    2019-12-04 19:44:01.860 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: 割り当て: サイズ0x1000のブロックを要求する
    2019-12-04 19:44:01.861 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ff706000 size 0x2000
    2019-12-04 19:44:01.897 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglMakeCurrent: 0xec073240: ver 3 0 (tinfo 0xec09b470)
    2019-12-04 19:44:02.245 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: alarmreceiverをMqttServiceMqttService.pingSender.a11xsrW ****.paho_android | timestamp=1575459841629、_v=sdk-android-1.0.0、securemade=2、signmethod=hmacsha256 |
    2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: 1575459902256で次のアラームをスケジュールする
    2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: setExactAndAllowWhileIdleを使用したアラーム回路図、次: 60000
    2019-12-04 19:44:02.272 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: connect success
    2019-12-04 19:44:02.301 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: サブスクライブ成功 

    IoT Platformコンソールで、デバイスのステータスとログを表示できます。

    • [デバイス] > [デバイス] を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。

    • [メンテナンス] > [デバイスログ] を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。

エラーコード

デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。