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

IoT Platform:Paho MQTT を使用した Android からの IoT Platform への接続

最終更新日:Jun 04, 2026

Paho Android Service を使用して Android アプリケーションを IoT Platform に接続し、メッセージを送受信します。

前提条件

IoT Platform コンソール で、対応するインスタンスのプロダクトとデバイスを作成し、MQTT アクセスドメイン名とデバイス証明書情報 (ProductKey、DeviceName、DeviceSecret) を取得します。 詳細については、以下をご参照ください:

概要

Paho Android Service は、Java 向けの Eclipse Paho MQTT ライブラリ上に構築された MQTT クライアントサービスです。

開発環境

この例では、Gradle 3.5.1 を搭載した Android Studio 3.5.1 を使用します。

Android Studio は、Android Studio 公式ウェブサイトからダウンロードしてください。

Paho Android クライアントのインストール

  1. 新しい Android プロジェクトを作成します。
    重要 アプリケーションの build.gradle ファイル内の targetSdkVersion は 30 以下である必要があります。 それより高い場合は、変更する必要があります。
  2. Paho Android Client 1.1.1 の依存関係を Gradle ファイルに追加します:
    • プロジェクトの build.gradle ファイルに、Paho リリースリポジトリの URL を追加します。
      repositories {
          maven {
              url "https://repo.eclipse.org/content/repositories/paho-releases/"
          }
      }
    • アプリケーションの build.gradle ファイルに、Paho Android Service (1.1.1) と MQTT クライアント (1.1.0) の依存関係を追加します。
      dependencies {
          implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
          implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
      }
  3. 次のエントリを AndroidManifest.xml に追加します:
    • MQTT サービスを宣言します:
      <!-- Mqtt Service -->
      <service android:name="org.eclipse.paho.android.service.MqttService">
      </service>
    • 必要な権限を追加します。
      <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_sample_code.zip をダウンロードし、MQTT 接続パラメーターを計算する AiotMqttOption.java ファイルを展開します。

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

    • プロトタイプ:
      class AiotMqttOption
    • 特徴

      IoT Platform への MQTT 接続用の usernamepasswordclientid パラメーターを計算します。

    • メンバー:
      型定義 メソッドの説明
      public AiotMqttOption getMqttOption(String productKey, String deviceName, String deviceSecret)

      デバイスの productKeydeviceName、および deviceSecret から MQTT の ユーザー名パスワード、および クライアント ID を計算します。

      public String getUsername()

      MQTT の username を取得します。

      public String getPassword()

      MQTT の password を取得します。

      public String getClientid()

      MQTT の clientid を取得します。

  2. AiotMqttOption.java を Android プロジェクトにインポートします。
  3. デバイスを IoT Platform に接続するためのコードを追加します。

    AiotMqttOption.javaAiotMqttOption クラスを呼び出して MQTT 接続パラメーターを計算し、IoT Platform に接続します。

    開発手順とサンプルコード:

    • MQTT 接続パラメーター clientIdusernamepassword を計算し、MqttConnectOptions オブジェクトに usernamepassword を設定します。
      final private String PRODUCTKEY = "a11xsrW****";
      final private String DEVICENAME = "paho_android";
      final private String DEVICESECRET = "tLMT9QWD36U2SArglGqcHCDK9rK9****";
      
      /* MQTT 接続情報 (clientId、username、password) を取得します。 */
      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 オブジェクトを作成し、username と password を設定します。 */
      MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
      mqttConnectOptions.setUserName(userName);
      mqttConnectOptions.setPassword(passWord.toCharArray());
    • IoT Platform に接続します。

      MqttAndroidClient オブジェクトを作成し、コールバックを設定して、MqttConnectOptionsconnect を呼び出します。

      /* MqttAndroidClient オブジェクトを作成し、コールバックを設定します。 */
      mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), host, clientId);
      mqttAndroidClient.setCallback(new MqttCallback() {
          @Override
          public void connectionLost(Throwable cause) {
              Log.i(TAG, "connection lost");
          }
      
          @Override
          public void messageArrived(String topic, MqttMessage message) throws Exception {
              Log.i(TAG, "topic: " + topic + ", msg: " + new String(message.getPayload()));
          }
      
          @Override
          public void deliveryComplete(IMqttDeliveryToken token) {
              Log.i(TAG, "msg delivered");
          }
      });
      
      /* MQTT 接続を確立します。 */
      try {
          mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() {
              @Override
              public void onSuccess(IMqttToken asyncActionToken) {
                  Log.i(TAG, "connect succeed");
      
                  subscribeTopic(SUB_TOPIC);
              }
      
              @Override
              public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                  Log.i(TAG, "connect failed");
              }
          });
      
      } catch (MqttException e) {
          e.printStackTrace();
      }
    • メッセージを送信します。 publish を呼び出して、ペイロードを /${productKey}/${deviceName}/user/update Topic に送信します。
      public void publishMessage(String payload) {
          try {
              if (mqttAndroidClient.isConnected() == false) {
                  mqttAndroidClient.connect();
              }
      
              MqttMessage message = new MqttMessage();
              message.setPayload(payload.getBytes());
              message.setQos(0);
              mqttAndroidClient.publish(PUB_TOPIC, message,null, new IMqttActionListener() {
                  @Override
                  public void onSuccess(IMqttToken asyncActionToken) {
                      Log.i(TAG, "publish succeed!");
                  }
      
                  @Override
                  public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                      Log.i(TAG, "publish failed!");
                  }
              });
          } catch (MqttException e) {
              Log.e(TAG, e.toString());
              e.printStackTrace();
          }
      }

      Topic とは

    • subscribe を呼び出して Topic をサブスクライブし、IoT Platform からメッセージを受信します。
      public void subscribeTopic(String topic) {
          try {
              mqttAndroidClient.subscribe(topic, 0, null, new IMqttActionListener() {
                  @Override
                  public void onSuccess(IMqttToken asyncActionToken) {
                      Log.i(TAG, "subscribed succeed");
                  }
      
                  @Override
                  public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                      Log.i(TAG, "subscribed failed");
                  }
              });
      
          } catch (MqttException e) {
              e.printStackTrace();
          }
      }

    デバイスとクラウド間の通信パターンについては、「デバイス、IoT プラットフォーム、サーバー間の通信概要」をご参照ください。

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

