Cette rubrique explique comment initialiser le Link SDK for Java afin de connecter un appareil à IoT Platform.
Prérequis
Un produit et un appareil ont été créés. Pour plus d'informations, reportez-vous à la rubrique Créer un produit et un appareil.
Vous avez obtenu les informations de vérification de l'appareil ainsi que l'endpoint auquel vous souhaitez le connecter.
Contexte
-
Le Link SDK for Java permet uniquement d'utiliser les DeviceSecrets pour vérifier l'identité des appareils. Le tableau ci-dessous décrit les méthodes de vérification prises en charge par le SDK.
Méthode de vérification
Méthode d'enregistrement
Description
S/O
Un certificat d'appareil contenant un ProductKey, un DeviceName et un DeviceSecret est intégré à chaque appareil.
Préenregistrement
Un certificat de produit contenant un ProductKey et un ProductSecret est intégré à tous les appareils d'un produit.
Vous devez activer la fonctionnalité dynamic registration pour le produit.
L'enregistrement dynamique permet à un appareil d'obtenir un DeviceSecret.
Sans préenregistrement
Un certificat de produit contenant un ProductKey et un ProductSecret est intégré à tous les appareils d'un produit.
Vous devez activer la fonctionnalité dynamic registration pour le produit.
L'enregistrement dynamique permet aux appareils d'obtenir une combinaison du ClientID et du DeviceToken.
RemarquePour connaître les différences entre la vérification par certificat unique par produit avec préenregistrement et sans préenregistrement, consultez la section Différences entre les méthodes de vérification.
Pour obtenir des informations sur les paramètres du Link SDK for Java, consultez la documentation LinkKitInitParams.
Vérification par certificat unique par appareil
Exemple de code pour la vérification par certificat unique par appareil :
String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
LinkKitInitParams params = new LinkKitInitParams();
/**
* Step 1: Configure the required parameters for Message Queuing Telemetry Transport (MQTT) initialization.
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
MqttConfigure.mqttHost = "{YourInstanceId}.mqtt.iothub.aliyuncs.com:8883";
/*
* Specify whether to receive offline messages.
* This parameter corresponds to the cleanSession parameter of an MQTT connection.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
/**
* Step 2: Specify the verification information that is required to initialize a device.
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
params.deviceInfo = deviceInfo;
/**
* Step 3: Specify the username, token, and clientId of the device.
* This step is required only if you use the preregistration-free unique-certificate-per-product verification method to verify a device.
* By default, this step is skipped.
*/
// MqttConfigure.deviceToken="${YourDeviceToken}";
// MqttConfigure.clientId="${YourClientId}";
LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
public void onError(AError aError) {
ALog.e(TAG, "Init Error error= "+aError);
}
public void onInitDone(InitResult initResult) {
ALog.i(TAG, "onInitDone result=" + initResult);
}
});
Si la méthode
onInitDoneest appelée après l'envoi d'une demande d'initialisation, celle-ci a abouti. Si la méthodeonErrorest appelée, l'initialisation a échoué.En cas d'échec de l'initialisation, configurez les paramètres requis pour réinitialiser l'appareil selon vos besoins métier. Le Link SDK for Java ne reconnecte pas automatiquement l'appareil à IoT Platform.
Si l'initialisation réussit mais que l'appareil est déconnecté d'IoT Platform, le Link SDK for Java le reconnecte automatiquement.
Enregistrement dynamique
La vérification par certificat unique par produit est également appelée enregistrement dynamique. Cette fonctionnalité sert à demander des DeviceSecrets à IoT Platform. Les méthodes de vérification par certificat unique par produit se divisent en deux types : sans préenregistrement et avec préenregistrement. Avant d'utiliser cette fonctionnalité, assurez-vous que les conditions suivantes sont remplies :
L'enregistrement dynamique est activé pour un produit que vous avez créé dans la console IoT Platform.
Dans le fichier
deviceinfodu package de démonstration, le paramètre deviceSecret est laissé vide et une valeur est spécifiée pour le paramètre productSecret.Veillez à exécuter les étapes 1, 2 et 3 indiquées dans l'exemple de code ci-dessous.
Une fois l'enregistrement dynamique terminé, fermez la connexion persistante utilisée pour cet enregistrement. Pour plus de détails, consultez l'exemple de code de l'étape 4.
L'exemple de code illustre la procédure de vérification par certificat unique par produit avec préenregistrement. Reportez-vous aux remarques d'utilisation de l'étape 1 pour effectuer une vérification sans préenregistrement.
Pour garantir la sécurité de l'appareil, intégrez un DeviceSecret à l'appareil après l'avoir obtenu via la méthode de vérification par certificat unique par produit. Si vous souhaitez connecter votre appareil à IoT Platform, reportez-vous à la section « Vérification par certificat unique par appareil » de cette rubrique.
Le tableau suivant présente les différences entre les méthodes de vérification par certificat unique par produit sans préenregistrement et avec préenregistrement.
Élément | Avec préenregistrement | Sans préenregistrement |
Protocoles | Message Queuing Telemetry Transport (MQTT) et HTTPS | MQTT |
Régions |
| Chine (Shanghai) et Chine (Pékin) |
DeviceSecrets renvoyés | Pour savoir comment utiliser un DeviceSecret, consultez l'étape 1 de l'exemple de code pour la vérification par certificat unique par appareil. | Intégrez le ClientID et le DeviceToken de l'appareil à ce dernier. Ces informations seront utilisées lors de l'utilisation de certaines fonctionnalités, telles que la connexion de l'appareil à IoT Platform. Pour plus de détails, consultez l'étape 3 de l'exemple de code pour la vérification par certificat unique par appareil. |
Enregistrement de l'appareil | Vous devez préenregistrer le DeviceName de l'appareil dans la console IoT Platform. | Il n'est pas nécessaire de préenregistrer le DeviceName de l'appareil dans la console IoT Platform. |
Nombre d'utilisations |
| Vous pouvez activer jusqu'à cinq appareils physiques simultanément en utilisant le même ProductKey, ProductSecret et DeviceName dans la console IoT Platform. IoT Platform génère un ClientID et un DeviceToken uniques pour chaque appareil. |
Exemple de code pour l'enregistrement dynamique :
String deviceName = "${YourDeviceName}";
String productKey = "${YourProductKey}";
String productSecret = "${YourProductSecret}";
// Step 1: Check whether the unique-certificate-per-product verification method is preregistration-free or pre-registration.
// Case 1: If you set the registerType parameter to regnwl, the preregistration-free unique-certificate-per-product verification method is used and you do not need to create a device.
// Case 2: If you leave the registerType parameter empty or set the registerType parameter to register, the pre-registration unique-certificate-per-product verification method is used and you must create a device.
String registerType = "register";
// Step 2: Specify an endpoint for dynamic registration.
MqttConfigure.mqttHost = "ssl://${YourMqttHostUrl}:8883";
MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, "",registerType);
// Step 3: If you use a public instance of the new version or an Enterprise Edition instance, specify the instance ID that you obtained from the Instance Details page in the IoT Platform console for dynamic registration.
initParams.instanceId = "${YourInstanceId}";
final Object lock = new Object();
LinkKit.getInstance().deviceDynamicRegister(initParams, new IOnCallListener() {
@Override
public void onSuccess(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AResponse response) {
try {
String responseData = new String((byte[]) response.data);
JSONObject jsonObject = JSONObject.parseObject(responseData);
// The output that is returned if the pre-registration unique-certificate-per-product verification method is used.
String deviceSecret = jsonObject.getString("deviceSecret");
// The output that is returned if the preregistration-free unique-certificate-per-product verification method is used.
String clientId = jsonObject.getString("clientId");
String deviceToken = jsonObject.getString("deviceToken");
// Save the returned credentials and proceed to Step 4. After you complete Step 4, you can use the onSuccess method to connect the device to IoT Platform.
// Call the API operation that waits for the thread.
synchronized (lock){
lock.notify();
}
} catch (Exception e) {
}
}
@Override
public void onFailed(ARequest aRequest, com.aliyun.alink.linksdk.channel.core.base.AError aError) {
System.out.println("mqtt dynamic registration failed");
// Call the API operation that waits for the thread.
synchronized (lock){
lock.notify();
}
}
@Override
public boolean needUISafety() {
return false;
}
});
try {
// Wait for a downstream message. In most cases, the downstream message is returned within 1 second.
synchronized (lock){
lock.wait(3000);
}
// Step 4: Disable the dynamic registration instance.
// Do not run the following function in the LinkKit.getInstance().deviceDynamicRegister callback. Otherwise, an error may occur.
LinkKit.getInstance().stopDeviceDynamicRegister(2000, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
System.out.println("mqtt dynamic registration success");
// Connect the device to IoT Platform and initialize the connection. For more information, see the "Unique-certificate-per-device verification" section of this topic.
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
System.out.println("mqtt dynamic registration failed");
}
});
} catch (Exception e) {
}
Spécifier un endpoint
Exemple de code :
// Specify an endpoint for the LinkKitInitParams parameter in an MQTT request.
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.channelHost = "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883";
linkKitInitParams.mqttClientConfig = clientConfig;
Paramètres :
Paramètre | Exemple | Description |
channelHost | a18wP.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883 | Spécifiez l'endpoint auquel vous souhaitez connecter l'appareil au format
Pour plus d'informations sur les instances publiques des nouvelles et anciennes versions, les instances Enterprise Edition et les endpoints, consultez la rubrique Afficher l'endpoint d'une instance. |
Autres paramètres
Configurez les paramètres suivants pour ajuster les réglages liés à la connexion de l'appareil.
-
Connexion MQTT
Élément
Description
Exemple de code
Intervalle Keepalive
Définissez un intervalle keepalive pour l'appareil. Ce paramètre spécifie la durée pendant laquelle une connexion persistante peut être maintenue entre l'appareil et IoT Platform.
MqttConfigure.setKeepAliveInterval(int interval);Niveau QoS
Spécifiez un niveau de Quality of Service (QoS). Un niveau QoS est un accord qui définit la qualité de livraison des messages entre un appareil et IoT Platform. Valeurs possibles :
0: Chaque message est livré au plus une fois.1: Chaque message est livré au moins une fois.
- The qos parameter. MqttPublishRequest request = new MqttPublishRequest(); // Valid values: 0 and 1. Default value: 0. request.qos = 0; request.isRPC = false; request.topic = topic.replace("request", "response"); String resId = topic.substring(topic.indexOf("rrpc/request/")+13); request.msgId = resId; // Configure the preceding parameters based on your business requirements. The preceding information is provided only for reference. request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";Messages hors ligne
Le paramètre cleanSession indique s'il faut recevoir les messages hors ligne.
/** * Configure the required parameters for MQTT initialization. */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfoData.productKey; config.deviceName = deviceInfoData.deviceName; config.deviceSecret = deviceInfoData.deviceSecret; config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"; /** * Specify whether to receive offline messages. * The following definitions correspond to the following code: receiveOfflineMsg = !cleanSession. By default, offline messages cannot be received. */ config.receiveOfflineMsg = false; params.mqttClientConfig = config; -
Prise en charge de la journalisation et de Log4j
Exécutez la commande suivante pour obtenir les journaux de débogage :
ALog.setLevel(ALog.LEVEL_DEBUG); MqttLogger.isLoggable = true;À partir de la version 1.2.3.1 du Link SDK for Java, vous pouvez configurer la fonction
logd'un intercepteur global pour traiter les journaux selon vos besoins métier. Par exemple, vous pouvez utiliser Log4j pour stocker les journaux dans un stockage persistant tel qu'un fichier.Exemple de code :
ALog.setLogDispatcher(new ILogDispatcher() { @Override public void log(int level, String prefix, String msg) { switch (level){ case LEVEL_DEBUG: System.out.println("debug:"+ prefix + msg); break; case LEVEL_INFO: System.out.println("info:" + prefix + msg); break; case LEVEL_ERROR: System.out.println("error:" + prefix + msg); break; case LEVEL_WARNING: System.out.println("warnings:" + prefix + msg); break; default: System.out.println("other:" + prefix + msg); } } }); -
Écouteurs d'état de connexion et de messages descendants
Pour écouter les messages de connexion et de déconnexion d'un appareil ainsi que les données envoyées par IoT Platform, configurez l'écouteur suivant :
IConnectNotifyListener notifyListener = new IConnectNotifyListener() { @Override public void onNotify(String connectId, String topic, AMessage aMessage) { // The callback for downstream data from IoT Platform, such as the connectId, connection type, downstream topic from IoT Platform, and the aMessage parameter that specifies the message body sent from IoT Platform. //String pushData = new String((byte[]) aMessage.data); // pushData example: {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"} // The method parameter specifies a service type. The params parameter specifies the content of data that you want to push. } @Override public boolean shouldHandle(String connectId, String topic) { // Specify whether to process the downstream data of a topic from IoT Platform. // If a topic is not processed, the onNotify listener cannot receive the downstream data of the topic from IoT Platform. return true; // Specify the required data processing logic for the listener based on your business scenario. } @Override public void onConnectStateChange(String connectId, ConnectState connectState) { // The callback for the connection status change of the corresponding connection type. For information about the connection status, see ConnectState in the SDK. // If the SDK detects that the device is disconnected from IoT Platform due to network fluctuations, the SDK automatically reconnects the device at intervals of 1 second, 2 seconds, 4 seconds, 8 seconds, and 128 seconds. After the retry interval reaches 128 seconds, the SDK retries at an interval of 128 seconds until the device is reconnected to IoT Platform. } } // Register a listener to listen to downstream data, including the status of a persistent connection and downstream data from IoT Platform. LinkKit.getInstance().registerOnNotifyListener(notifyListener); -
Désinitialisation
Le code suivant montre comment effectuer la désinitialisation :
// Unregister the notifyListener listener. Make sure that you unregister the listener that you registered. LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener); LinkKit.getInstance().deinit();