Este tema describe cómo inicializar Link SDK for Java para conectar un dispositivo a IoT Platform.
Requisitos previos
Se crearon un producto y un dispositivo. Para obtener más información, consulte Create a product and device.
Obtuvo la información de verificación del dispositivo y el endpoint al que desea conectarlo.
Contexto
-
Link SDK for Java permite usar únicamente DeviceSecrets para verificar la identidad de los dispositivos. La siguiente tabla describe los métodos de verificación compatibles con el SDK.
Método de verificación
Método de registro
Descripción
N/A
Se graba en cada dispositivo un certificado que incluye ProductKey, DeviceName y DeviceSecret.
Pre-registro
Se graba un certificado de producto que incluye ProductKey y ProductSecret en todos los dispositivos de un producto.
Debe habilitar la función de dynamic registration para el producto.
El registro dinámico permite que un dispositivo obtenga un DeviceSecret.
Sin pre-registro
Se graba un certificado de producto que incluye ProductKey y ProductSecret en todos los dispositivos de un producto.
Debe habilitar la función de dynamic registration para el producto.
El registro dinámico permite que los dispositivos obtengan una combinación de ClientID y DeviceToken.
NotaPara obtener información sobre las diferencias entre la verificación de certificado único por producto con pre-registro y sin pre-registro, consulte Differences between the verification methods.
Para obtener información sobre los parámetros de Link SDK for Java, consulte LinkKitInitParams.
Verificación de certificado único por dispositivo
Código de ejemplo para la verificación de certificado único por dispositivo
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 se devuelve
onInitDonetras enviar una solicitud de inicialización, la inicialización fue exitosa. Si se devuelveonError, la inicialización falló.Si la inicialización falla, configure el parámetro necesario para reinicializar el dispositivo según sus requisitos empresariales. Link SDK for Java no reconecta automáticamente el dispositivo a IoT Platform.
Si la inicialización es exitosa y el dispositivo se desconecta de IoT Platform, Link SDK for Java reconecta automáticamente el dispositivo a IoT Platform.
Registro dinámico
La verificación de certificado único por producto también se conoce como registro dinámico. Esta función sirve para solicitar DeviceSecrets a IoT Platform. Los métodos de verificación de certificado único por producto se clasifican en dos tipos: sin pre-registro y con pre-registro. Antes de utilizar esta función, asegúrese de cumplir con los siguientes requisitos previos:
El registro dinámico está habilitado para un producto creado en la consola de IoT Platform.
En el archivo
deviceinfodel paquete de demostración, el parámetro deviceSecret se dejó vacío y se especificó un valor para el parámetro productSecret.Asegúrese de ejecutar el Paso 1, el Paso 2 y el Paso 3 del siguiente código de ejemplo.
Una vez completado el registro dinámico, cierre la conexión persistente utilizada para dicho registro. Para obtener más información, consulte el código de ejemplo en el Paso 4.
El código de ejemplo muestra cómo realizar la verificación de certificado único por producto con pre-registro. Consulte las notas de uso en el Paso 1 del código de ejemplo para realizar la verificación de certificado único por producto sin pre-registro.
Para garantizar la seguridad del dispositivo, grabe un DeviceSecret en él después de obtenerlo mediante el método de verificación de certificado único por producto. Si desea conectar su dispositivo a IoT Platform, consulte la sección "Verificación de certificado único por dispositivo" de este tema.
La siguiente tabla describe las diferencias entre los métodos de verificación de certificado único por producto sin pre-registro y con pre-registro.
Elemento | Con pre-registro | Sin pre-registro |
Protocolos | Message Queuing Telemetry Transport (MQTT) y HTTPS | MQTT |
Regiones |
| China (Shanghai) y China (Beijing) |
DeviceSecrets devueltos | Para obtener más información sobre cómo utilizar un DeviceSecret, consulte el Paso 1 en el código de ejemplo para la verificación de certificado único por dispositivo. | Grabe el ClientID y el DeviceToken en el dispositivo. Así, la información podrá utilizarse al emplear funciones específicas, como conectar el dispositivo a IoT Platform. Para obtener más información, consulte el Paso 3 en el código de ejemplo para la verificación de certificado único por dispositivo. |
Registro de dispositivos | Debe registrar previamente el DeviceName de un dispositivo en la consola de IoT Platform. | No es necesario registrar previamente el DeviceName de un dispositivo en la consola de IoT Platform. |
Límites de uso |
| Puede activar hasta cinco dispositivos físicos simultáneamente con el mismo ProductKey, ProductSecret y DeviceName en la consola de IoT Platform. IoT Platform genera un ClientID y un DeviceToken únicos para cada dispositivo. |
Código de ejemplo para el registro dinámico:
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) {
}
Especificar un endpoint
Código de ejemplo:
// 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;
Parámetros:
Parámetro | Ejemplo | Descripción |
channelHost | a18wP.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883 | Especifique el endpoint al que desea conectar el dispositivo en el formato
Para obtener información sobre instancias públicas de las versiones nueva y anterior, instancias Enterprise Edition y endpoints, consulte View the endpoint of an instance. |
Configuraciones adicionales
Configure los siguientes parámetros para establecer ajustes adicionales relacionados con la conexión del dispositivo.
-
Conexión MQTT
Elemento
Descripción
Código de ejemplo
Intervalo de keepalive
Especifique un intervalo de keepalive para el dispositivo. Este parámetro define el periodo durante el cual se mantiene una conexión persistente entre el dispositivo e IoT Platform.
MqttConfigure.setKeepAliveInterval(int interval);Nivel de QoS
Especifique un nivel de Calidad de Servicio (QoS). Un nivel de QoS es un acuerdo que define la calidad de entrega de mensajes entre un dispositivo e IoT Platform. Valores válidos:
0: Cada mensaje se entrega como máximo una vez.1: Cada mensaje se entrega al menos una vez.
- 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\":{} }";Mensajes sin conexión
El parámetro cleanSession especifica si se reciben mensajes sin conexión.
/** * 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; -
Compatibilidad con registros y Log4j
Ejecute el siguiente comando para obtener registros de depuración:
ALog.setLevel(ALog.LEVEL_DEBUG); MqttLogger.isLoggable = true;En Link SDK for Java V1.2.3.1 y versiones posteriores, configure la función
logde un interceptor global para procesar registros según sus necesidades empresariales. Por ejemplo, use Log4j para almacenar registros en un almacenamiento persistente, como un archivo.Código de ejemplo:
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); } } }); -
Estado de conexión y listeners de mensajes descendentes
Para escuchar los mensajes de conexión y desconexión de un dispositivo, así como los datos enviados desde IoT Platform, configure el siguiente listener:
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); -
Desinicialización
El siguiente código muestra cómo desinicializar el dispositivo:
// Unregister the notifyListener listener. Make sure that you unregister the listener that you registered. LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener); LinkKit.getInstance().deinit();