このトピックでは、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クライアントをインストールする
Androidプロジェクトを作成します。
重要build.gradleファイルでtargetSdkVersionパラメーターの値が30より大きい場合は、30以下の値に変更します。
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' }
アプリを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 への接続
android_sameple_code.zipパッケージをダウンロードし、パッケージを解凍して、Alibaba Cloudが提供するAiotMqttOption.javaファイルを取得します。 このようにして、MQTT接続パラメータを取得できます。
AiotMqttOption.javaファイルは、AiotMqttOptionクラスを定義します。
プロトタイプ
クラスAiotMqttOption説明
このクラスを使用すると、MQTT接続パラメーターusername、password、clientidを取得できます。
メンバー
タイプ
メソッド
パブリックAiotMqttOption
getMqttOption(String productKey, String deviceName, String deviceSecret)productKey、deviceName、およびdeviceSecretパラメーターの値に基づいて、username、password、およびclientidパラメーターの値を計算します。
public文字列
getUsername()usernameパラメーターを取得します。
public文字列
getPassword()passwordパラメーターを取得します。
public文字列
getClientid()clientidパラメーターを取得します。
AiotMqttOption.javaファイルをAndroidプロジェクトにインポートします。
Androidプロジェクトで、デバイスをIoT Platformに接続できるプログラムファイルを追加します。
AiotMqttOption.javaファイルでAiotMqttOptionクラスを使用して、IoT PlatformへのMQTT接続を確立するために必要なパラメーターの値を計算するプログラムを記述する必要があります。
このセクションでは、開発手順とサンプルコードについて説明します。
MQTT接続パラメーターclientId、username、およびpasswordの値を計算します。 MqttConnectOptionsオブジェクトでusernameとpasswordパラメーターを設定します。
最終プライベート文字列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、およびサーバー間の通信の概要」をご参照ください。
プロジェクトをコンパイルします。
サンプルコード
次のサンプルコードは、IoT Platformに接続する方法を示しています。
デモパッケージをダウンロードして解凍します。
aiot-android-demoをAndroid Studioにインポートします。
app/src/main/java/com.linkkit.aiot_android_demoディレクトリで、デバイス情報をMainActivityファイルのデバイス情報に置き換えます。
PRODUCTKEY、DEVICENAME、および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の詳細については、「サポートされているリージョン」をご参照ください。
デモをビルドして実行します。
デモの実行後、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接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。