CoreMQTT 双向身份验证演示 - FreeRTOS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

CoreMQTT 双向身份验证演示

介绍

CoreMQTT 相互身份验证演示项目向您展示了如何使用 TLS 与 MQTT 经纪商建立连接,并在客户端和服务器之间进行相互身份验证。本演示使用基于 mbedTLS 的传输接口实现来建立服务器和客户端身份验证的 TLS 连接,并演示了 MQTT 的订阅-发布工作流程QoS 1级别。它订阅了主题筛选器,然后发布到与筛选器匹配的主题,并等待从服务器接收 QoS 1 级别的消息。向经纪商发布并从经纪商那里接收相同消息的这种循环将无限期重复。本演示中的消息在 QoS 1 发送,根据 MQTT 规范,保证至少有一次传递。

注意

要设置和运行 FreeRTOS 演示,请按照中的步骤操作入门.

源代码

演示源文件名为mqtt_demo_mutual_auth.c并且可以在freertos/demos/coreMQTT/目录和GitHub网站。

功能

该演示创建了一个单一的应用程序任务,该任务遍历一组示例,演示如何连接经纪商、订阅经纪商的主题、在经纪商上发布主题,然后最后断开与经纪商的连接。演示应用程序既订阅了同一主题又发布到同一主题。每次演示向 MQTT 经纪商发布消息时,经纪商都会向演示应用程序发送相同的消息。

成功完成演示将生成与下图类似的输出。


                    成功完成后 MQTT 演示终端输出

这些区域有:Amazon IoT控制台将生成与下图类似的输出。


                    成功完成后 MQTT 演示控制台输出

使用指数退避和抖动重试逻辑

这些区域有:prvBackoff 进行重试函数显示了如何通过指数退避和抖动重试服务器的失败网络操作,例如 TLS 连接或 MQTT 订阅请求。该函数计算下一次重试尝试的退避期,如果重试尝试尚未用尽,则执行退避延迟。由于退避期的计算需要生成一个随机数,因此该函数使用 PKCS11 模块生成随机数。如果供应商平台支持,使用 PKCS11 模块可以访问真随机数生成器 (TRNG)。我们建议您使用特定于设备的熵源为随机数生成器种子,以便减少连接重试期间设备发生冲突的可能性。

连接到 MQTT 代理

这些区域有:PRV 连接到具有退避重试次数的服务器函数尝试与 MQTT 代理建立相互身份验证的 TLS 连接。如果连接失败,它会在退避期后重试。退避期将呈指数级增加,直到达到最大尝试次数或达到最大退避期。这些区域有:BackoffAlgorithm_GetNextBackoff函数提供了指数级增加的退避值和返回RetryUtilsRetriesExhausted当达到最大尝试次数时。这些区域有:prvConnectToServerWithBackoffRetries如果在配置的尝试次数之后无法建立与代理的 TLS 连接,则函数返回失败状态。

这些区域有:prvCreateMqttt 与经纪商的连接函数演示了如何使用干净的会话建立与 MQTT 经纪商的 MQTT 连接。它使用 TLS 传输接口,该接口在FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c文件。请记住,我们正在为经纪商设置保持活动秒xConnectInfo.

下一个函数显示 TLS 传输接口和时间函数是如何在 MQTT 上下文中使用MQTT_Initfunction. 它还显示了事件回调函数指针如何 (prvEventCallback) 已设置。此回调用于报告传入的消息。

订阅 MQTT 主题

这些区域有:prvmqttt 使用退避重试订阅函数演示了如何在 MQTT 代理上订阅主题筛选条件。该示例演示了如何订阅一个主题过滤器,但是可以在同一个订阅 API 调用中传递主题筛选器列表来订阅多个主题筛选器。此外,如果 MQTT 经纪商拒绝了订阅请求,订阅将重试,并且指数退避RETRY_MAX_ATTEMPTS.

向主题发布

这些区域有:prvMQTT 发布到主题函数演示了如何在 MQTT 经纪商上发布主题。

接收传入消息

如前所述,应用程序在连接到代理之前注册事件回调函数。这些区域有:prvMQTTDemoTask函数调用MQTT_ProcessLoop函数来接收传入的消息。当收到传入的 MQTT 消息时,它会调用应用程序注册的事件回调函数。这些区域有:prvEventCallback函数就是这种事件回调函数的一个例子。prvEventCallback检查传入的数据包类型并调用适当的处理程序。在以下示例中,函数要么调用prvMQTTProcessIncomingPublish()用于处理传入的发布消息或prvMQTTProcessResponse()来处理确认 (ACK)。

处理传入的 MQTT 发布数据包

这些区域有:prvMQTT 进程传入发布函数演示了如何处理来自 MQTT 代理的发布数据包。

取消订阅主题

工作流程的最后一步是取消订阅该主题,这样经纪商就不会从发送任何已发布的消息mqttexampleTOPIC. 这是函数的定义prvmqtTune 从主题订阅.

更改演示中使用的根 CA

默认情况下,FreeRTOS 演示使用亚马逊根 CA 1 证书(RSA 2048 位密钥)通过Amazon IoT Core服务器。可以使用其他用于服务器身份验证的 CA 证书包括 Amazon Root CA 3 证书(ECC 256 位密钥)。要更改 CoreMQTT 相互身份验证演示的根 CA,请执行以下操作:

  1. 在文本编辑器中,打开 freertos/vendors/vendor/boards/board/aws_demos/config_files/mqtt_demo_mutual_auth_config.h 文件。

  2. 在文件中,找到以下行。

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

    取消注释此行,如有必要,将其移到评论块末尾 */.

  3. 复制要使用的 CA 证书,然后将其粘贴到"...insert here..."文本。结果应该类似以下示例。

    #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. (可选)您可以更改其他演示的根 CA。为每个重复步骤 1 到 3freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h文件。