Todos los productos
Search
Centro de documentos

IoT Platform:Verificar y conectar un dispositivo

Última actualización: Sep 03, 2026

Antes de conectar un dispositivo a IoT Platform, este debe aprobar la verificación de identidad. Este tema describe cómo inicializar Link SDK for Android 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 a device.

  • Se descargó el paquete de demostración de Link SDK para Android.

  • Se obtuvo la información del certificado del dispositivo y el endpoint al que desea conectarlo. Para obtener más información, consulte las configuraciones de parámetros en el tema Link SDK for Android.

Contexto

Link SDK for Android permite usar un DeviceSecret o un IoT Device ID (ID²) para verificar la identidad de un dispositivo.

  • Uso de un DeviceSecret para verificar un dispositivo:

    Método de verificación

    Método de registro

    Descripción

    Unique-certificate-per-device verification

    N/A

    En cada dispositivo se graba un certificado de dispositivo que incluye un ProductKey, un DeviceName y un DeviceSecret.

    Unique-certificate-per-product verification

    Pre-registro

    • En todos los dispositivos de un producto se graba un certificado de producto que incluye un ProductKey y un ProductSecret.

    • 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

    • En todos los dispositivos de un producto se graba un certificado de producto que incluye un ProductKey y un ProductSecret.

    • 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.

  • Use an ID² to verify a device: Un ID² es un identificador de confianza para un dispositivo de IoT Platform. El ID² es resistente a la manipulación y no se puede falsificar.

Nota

Para obtener información sobre cómo usar un ID² para verificar un dispositivo, consulte el código de ejemplo en el archivo InitManager.java.

Verificación de certificado único por dispositivo

Código de ejemplo para el método de verificación de certificado único por dispositivo:

AppLog.setLevel(ALog.LEVEL_DEBUG);

final LinkKitInitParams params = new LinkKitInitParams();

String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
String productSecret = "";

// Step 1: Specify the information about a device certificate.
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // The ProductKey of the product.
deviceInfo.deviceName = deviceName;  // The DeviceName of the device.
deviceInfo.deviceSecret = deviceSecret;  // The DeviceSecret of the device.
deviceInfo.productSecret = productSecret;  // The ProductSecret of the product.
params.deviceInfo = deviceInfo;

// Step 2: Specify the global default domain name.
IoTApiClientConfig userData = new IoTApiClientConfig();
params.connectConfig = userData;

// Step 3: Cache the Thing Specification Language (TSL) model.
Map<String, ValueWrapper> propertyValues = new HashMap<>();
/**
 * The TSL data is cached in the preceding parameter. You cannot delete or leave this parameter empty. Otherwise, TSL-related features may fail.
 * After you call an API operation to submit TSL data, the TSL data is cached. 
 */
params.propertyValues = propertyValues;

// Step 4: Configure MQTT parameters.
/**
 * The MQTT parameters, such as the endpoint. For more information, see the deviceinfo file.
 * The domain name, ProductSecret, and security verification method.
 */
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.receiveOfflineMsg = false;//cleanSession=1 Offline messages cannot be received.
// The information about the Message Queuing Telemetry Transport (MQTT) endpoint.
clientConfig.channelHost = "${YourMqttHostUrl}:8883";
params.mqttClientConfig = clientConfig;
MqttConfigure.pingSenderType = "android"; // Set the heartbeat detection type to android and set the timer type for heartbeat detection to AlarmTImer. This ensures that the heartbeat detection is performed as scheduled when the display is automatically shut down.

// Step 5: Configure advanced features. By default, all advanced features are disabled except for the TSL model feature.
IoTDMConfig ioTDMConfig = new IoTDMConfig();
// By default, the TSL model feature is enabled. After you initialize the TSL model that is requested from IoT Platform, onInitDone is returned.
ioTDMConfig.enableThingModel = true;
// By default, the gateway feature is disabled. After you enable the gateway feature, the gateway module is initialized to obtain the sub-device list of the gateway module from IoT Platform.
ioTDMConfig.enableGateway = false;
// By default, the log push feature is disabled. You can enable this feature.
ioTDMConfig.enableLogPush = false;
params.ioTDMConfig = ioTDMConfig;

