Este tema describe cómo conectar un cliente Advanced Message Queuing Protocol (AMQP) a IoT Platform. Esta operación se realiza después de configurar una suscripción del lado del servidor AMQP en la consola de IoT Platform. Una vez conectado el cliente AMQP a IoT Platform, podrá recibir mensajes de dispositivo mediante el cliente AMQP en su servidor empresarial.
Límites
Las suscripciones del lado del servidor de IoT Platform admiten únicamente el protocolo AMQP 1.0.
Conexión a IoT Platform
-
Un cliente AMQP establece una conexión TCP con IoT Platform mediante un saludo de tres vías. Posteriormente, se ejecuta un saludo TLS para autenticar al cliente AMQP.
NotaPara garantizar la seguridad, los clientes AMQP deben transmitir datos mediante cifrado TLS. No es posible transmitir datos a través de canales TCP sin cifrar.
-
El cliente solicita establecer una conexión.
Se utiliza el mecanismo PLAIN SASL para autenticar la conexión. La autenticación se basa en un nombre de usuario y una contraseña. Una vez que IoT Platform valida correctamente las credenciales, se establece la conexión.
Según el protocolo AMQP, el cliente debe agregar el campo idle-time-out al marco de apertura al establecer la conexión. Este campo especifica el periodo de tiempo de espera del latido. El rango permitido es de 30,000 ms a 300,000 ms. Si no se transmite ningún marco a través de la conexión tras expirar este periodo, IoT Platform cierra la conexión. El método para configurar el campo idle-time-out varía según el lenguaje de programación del SDK. Para más información, consulte el código de ejemplo de los SDK específicos por lenguaje.
-
El cliente envía una solicitud a IoT Platform para establecer un enlace receptor. Este enlace es un canal unidireccional que permite enviar datos desde IoT Platform hacia el cliente.
El cliente debe establecer el enlace receptor dentro de los 15 segundos posteriores al establecimiento de la conexión AMQP. De lo contrario, IoT Platform cerrará la conexión AMQP.
Una vez establecido el enlace receptor, el cliente queda conectado a IoT Platform.
NotaSolo se puede crear un enlace receptor por cada conexión. Los enlaces emisores no son compatibles. IoT Platform puede enviar mensajes al cliente, pero el cliente no puede enviar mensajes a IoT Platform.
El nombre de clase del enlace receptor varía según el lenguaje de programación del SDK. Por ejemplo, en algunos SDK el enlace receptor se denomina MessageConsumer.
Configuración de la conexión
Esta sección describe cómo especificar el endpoint y configurar los parámetros de autenticación al conectar un cliente AMQP a IoT Platform.
Endpoint y puerto
Especifique el endpoint de una instancia pública o de una instancia Enterprise Edition a la que desee conectar un cliente AMQP. Para más información sobre los endpoints compatibles, consulte Manage instance endpoints.
La variable ${YourHost} en el SDK especifica el endpoint.
Antes de conectar el cliente a una instancia de IoT Platform, asegúrese de que su producto y dispositivo estén creados en dicha instancia.
Si utiliza un cliente Java, .NET, Python 2.7, Node.js o Go, el número de puerto es 5671.
Si utiliza un cliente Python 3 o PHP, el número de puerto es 61614.
Parámetros de autenticación
Los parámetros de autenticación que debe configurar varían según la identidad de Alibaba Cloud que utilice para conectar un cliente AMQP a IoT Platform.
-
Si utiliza la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform o un usuario de Resource Access Management (RAM) con los permisos necesarios otorgados directamente dentro de dicha cuenta, debe configurar los siguientes parámetros de autenticación:
NotaSi utiliza un usuario RAM, debe adjuntarle una política de RAM que contenga la acción iot:sub. Esto permite que el usuario RAM utilice la función de suscripción del lado del servidor de IoT Platform. De lo contrario, la conexión fallará. Para más información, consulte RAM authorization for IoT Platform.
Para mejorar la seguridad de los datos, se recomienda utilizar un rol de RAM para autorizar al usuario RAM a usar la función de suscripción del lado del servidor. Para más información, consulte la siguiente sección.
userName = clientId|iotInstanceId=${iotInstanceId},authMode=aksign,signMethod=hmacsha1,consumerGroupId=${consumerGroupId},authId=${accessKey},timestamp=1573489088171| password = signMethod(stringToSign, accessSecret) -
Si utiliza un usuario RAM autorizado mediante un rol de RAM, debe configurar los siguientes parámetros de autenticación:
NotaAdemás de los usuarios RAM de la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform, puede utilizar un rol de RAM para autorizar a un usuario RAM de otra cuenta de Alibaba Cloud a usar la función de suscripción del lado del servidor. Para más información sobre cómo usar un rol de RAM para autorizar a un usuario RAM a utilizar esta función en IoT Platform, consulte Authorize a RAM user of the current Alibaba Cloud account to use server-side subscription y Authorize a RAM user of another account to use server-side subscription.
userName = clientId|iotInstanceId=${iotInstanceId},authMode=ststoken,securityToken=${SecurityToken},signMethod=hmacsha1,consumerGroupId=${consumerGroupId},authId=${accessKey},timestamp=1573489088171| password = signMethod(stringToSign, accessSecret)Tabla 1. Parámetros en userName
Parámetro
Obligatorio
Descripción
clientId
Sí
El ID del cliente. Debe especificar un ID personalizado. La longitud debe ser de 1 a 64 caracteres. Se recomienda utilizar un identificador único como ID del cliente, como el UUID, la dirección MAC o la dirección IP del servidor donde se ejecuta el cliente.
Una vez que el cliente AMQP esté conectado e iniciado en IoT Platform, siga estos pasos para consultar los detalles del cliente: Inicie sesión en la consola de IoT Platform y haga clic en la tarjeta de la instancia que desea gestionar. En el panel de navegación izquierdo, elija . En la pestaña Consumer Groups, busque el grupo de consumidores que desea gestionar y haga clic en View en la columna Actions. El ID de cada cliente se muestra en la pestaña Consumer Group Status. Puede utilizar los ID de cliente para identificar fácilmente a cada cliente.
iotInstanceId
No
El ID de la instancia de IoT Platform. Puede consultar el ID de la instancia en la pestaña Overview de la consola de IoT Platform.
Si se muestra el ID de la instancia, debe establecer este parámetro con dicho ID.
Si no se muestra la pestaña Overview o su instancia no tiene un ID, no es necesario especificar este parámetro.
authMode
Sí
El modo de autenticación.
Si utiliza la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform o un usuario RAM con los permisos necesarios otorgados directamente dentro de dicha cuenta, use el modo
aksign.Si utiliza un usuario RAM autorizado mediante un rol de RAM, use el modo
ststoken.
securityToken
No
ImportanteEste parámetro es obligatorio solo si utiliza un usuario RAM autorizado mediante un rol de RAM para conectar el cliente AMQP a IoT Platform.
El token de Security Token Service (STS) asignado al usuario RAM que asume el rol de RAM. Puede llamar a la operación AssumeRole para obtener el token STS. Para más información, consulte AssumeRole.
signMethod
Sí
El algoritmo de firma. Valores válidos:
hmacmd5,hmacsha1yhmacsha256.consumerGroupId
Sí
El ID del grupo de consumidores de la instancia de IoT Platform.
Para consultar el ID del grupo de consumidores, siga estos pasos: Inicie sesión en la consola de IoT Platform y haga clic en la tarjeta de la instancia que desea gestionar. En el panel de navegación izquierdo, elija . El ID del grupo de consumidores se muestra en la pestaña Consumer Groups.
authId
Sí
La información de autenticación.
Si utiliza la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform o un usuario RAM con los permisos necesarios otorgados directamente dentro de dicha cuenta:
Establezca este parámetro con el AccessKey ID de la cuenta de Alibaba Cloud o el AccessKey ID del usuario RAM.
Inicie sesión en la consola de IoT Platform, pase el puntero sobre su foto de perfil y luego haga clic en AccessKey Management. En la página que aparece, obtenga el AccessKey ID.
Si utiliza un usuario RAM autorizado mediante un rol de RAM:
Establezca este parámetro con el AccessKey ID del usuario RAM que asume el rol de RAM.
timestamp
Sí
La hora actual. La marca de tiempo es un entero LONG. Unidad: milisegundo.
Tabla 2. Parámetros en password
Parámetro
Obligatorio
Descripción
signMethod
Sí
El algoritmo de firma. Utilice el algoritmo de firma especificado en el parámetro userName para calcular el valor de la firma. Luego, convierta el valor en una cadena codificada en Base64.
stringToSign
Sí
La cadena para firmar.
Ordene los parámetros que deben firmarse alfabéticamente. Concatene la clave y el valor de cada parámetro mediante un signo igual (=). Concatene los parámetros mediante un ampersand (&).
Si utiliza la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform o un usuario RAM con los permisos necesarios otorgados directamente dentro de dicha cuenta:
Los parámetros que deben firmarse incluyen
authIdytimestamp.Establezca el valor con el formato
stringToSign = authId=${accessKey}×tamp=1573489088171.Si utiliza un usuario RAM autorizado mediante un rol de RAM:
Los parámetros que deben firmarse incluyen
securityToken,authIdytimestamp.Establezca el valor con el formato
stringToSign = authId=${accessKey}&securityToken=${SecurityToken}×tamp=1573489088171.
accessSecret
Sí
Si utiliza la cuenta de Alibaba Cloud propietaria de la instancia de IoT Platform o un usuario RAM con los permisos necesarios otorgados directamente dentro de dicha cuenta:
Establezca este parámetro con el AccessKey secret de la cuenta de Alibaba Cloud o el AccessKey secret del usuario RAM.
Inicie sesión en la consola de IoT Platform, pase el puntero sobre su foto de perfil y luego haga clic en AccessKey Management. En la página que aparece, obtenga el AccessKey secret.
Si utiliza un usuario RAM autorizado mediante un rol de RAM:
Establezca este parámetro con el AccessKey secret del usuario RAM que asume el rol de RAM.
Recepción de mensajes enviados por IoT Platform
Una vez establecido un enlace receptor entre un cliente AMQP e IoT Platform, la plataforma envía mensajes al cliente a través de dicho enlace.
Un cliente solo puede recibir mensajes de los tipos especificados en la suscripción. Si desea enviar mensajes o comandos a un dispositivo, llame a la operación correspondiente según sus necesidades empresariales. Para más información, consulte API list.
Cada mensaje enviado por IoT Platform al cliente consta de las siguientes partes:
Cuerpo del mensaje. La carga útil del mensaje está en formato binario.
-
Atributos del mensaje, como el tema y el ID del mensaje. Puede obtener los atributos de la sección application-properties definida en AMQP. Los atributos tienen el formato
key:value.Clave
Descripción
topic
El tema del mensaje.
messageId
El ID del mensaje.
generateTime
La hora en que se generó el mensaje.
NotaNo es posible determinar el orden de los mensajes basándose en el parámetro generateTime.
Acuse de recibo del mensaje:
El cliente AMQP envía un acuse de recibo a IoT Platform para notificar que se recibió un mensaje. El acuse puede enviarse manual o automáticamente. Se recomienda utilizar el modo automático. Para más información, consulte la guía de usuario del cliente.
Políticas de mensajería:
Los mensajes se envían en tiempo real.
-
Acumulación de mensajes.
Los mensajes no consumidos en tiempo real se agregan a una cola de acumulación. Esto ocurre si un cliente consumidor está desconectado o consume mensajes lentamente.
Cuando el cliente consumidor vuelve a conectarse y reanuda un consumo estable, IoT Platform reintenta el envío de los mensajes acumulados.
Si el cliente no logra consumir un mensaje reintentado, la cola de acumulación podría bloquearse. En ese caso, IoT Platform reintenta el envío del mensaje al cliente con un intervalo aproximado de un minuto.
El volumen de tráfico procesado por los consumidores puede fluctuar durante periodos cortos. Por lo general, esta fluctuación desaparece en menos de 10 minutos. Si el número de consultas por segundo (QPS) es alto o el procesamiento de mensajes consume muchos recursos, se recomienda aumentar el número de consumidores. Esto permite mantener un nivel aceptable de redundancia en el consumo de mensajes.
Cuando IoT Platform reenvía un mensaje, este puede enviarse repetidamente hasta que el cliente devuelva un mensaje ACK o el mensaje expire. Si varios mensajes utilizan el mismo ID de mensaje, puede deduplicarlos basándose en dicho ID.
Para más información sobre los límites de mensajería, consulte Limits on server-side subscriptions.
Puede borrar los mensajes acumulados en la consola de IoT Platform. Para más información, consulte la sección View and monitor consumer groups del tema "Gestión de grupos de consumidores".
Orden de los mensajes:
No se garantiza el orden de los mensajes. Por lo tanto, es posible que no se reciban en el mismo orden en que fueron generados.
-
Mensajes de dispositivo ascendentes y descendentes:
Los mensajes no se ordenan por hora de conexión/desconexión. Ordénelos según el valor de time.
Por ejemplo, si recibe secuencialmente los siguientes tres mensajes:
Conexión:
2018-08-31 10:02:28.195.Desconexión:
2018-08-31 10:01:28.195.Desconexión:
2018-08-31 10:03:28.195.
Estos tres mensajes indican que el dispositivo se desconectó, se conectó nuevamente y volvió a desconectarse.
Para más información sobre los parámetros en los mensajes, consulte Data formats.
-
Otros tipos de mensajes:
Debe agregar un número de secuencia a cada mensaje en la capa de aplicación. Con base en el número de secuencia de un mensaje recibido, IoT Platform utiliza un algoritmo idempotente para comprobar si el mensaje necesita procesarse.
Ejemplos
Puede utilizar uno de los siguientes SDK AMQP específicos por lenguaje de programación para conectar un cliente a IoT Platform. Para más información sobre cómo configurar los parámetros, consulte la sección Connection settings de este tema.
Se recomienda utilizar los SDK AMQP proporcionados por IoT Platform. Alibaba Cloud no ofrece soporte técnico para SDK AMQP desarrollados por terceros.
Al conectar un cliente a IoT Platform, podría recibir códigos de error relacionados con mensajes. Para más información, consulte la sección Error codes that are related to messages del tema "Registros de IoT Platform".