Demostración de la autenticación mutua de coreMQTT - Gratis RTOS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Demostración de la autenticación mutua de coreMQTT

importante

Esta demostración está alojada en el repositorio de Amazon-FreeRTOS, que está en desuso. Recomendamos empezar por aquí al crear un nuevo proyecto. Si ya tiene un proyecto FreeRTOS existente basado en el repositorio Amazon FreeRTOS, ahora obsoleto, consulte Guía de migración del repositorio Github de Amazon-FreeRTOS.

Introducción

El proyecto de demostración de autenticación mutua de coreHTTP muestra cómo establecer una conexión con un agente HTTP mediante TLS con autenticación mutua entre el cliente y el servidor. Esta demostración utiliza una implementación de interfaz de transporte basada en mbedTLS para establecer una conexión TLS autenticada por el servidor y el cliente, y muestra el flujo de trabajo de suscripción-publicación de MQTT en el nivel de QoS 1. Se suscribe a un filtro de temas, luego publica los temas que coinciden con el filtro y espera a que el servidor reciba esos mensajes en el nivel de QoS 1. Este ciclo de publicación en el agente y recepción del mismo mensaje por parte del agente se repite indefinidamente. Los mensajes de esta demostración se envían en QoS 1, lo que garantiza al menos una entrega de acuerdo con la especificación MQTT.

nota

Para configurar y ejecutar las demostraciones de FreeRTOS, sigue los pasos que se indican en Introducción a FreeRTOS.

Código fuente

El archivo fuente de la demostración se llama mqtt_demo_mutual_auth.c y se puede encontrar en el directorio freertos/demos/coreMQTT/ y en el sitio web de GitHub.

Funcionalidad

La demostración crea una única tarea de aplicación que recorre un conjunto de ejemplos que muestran cómo conectarse al agente, suscribirse a un tema en el agente, publicar en un tema en el agente y, por último, desconectarse del agente. La aplicación de demostración se suscribe y publica en el mismo tema. Cada vez que la demostración publica un mensaje en el agente de MQTT, este envía el mismo mensaje a la aplicación de demostración.

Si se completa correctamente la demostración, se generará una salida similar a la de la siguiente imagen.

Salida del terminal de demostración MQTT tras una finalización correcta

La consola de AWS IoT generará una salida similar a la de la siguiente imagen.

Salida de la consola de demostración MQTT tras una finalización correcta

Reintento de la lógica con retroceso exponencial y fluctuación

La función prvBackOffForRetry muestra cómo se pueden reintentar las operaciones de red fallidas con el servidor, por ejemplo, las conexiones TLS o las solicitudes de suscripción a MQTT, con retrocesos exponenciales y fluctuaciones. La función calcula el período de retroceso para el siguiente reintento y realiza el retroceso si no se han agotado los reintentos. Como el cálculo del período de retroceso requiere la generación de un número aleatorio, la función utiliza el módulo PKCS11 para generar el número aleatorio. El uso del módulo PKCS11 permite acceder a un generador de números aleatorios verdaderos (TRNG) si la plataforma del proveedor lo admite. Le recomendamos que añada al generador de números aleatorios una fuente de entropía específica del dispositivo para reducir la probabilidad de colisiones entre los dispositivos durante los reintentos de conexión.

Conexión al agente de MQTT

La función prvConnectToServerWithBackOffreTries intenta establecer una conexión TLS con autenticación mutua con el agente de MQTT. Si la conexión falla, se vuelve a intentar tras un período de retroceso. El valor de retroceso aumenta exponencialmente hasta que se alcanza el número máximo de intentos o se alcanza el valor de período de retroceso máximo. La función BackoffAlgorithm_GetNextBackoff proporciona un valor de retroceso que aumenta exponencialmente y devuelve RetryUtilsRetriesExhausted cuando se alcanza el número máximo de intentos. La función prvConnectToServerWithBackoffRetries devuelve un estado de error si no se puede establecer la conexión TLS con el agente tras el número de intentos configurado.