// Step 6: Configure a callback function to process downstream messages.
LinkKit.getInstance().registerOnPushListener(new IConnectNotifyListener() {
    @Override
    public void onNotify(String s, String s1, AMessage aMessage) {
        // You can configure the callback function for downstream message processing based on the documentation.
    }

    @Override
    public boolean shouldHandle(String s, String s1) {
        return true; // Configure the parameters based on your business requirements and the documentation.
    }

    @Override
    public void onConnectStateChange(String s, 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 disconnects the device from IoT Platform due to poor network conditions, the SDK automatically attempts to reconnect the device to IoT Platform at intervals of 2 to the power of n (unit: seconds). n is an integer ranging from 0 to 7. The maximum interval is 128s.
    }
});

// If you want to verify a device by using the preregistration-free unique-certificate-per-product verification method, the DeviceToken and ClientID are required when you connect the device to IoT Platform.
// Step7: Configure the parameters for the preregistration-free unique-certificate-per-product verification. This feature is disabled by default.
// MqttConfigure.deviceToken = DemoApplication.deviceToken;
// MqttConfigure.clientId = DemoApplication.clientId;

// Step8: Configure parameters that are required to upload files over HTTP/2.
/**
 * If you want to upload files to IoT Platform over HTTP/2, you must specify a domain name.
 */
// IoTH2Config ioTH2Config = new IoTH2Config();
// ioTH2Config.clientId = "client-id";
// ioTH2Config.endPoint = "https://" + productKey + ioTH2Config.endPoint;// The endpoint that is used to upload files over HTTP/2 to IoT Platform.
// params.iotH2InitParams = ioTH2Config;

/**
 * Initialize the SDK to connect a device to IoT Platform.
 * onError The initialization failed. If the initialization fails due to network issues, you must re-initialize the SDK.
 * onInitDone The initialization is successful.
 */
LinkKit.getInstance().init(getAppContext(), params, new ILinkKitConnectListener() {
    @Override
    public void onError(AError error) {
        ALog.d(TAG, "onError() called with: error = [" + (error) + "]");
    }

    @Override
    public void onInitDone(Object data) {
        ALog.d(TAG, "onInitDone() called with: data = [" + data + "]");
        // Device verification is complete and the device is connected. You can run your business as required.
    }
});

Verificación de certificado único por producto

La verificación de certificado único por producto también se conoce como registro dinámico. Esta función se utiliza para solicitar DeviceSecrets a IoT Platform. Los métodos de verificación de certificado único por producto se clasifican en los siguientes tipos: sin pre-registro y con pre-registro. Antes de utilizar esta función, asegúrese de cumplir con los siguientes requisitos previos:

  • Dynamic Registration está activado para un producto que creó en la consola de IoT Platform.

  • En el archivo deviceinfo del paquete de demostración, el parámetro deviceSecret está vacío y el productSecret no lo está.

  • Se ejecutaron del paso 1 al paso 3 del código de ejemplo.

  • Después de que un registro dinámico tenga éxito o falle, cierre la conexión persistente correspondiente. Para obtener información sobre cómo cerrar la conexión, consulte el paso 4.

  • 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.

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

MQTT y HTTPS

MQTT

Regiones

  • El registro dinámico basado en MQTT está disponible en todas las regiones donde se admite 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 usar 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 de un dispositivo en el propio dispositivo. De este modo, la información podrá utilizarse cuando use funciones específicas, como conectar el dispositivo a IoT Platform. Para obtener más información, consulte el paso 7 en el código de ejemplo para la verificación de certificado único por dispositivo.

Registro de dispositivos

