Utilisez le service Paho Android pour connecter une application Android à IoT Platform et envoyer et recevoir des messages.
Prérequis
Dans la console IoT Platform , pour l'instance correspondante, créez un produit et un appareil, puis obtenez le nom de domaine d'accès MQTT et les informations du certificat de l'appareil (ProductKey, DeviceName et DeviceSecret). Pour plus d'informations, consultez :
Présentation
Le service Paho Android est un service client MQTT basé sur la bibliothèque Eclipse Paho MQTT pour Java.
Environnement de développement
Cet exemple utilise Android Studio 3.5.1 avec Gradle 3.5.1.
Téléchargez Android Studio depuis le site web officiel d'Android Studio.
Installation du client Paho Android
-
Créez un nouveau projet Android.
ImportantLa valeur
targetSdkVersiondans le fichierbuild.gradlede l'application doit être inférieure ou égale à 30. Si elle est supérieure, vous devez la modifier. -
Ajoutez la dépendance Paho Android Client 1.1.1 à vos fichiers Gradle :
-
Dans le fichier
build.gradlebuild.gradle du projet, ajoutez l'URL du référentiel de publication Paho.repositories { maven { url "https://repo.eclipse.org/content/repositories/paho-releases/" } } -
Dans le fichier
build.gradlebuild.gradle de l'application, ajoutez les dépendances Paho Android Service (1.1.1) et MQTT client (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' }
-
-
Ajoutez les entrées suivantes au fichier
AndroidManifest.xmlAndroidManifest.xml :-
Déclarez le service MQTT :
<!-- Mqtt Service --> <service android:name="org.eclipse.paho.android.service.MqttService"> </service> -
Ajoutez les autorisations requises.
<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" />
-
Connexion à IoT Platform
-
Téléchargez android_sample_code.zip et extrayez le fichier
AiotMqttOption.javaAiotMqttOption.java, qui calcule les paramètres de connexion MQTT.Le fichier
AiotMqttOption.javaAiotMqttOption.java définit la classe AiotMqttOption :-
Prototype :
class AiotMqttOption -
Fonction :
Calcule les valeurs
usernameusername,passwordpassword etclientIDclientID requises pour connecter un appareil à IoT Platform via MQTT. -
Membres :
Définition du type description de la méthode public AiotMqttOption getMqttOption(String productKey, String deviceName, String deviceSecret)Calcule les valeurs
usernameusername,passwordpassword etclientidclientid à partir des valeursproductKeyproductKey,deviceNamedeviceName etdeviceSecretdeviceSecret de l'appareil.public String getUsername()Récupère la valeur
usernameusername MQTT.public String getPassword()Récupère la valeur
passwordpassword MQTT.public String getClientid()Récupère la valeur
clientidclientid MQTT.
-
Importez le fichier
AiotMqttOption.javaAiotMqttOption.java dans votre projet Android.-
Ajoutez du code pour connecter l'appareil à IoT Platform.
Appelez la classe AiotMqttOption dans le fichier
AiotMqttOption.javaAiotMqttOption.java pour calculer les paramètres de connexion MQTT et vous connecter à IoT Platform.Instructions de développement et exemple de code :
-
Calculez les paramètres de connexion MQTT
clientIdclientId,usernameusername etpasswordpassword, puis définissezusernameusername etpasswordpassword dans l'objet MqttConnectOptions.final private String PRODUCTKEY = "a11xsrW****"; final private String DEVICENAME = "paho_android"; final private String DEVICESECRET = "tLMT9QWD36U2SArglGqcHCDK9rK9****"; /* Obtain the MQTT connection information: clientId, username, and 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(); } /* Create an MqttConnectOptions object and configure the username and password. */ MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setUserName(userName); mqttConnectOptions.setPassword(passWord.toCharArray()); -
Connectez-vous à IoT Platform.
Créez un objet MqttAndroidClient, définissez le rappel et appelez connect avec MqttConnectOptions.
/* Create an MqttAndroidClient object and set the callback. */ 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"); } }); /* Establish an MQTT connection. */ 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(); } -
Publiez un message. Appelez
publishpour envoyer une charge utile au topic/${productKey}/${deviceName}/user/update/${productKey}/${deviceName}/user/update.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(); } } -
Appelez
subscribepour vous abonner à un topic et recevoir des messages d'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(); } }
Découvrez les modèles de communication entre l'appareil et le cloud dans Présentation des communications entre les appareils, IoT Platform et les serveursPrésentation.
-
Compilez le projet.
Exécution de la démo
Exécutez l'application de démo pour vérifier la connexion à IoT Platform.
Téléchargez le package de code de démo et extrayez-le.
Importez
aiot-android-demoaiot-android-demo dans Android Studio.-
Dans le fichier
MainActivityMainActivity situé dansapp/src/main/java/com.linkkit.aiot_android_demoapp/src/main/java/com.linkkit.aiot_android_demo, remplacez les informations d'appareil fictives par les identifiants de votre appareil.Définissez
PRODUCTKEYPRODUCTKEY,DEVICENAMEDEVICENAME etDEVICESECRETDEVICESECRET avec les valeurs du certificat de votre appareil.-
Définissez l'hôte sur votre endpoint :
final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";-
Pour les nouvelles instances publiques et les instances Enterprise, définissez l'hôte sur l'endpoint de votre instance :
final String host = "tcp://" + "{your-instance-endpoint}"final String host = "tcp://" + "{your-instance-endpoint}".Connectez-vous à la console IoT Platform. Sur la page Instance Overview, cliquez sur votre instance. Sur la page Instance Details, cliquez sur View Development Configuration pour obtenir l'endpoint. Afficher et configurer les endpoints des instancesManage instance endpoints.
-
Pour les anciennes instances publiques :
Remplacez le code de région (cn-shanghai) par la région où se trouve votre appareil. Régions prises en chargeSupported regions.
-
-
Générez et exécutez l'application.
Après une exécution réussie, vérifiez les journaux dans 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 succeedConnectez-vous à la console IoT Platform pour afficher l'état de l'appareil et les journaux de votre instance.
Dans le volet de navigation de gauche, choisissez . Vous pouvez constater que l'état de l'appareil est Online.
Choisissez . Vous pouvez consulter les IoT Platform logs et les on-premises device logs. Pour plus d'informations, consultez Journaux IoT PlatformIoT Platform logs et Journaux des appareils locauxJournaux des appareils locaux.
Codes d'erreur
Si l'appareil ne parvient pas à se connecter à IoT Platform via MQTT, utilisez les codes d'erreur pour résoudre le problème. Pour plus d'informations sur les codes d'erreur côté serveur, consultez DépannageDépannage.