デモの実行

デモアプリを実行して、IoT Platform への接続を検証します。

  1. デモコードパッケージをダウンロードして展開します。
  2. aiot-android-demo を Android Studio にインポートします。
  3. app/src/main/java/com.linkkit.aiot_android_demo 内の MainActivity ファイルで、プレースホルダーのデバイス情報を実際のデバイス認証情報に置き換えます。
    • PRODUCTKEYDEVICENAMEDEVICESECRET を実際のデバイス証明書の値に設定します。
    • ホストをエンドポイントに設定します: final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";
      • 新しいパブリックインスタンスとエンタープライズインスタンスの場合、ホストをインスタンスのエンドポイントに設定します: final String host = "tcp://" + "{your-instance-endpoint}"

        IoT Platform コンソールにログインします。 [インスタンス概要] ページで、対象のインスタンスをクリックします。 [インスタンス詳細] ページで、[開発設定の表示] をクリックしてエンドポイントを取得します。 詳細については、「インスタンスエンドポイントの表示と設定」をご参照ください。

      • レガシーパブリックインスタンスの場合:

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

  4. アプリケーションをビルドして実行します。
    正常に実行された後、Logcat でログを確認します。
    2019-12-04 19:44:01.824 5952-5987/com.linkkit.aiot_android_demo W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
    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 is not supported
    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: allocate: Ask for block of size 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: Register alarmreceiver to MqttServiceMqttService.pingSender.a11xsrW****.paho_android|timestamp=1575459841629,_v=sdk-android-1.0.0,securemode=2,signmethod=hmacsha256|
    2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Schedule next alarm at 1575459902256
    2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Alarm scheule using setExactAndAllowWhileIdle, next: 60000
    2019-12-04 19:44:02.272 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: connect succeed
    2019-12-04 19:44:02.301 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: subscribed succeed

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

    • 左側のナビゲーションウィンドウで、[デバイス管理] > [デバイス] を選択します。 デバイスのステータスが [オンライン] になっていることが確認できます。

    • [監視 & O&M] > [Log Service] の順に選択すると、[IoT プラットフォームログ][オンプレミスデバイスログ] を表示できます。詳細については、「IoT プラットフォームログ」および「オンプレミスデバイスログ」をご参照ください。

エラーコード

デバイスが MQTT 経由で IoT Platform への接続に失敗した場合、エラーコードを使用して問題をトラブルシューティングします。 サーバー側のエラーコードの詳細については、「トラブルシューティング」をご参照ください。