Debe pre-registrar el DeviceName de un dispositivo en la consola de IoT Platform.

No es necesario pre-registrar el DeviceName de un dispositivo en la consola de IoT Platform.

Veces de uso

  • Un certificado de dispositivo solo puede usarse para activar un dispositivo físico. Si el Dispositivo A se activa mediante un DeviceName pero el Dispositivo B necesita usar ese mismo DeviceName, puede eliminar el Dispositivo A desde la consola de IoT Platform y deshabilitar su DeviceSecret. Así podrá usar el DeviceName para agregar y activar el Dispositivo B en la consola de IoT Platform.

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

Cada ProductKey, ProductSecret y DeviceName puede usarse para activar hasta cinco dispositivos físicos. Puede activar los dispositivos en la consola de IoT Platform simultáneamente. IoT Platform genera un ClientID y un DeviceToken únicos para cada dispositivo.

Nota

Para obtener más información sobre el código, consulte el archivo DemoApplication.java en el paquete de demostración.

Código de ejemplo para el registro dinámico:

String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
String productSecret = "";
MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, deviceSecret, MqttConfigure.MQTT_SECURE_MODE_TLS);

// 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.
initParams.registerType = "";

// Step 2: Specify an endpoint for dynamic registration.
MqttConfigure.mqttHost = "${YourMqttHostUrl}:8883";;

// (Optional) Step 3: You must specify this parameter for Enterprise Edition instances, or public instances of the IoT Platform service that is activated on July 30, 2021 and later.
// For public instances of the IoT Platform service that was activated before July 30, 2021, the value of this parameter is an empty string "".
MqttConfigure.registerInstanceId = "${YourInstanceId}";

final Object lock = new Object();
LinkKit.getInstance().deviceDynamicRegister(this, 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) {
        ALog.i(TAG, "onSuccess() called with: request = [" + request + "], response = [" + response + "]");
        // response.data is byte array
        try {
            String responseData = new String((byte[]) response.data);
            JSONObject jsonObject = JSONObject.parseObject(responseData);
            String pk = jsonObject.getString("productKey");
            String dn = jsonObject.getString("deviceName");
            // The result returned if the pre-registration unique-certificate-per-product verification method is used.
            String deviceSecret = jsonObject.getString("deviceSecret");

            // The result 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(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AError error) {
        ALog.e(TAG, "onFailed() called with: request = [" + request + "], error = [" + error + "]");
        // 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: Exit dynamic registration
    // Do not run the following function in the LinkKit.getInstance().deviceDynamicRegister callback function. Otherwise, an error may occur.
    LinkKit.getInstance().stopDeviceDynamicRegister(10 * 1000, null, new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken iMqttToken) {
            ALog.d(TAG, "onSuccess() called with: iMqttToken = [" + iMqttToken + "]");
            // Connect the device to IoT Platform and initialize the connection based on the unique-certificate-per-device verification method.
        }

        @Override
        public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
            ALog.w(TAG, "onFailure() called with: iMqttToken = [" + iMqttToken + "], throwable = [" + throwable + "]");
        }
    });
}catch (Exception e){

};

Verificación de dispositivos basada en ID²

. /**
 * Create a device that uses the iTLS-based verification in the IoT Platform console and perform the iTLS-based verification to initialize the device.
 * Grant the ID² permissions to the product to which the device belongs.
 */
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(productKey, deviceName, deviceSecret);
clientConfig.channelHost = productKey + ".itls.cn-shanghai.aliyuncs.com:1883";
clientConfig.productSecret = productSecret;
clientConfig.secureMode = 8;
linkKitInitParams.mqttClientConfig = clientConfig;
// If you use an Enterprise Edition instance or a public instance of the IoT Platform service that was activated on July 30, 2021 or later, you can specify the instance ID by replacing the ${Instance ID} variable in the following command with the actual instance ID in the iot-******* format.
MqttConfigure.extraMqttClientIdItems=",instanceId=" + "${Instance ID}"; 

