Todos los productos
Search
Centro de documentos

IoT Platform:Verificar y conectar un dispositivo

Última actualización: Sep 05, 2026

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

    Unique-certificate-per-device verification

    N/A

    Se graba en cada dispositivo un certificado que incluye ProductKey, DeviceName y DeviceSecret.

    Unique-certificate-per-product verification

    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.

    Nota

    Para 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);
    }
});
Nota
  • Si se devuelve onInitDone tras enviar una solicitud de inicialización, la inicialización fue exitosa. Si se devuelve onError, 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 deviceinfo del 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

  • El registro dinámico basado en MQTT está disponible en todas las regiones compatibles con IoT Platform.

  • El registro dinámico basado en HTTPS solo está disponible en la región China (Shanghai). Se recomienda no utilizar el registro dinámico basado en HTTPS. El código de ejemplo no incluye código para este método.

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

  • Solo puede utilizar un certificado de dispositivo para activar un dispositivo físico. Si el Dispositivo A se activa mediante un DeviceName y el Dispositivo B necesita usar ese mismo DeviceName, elimine el Dispositivo A en la consola de IoT Platform y deshabilite su DeviceSecret. Posteriormente, podrá utilizar el DeviceName para crear y activar el Dispositivo B.

  • Si un dispositivo necesita reactivarse porque se perdió el DeviceSecret, llame a la operación ResetThing para establecer el estado del dispositivo en Inactive. Luego, podrá reactivar el dispositivo. El DeviceSecret emitido por IoT Platform permanece sin cambios.

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 ${Endpoint}:${Port number}.

  • Para consultar el endpoint de una instancia Enterprise Edition o de una instancia pública de la nueva versión, vaya al panel Development Configurations de la página Instance Details en la consola de IoT Platform.

  • Si utiliza una instancia pública de la versión anterior, el endpoint tiene el formato ${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:8883.

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 log de 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();