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 クライアントのインストール
- 新しい Android プロジェクトを作成します。
重要 アプリケーションの build.gradle ファイル内の targetSdkVersion は 30 以下である必要があります。 それより高い場合は、変更する必要があります。
- 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' }
- プロジェクトの build.gradle ファイルに、Paho リリースリポジトリの URL を追加します。
- 次のエントリを 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" />
- MQTT サービスを宣言します:
IoT Platform への接続
- android_sample_code.zip をダウンロードし、MQTT 接続パラメーターを計算する AiotMqttOption.java ファイルを展開します。
AiotMqttOption.java ファイルは AiotMqttOption クラスを定義します:
- プロトタイプ:
class AiotMqttOption 特徴
IoT Platform への MQTT 接続用の username、password、clientid パラメーターを計算します。
- メンバー:
型定義 メソッドの説明 public AiotMqttOption getMqttOption(String productKey, String deviceName, String deviceSecret)デバイスの productKey、deviceName、および deviceSecret から MQTT の ユーザー名、パスワード、および クライアント ID を計算します。
public String getUsername()MQTT の username を取得します。
public String getPassword()MQTT の password を取得します。
public String getClientid()MQTT の clientid を取得します。
- プロトタイプ:
- AiotMqttOption.java を Android プロジェクトにインポートします。
- デバイスを IoT Platform に接続するためのコードを追加します。
AiotMqttOption.java の AiotMqttOption クラスを呼び出して MQTT 接続パラメーターを計算し、IoT Platform に接続します。
開発手順とサンプルコード:
- MQTT 接続パラメーター clientId、username、password を計算し、MqttConnectOptions オブジェクトに username と password を設定します。
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 オブジェクトを作成し、コールバックを設定して、MqttConnectOptions で connect を呼び出します。
/* 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/updateTopic に送信します。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(); } } - 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 プラットフォーム、サーバー間の通信概要」をご参照ください。
- MQTT 接続パラメーター clientId、username、password を計算し、MqttConnectOptions オブジェクトに username と password を設定します。
- プロジェクトをコンパイルします。
デモの実行
デモアプリを実行して、IoT Platform への接続を検証します。
- デモコードパッケージをダウンロードして展開します。
- aiot-android-demo を Android Studio にインポートします。
- app/src/main/java/com.linkkit.aiot_android_demo 内の MainActivity ファイルで、プレースホルダーのデバイス情報を実際のデバイス認証情報に置き換えます。
- PRODUCTKEY、DEVICENAME、DEVICESECRET を実際のデバイス証明書の値に設定します。
- ホストをエンドポイントに設定します:
final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";- 新しいパブリックインスタンスとエンタープライズインスタンスの場合、ホストをインスタンスのエンドポイントに設定します:
final String host = "tcp://" + "{your-instance-endpoint}"。IoT Platform コンソールにログインします。 [インスタンス概要] ページで、対象のインスタンスをクリックします。 [インスタンス詳細] ページで、[開発設定の表示] をクリックしてエンドポイントを取得します。 詳細については、「インスタンスエンドポイントの表示と設定」をご参照ください。
- レガシーパブリックインスタンスの場合:
リージョンコード (cn-shanghai) を、デバイスが所在するリージョンに置き換えます。 詳細については、「サポートされているリージョン」をご参照ください。
- 新しいパブリックインスタンスとエンタープライズインスタンスの場合、ホストをインスタンスのエンドポイントに設定します:
- アプリケーションをビルドして実行します。
正常に実行された後、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 succeedIoT Platform コンソールにログインして、インスタンス内のデバイスのステータスとログを表示します。
-
左側のナビゲーションウィンドウで、 を選択します。 デバイスのステータスが [オンライン] になっていることが確認できます。
の順に選択すると、[IoT プラットフォームログ] と [オンプレミスデバイスログ] を表示できます。詳細については、「IoT プラットフォームログ」および「オンプレミスデバイスログ」をご参照ください。
-
エラーコード
デバイスが MQTT 経由で IoT Platform への接続に失敗した場合、エラーコードを使用して問題をトラブルシューティングします。 サーバー側のエラーコードの詳細については、「トラブルシューティング」をご参照ください。