El parámetro clientConfig.channelHost en el código de ejemplo especifica el endpoint que el dispositivo puede usar para conectarse a IoT Platform.

Configuraciones adicionales

Puede configurar 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 un dispositivo. Este parámetro define el periodo durante el cual se mantiene una conexión persistente entre el dispositivo e IoT Platform.

    Nota
    • El periodo predeterminado de keepalive definido en el SDK es de 65 segundos.

    • Puede especificar un intervalo de keepalive de entre 30 y 1,200 segundos.

    // The keepalive interval. Unit: seconds.
    MqttConfigure.setKeepAliveInterval(int interval);

    Nivel de QoS

    Especifique un nivel de Quality of Service (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.

    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 parameters based on your business requirements.
        request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";

    Mensajes sin conexión

    El parámetro cleanSession especifica si se reciben mensajes sin conexión.

    IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
    // Correspond to the following code: receiveOfflineMsg = !cleanSession. By default, offline messages cannot be received. 
    clientConfig.receiveOfflineMsg = true;
     

    El ClientID.

    El parámetro clientId especifica un ClientID. Para obtener más información, consulte la descripción del parámetro clientId.

    MqttConfigure.clientId = "abcdef******";

    Mecanismo de reconexión

    El parámetro automaticReconnect especifica si se vuelve a conectar un dispositivo a IoT Platform. Valores válidos:

    • true: El sistema reconecta el dispositivo a IoT Platform.

    • false: El sistema no reconecta el dispositivo a IoT Platform.

    Código de ejemplo:

    MqttConfigure.automaticReconnect = true;
  • Desinicialización del SDK

    Para realizar la desinicialización, puede llamar a la siguiente función. Esta función opera de manera síncrona.

    Nota

    Si desea inicializar el SDK, asegúrese de que la desinicialización anterior haya finalizado. De lo contrario, la inicialización del SDK podría fallar.

    // Unregister the notifyListener object. The object must be the same as the notifyListener object that is registered.
    LinkKit.getInstance().unRegisterOnPushListener(notifyListener);
    LinkKit.getInstance().deinit();
  • Estado de conexión y listeners de mensajes descendentes

    Puede configurar el siguiente listener para monitorear los mensajes de conexión y desconexión de un dispositivo, así como los datos enviados desde IoT Platform:

    IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
        @Override
        public void onNotify(String connectId, String topic, AMessage aMessage) {
            // The callback for downstream data from IoT Platform.
            // The connectId parameter specifies a connection type, the topic parameter specifies a downstream topic from IoT Platform, and the aMessage parameter specifies downstream data from IoT Platform.
            // Define a function named pushData to parse data.
            //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, and 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 a value 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 the description of ConnectState in the SDK.
            // If the SDK disconnects the device from IoT Platform due to poor network conditions, the SDK automatically attempts to reconnect the device to IoT Platform at intervals of 2 to the power of n (unit: seconds). n is an integer ranging from 0 to 7. The maximum interval is 128s. After the interval reaches 128s, the SDK attempts to reconnect the device to IoT Platform at the interval of 128s until the device is connected. 
        }
    }
    // Register a listener to listen to downstream data, including the status of a persistent connection and downstream data from IoT Platform.
    LinkKit.getInstance().registerOnPushListener(notifyListener);
    // Unregister the listener that listens to downstream data. Make sure that the listener to be unregistered is the same as the listener that you registered.
    // LinkKit.getInstance().unRegisterOnPushListener(notifyListener);
                
    Nota

    De forma predeterminada, la función de devolución de llamada onNotify se invoca para transmitir datos descendentes en el hilo de la interfaz de usuario. En lp-iot-linkkit V1.7.3 y versiones posteriores, puede establecer el parámetro PersistentConnect.mNotifyReceivedMsgOnMainThread en false para transmitir datos descendentes en hilos distintos al de la interfaz de usuario. Se recomienda establecer el parámetro PersistentConnect.mNotifyReceivedMsgOnMainThread en false cuando los mensajes descendentes se transmiten con frecuencia o el hilo de la interfaz de usuario tiene una carga excesiva.

  • Interruptor de registros

    Active el interruptor de salida de registros internos del SDK para Android:

    PersistentNet.getInstance().openLog(true);
    ALog.setLevel(ALog.LEVEL_DEBUG);
       
  • Obtención del número de versión del SDK para Android:

    ALog.i(TAG, "sdk version = " + LinkKit.getInstance().getSDKVersion());