La función prvCreateMQttConnectionWithBroker muestra cómo establecer una conexión MQTT con un agente de MQTT con una sesión limpia. Utiliza la interfaz de transporte TLS, que está implementada en el archivo FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c. Tenga en cuenta que estamos configurando los segundos de permanencia activa para el agente . xConnectInfo

La siguiente función muestra cómo se configuran la interfaz de transporte TLS y la función de tiempo en un contexto MQTT mediante la función MQTT_Init. También muestra cómo se configura un puntero de la función de devolución de llamada de eventos (prvEventCallback). Esta devolución de llamada se utiliza notificar los mensajes entrantes.

Suscripción a un tema de MQTT

La función prvMQTTSubscribeWithBackoffRetries muestra cómo suscribirse a un filtro de temas en el agente de MQTT. El ejemplo muestra cómo suscribirse a un filtro de temas, pero es posible transferir una lista de filtros de temas en la misma llamada a la API de suscripción para suscribirse a más de un filtro de temas. Además, en caso de que el agente de MQTT rechace la solicitud de suscripción, la suscripción volverá a intentarlo, con un retroceso exponencial, durante el valor establecido en RETRY_MAX_ATTEMPTS.

Publicación de un tema

La función prvMQTTPublishToTopic muestra cómo publicar en un tema en el agente de MQTT.

Recepción de mensajes entrantes

La aplicación registra una función de devolución de llamada de eventos antes de conectarse al agente, tal y como se ha descrito anteriormente. La función prvMQTTDemoTask llama a la función MQTT_ProcessLoop para recibir los mensajes entrantes. Cuando se recibe un mensaje MQTT entrante, llama a la función de devolución de llamada del evento registrada por la aplicación. La función prvEventCallback es un ejemplo de dicha función de devolución de llamada de eventos. prvEventCallback examina el tipo de paquete entrante y llama al controlador correspondiente. En el ejemplo siguiente, la función llama a prvMQTTProcessIncomingPublish() para gestionar los mensajes de publicación entrantes o a prvMQTTProcessResponse() para gestionar los acuses de recibo (ACK).

Proceso de paquetes de publicación MQTT entrantes

La función prvMQTTProcessIncomingPublish muestra cómo procesar un paquete de publicación del agente de MQTT.

Cancelación de la suscripción a un tema

El último paso del flujo de trabajo consiste en cancelar la suscripción al tema para que el agente no envíe ningún mensaje publicado desde mqttexampleTOPIC. Esta es la definición de la función prvMQTTUnsubscribeFromTopic.

Cambio de la CA raíz utilizada en la demostración

De forma predeterminada, las demostraciones de FreeRTOS utilizan el certificado CA raíz 1 de Amazon (clave RSA de 2048 bits) para autenticarse en el servidor de AWS IoT Core. Es posible utilizar otros certificados CA para la autenticación del servidor, incluido el certificado CA raíz 3 de Amazon (clave ECC de 256 bits). Para cambiar la CA raíz de la demostración de autenticación mutua coreMQTT:

  1. Abra el archivo freertos/vendors/vendor/boards/board/aws_demos/config_files/mqtt_demo_mutual_auth_config.h en un editor de texto.

  2. En el archivo, localice la línea siguiente.

    * #define democonfigROOT_CA_PEM "...insert here..."

    Elimine el comentario de esta línea y, si es necesario, muévala más allá del extremo del bloque de comentarios */.

  3. Copie el certificado CA que desee utilizar y péguelo en el texto "...insert here...". El resultado debe ser similar al siguiente ejemplo:

    #define democonfigROOT_CA_PEM "-----BEGIN CERTIFICATE-----\n"\ "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\ "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\ "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\ "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\ "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\ "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\ "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\ "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\ "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\ "YyRIHN8wfdVoOw==\n"\ "-----END CERTIFICATE-----\n"
  4. (Opcional) Puede cambiar la CA raíz para otras demostraciones. Repita los pasos 1 a 3 para cada archivo freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h.