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

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

CoreMQTT 双向身份验证演示

重要

此演示托管在 Amazon-FreeRTOS 存储库中,该存储库已过时。建议您在创建新项目时从此处开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的现有 FreeRTOS 项目,请参阅亚马逊 FreeRTOS Github 存储库迁移指南

介绍

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

注意

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

源代码

演示源文件已命名mqtt_demo_mutual_auth.c,可以在freertos/demos/coreMQTT/目录和 GitHub网站上找到。

功能

该演示创建了一个单一的应用程序任务,该任务循环浏览了一组示例,这些示例演示了如何连接到代理、订阅代理上的主题、发布有关代理的话题,最后断开与代理的连接。演示应用程序既订阅又发布同一主题。每次演示向 MQTT 经纪人发布消息时,经纪人都会向演示应用程序发送相同的消息。

成功完成演示将显示类似于以下图像的输出。


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

Amazon IoT控制台将生成类似于以下图像的输出。


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

具有指数退避和抖动的重试逻辑

Ret prvBackoffForry 函数显示了如何通过指数级退避和抖动重试失败的服务器网络操作,例如 TLS 连接或 MQTT 订阅请求。该函数计算下一次重试的退避期限,如果重试尝试尚未用尽,则执行退避延迟。由于计算退避周期需要生成随机数,因此该函数使用 PKCS11 模块生成随机数。如果供应商平台支持 PKCS11 模块,则允许访问真随机数生成器 (TRNG)。我们建议您在随机数生成器中加入设备特定的熵源,这样可以降低连接重试期间设备发生冲突的可能性。

连接到 MQTT 经纪人

prvConnectToServerWithBackoffRetries函数尝试与 MQTT 代理建立相互身份验证的 TLS 连接。如果连接失败,它将在退避期后重试。退避期将呈指数级增长,直到达到最大尝试次数或达到最大退避期限。该BackoffAlgorithm_GetNextBackoff函数提供指数递增的退避值,并在达到最大尝试次数RetryUtilsRetriesExhausted时返回。如果在配置的尝试次数后无法建立与代理的 TLS 连接,则该prvConnectToServerWithBackoffRetries函数会返回失败状态。

prvCreateMQTTConnectionWithBroker 函数演示了如何使用干净的会话建立与 MQTT 代理的 MQTT 连接。它使用在FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c文件中实现的 TLS 传输接口。请记住,我们正在为经纪人设置保持活动秒数xConnectInfo

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

订阅 MQTT 主题

prvMQttSubscribeWithBackoffRetries 函数演示了如何在 MQTT 代理上订阅主题过滤器。该示例演示了如何订阅一个主题过滤器,但是可以在同一个订阅 API 调用中传递主题过滤器列表来订阅多个主题过滤器。此外,如果 MQTT 经纪人拒绝订阅请求,则将重试订阅,并以指数级退避的形式进行RETRY_MAX_ATTEMPTS

向主题发布

p rvMQttPublishToTopic 函数演示了如何在 MQTT 代理上发布话题。

接收传入的消息

如前所述,应用程序在连接到代理之前注册一个事件回调函数。该prvMQTTDemoTask函数调用该MQTT_ProcessLoop函数以接收传入消息。当收到传入的 MQTT 消息时,它会调用应用程序注册的事件回调函数。该 prvEventCallback函数是此类事件回调函数的示例。 prvEventCallback检查传入的数据包类型并调用相应的处理程序。在下面的示例中,该函数要么调prvMQTTProcessIncomingPublish()用处理传入的发布消息,prvMQTTProcessResponse()要么调用处理确认 (ACK)。

处理传入的 MQTT 发布数据包

prvMQttProcessIncomingPublish 函数演示了如何处理来自 MQTT 代理的发布数据包。

取消订阅主题

工作流程的最后一步是取消订阅该主题,这样经纪人就不会从中发送任何已发布的消息mqttexampleTOPIC。以下是函数 prvMQtt 的定义UnsubscribeFromTopic。

更改演示中使用的根 CA

默认情况下,FreeRTOS 演示使用 Amazon Root 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。对每个freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h文件重复步骤 1 到 3。