Reconectar rápidamente un dispositivo Android

Si el SDK para Android desconecta un dispositivo de IoT Platform, este se reconecta automáticamente después de 65 segundos. Si desea reconectar el dispositivo tras un intervalo personalizado después de la desconexión, siga estos pasos:

  • Especifique import com.aliyun.alink.linksdk.channel.core.persistent.PersistentNet; y llame a la función PersistentNet.getInstance().reconnect();.

  • Si desea especificar un intervalo de reconexión personalizado, inicie un temporizador. Cuando finalice, llame a la función PersistentNet.getInstance().reconnect(); para restablecer en tiempo real una conexión MQTT cerrada.

Notas de uso del paquete de demostración

  • Si falla la inicialización de un dispositivo, debe reinicializar el SDK. Si un dispositivo se desconecta de IoT Platform por causas específicas, como fallos de red, el SDK lo reconecta automáticamente.

  • Modifique los parámetros necesarios del archivo ./app/src/main/res/raw/deviceinfo en demo package of Link SDK for Android para conectar un dispositivo a IoT Platform. Configure los parámetros marcados como obligatorios y utilice los valores predeterminados para los marcados como opcionales. La siguiente tabla describe los parámetros.

  • Parámetro

    Descripción

    Verificación de certificado único por dispositivo

    Verificación de certificado único por producto con pre-registro

    Verificación de certificado único por producto sin pre-registro

    productKey

    El identificador único emitido por IoT Platform para el producto.

    Obligatorio

    Obligatorio

    Obligatorio

    deviceName

    El identificador único del dispositivo dentro del producto.

    Obligatorio

    Obligatorio

    Obligatorio

    productSecret

    El ProductSecret del producto.

    Opcional

    Obligatorio

    Obligatorio

    deviceSecret

    El DeviceSecret del dispositivo.

    Obligatorio

    Opcional

    Opcional

    registerType

    La verificación de certificado único por producto sin pre-registro o con pre-registro.

    Opcional

    Opcional

    Obligatorio. Establezca el valor en regnwl.

    instanceId

    El ID de la instancia. Las instancias Enterprise Edition y las instancias públicas de la nueva versión tienen IDs de instancia. Para obtener más información, consulte Overview of IoT Platform instances.

    Opcional

    Obligatorio

    Obligatorio

    mqttHost

    El endpoint que utiliza un dispositivo para conectarse a la instancia de IoT Platform mediante MQTT.

    Obligatorio, excepto para instancias en la región China (Shanghai). Debe especificar el nombre de dominio y el número de puerto en el endpoint según su región real.

    • Si conecta un dispositivo a una instancia pública de la nueva versión o a una instancia Enterprise Edition, vaya a la página Instance Details en la consola de IoT Platform y copie el número de puerto que aparece. Formato: {instanceid}.mqtt.iothub.aliyuncs.com:8883

    • Si conecta un dispositivo a una instancia pública de la versión anterior, no se muestra ningún número de puerto en la página Instance Details de la consola de IoT Platform. Debe especificar un número de puerto para el endpoint que copió de la página. Formato:

      {YourProductKey}.iot-as-mqtt.{region}.aliyuncs.com:8883. Para obtener más información, consulte View the endpoint of an instance.