本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CoreMQTT 双向身份验证演示
此演示托管在 Amazon-FreeRTOS 存储库中,该存储库已过时。建议您在创建新项目时从此处开始。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的现有 FreeRTOS 项目,请参阅亚马逊 FreeRTOS Github 存储库迁移指南。
介绍
CoreMQTT 双向身份验证演示项目向您展示了如何使用 TLS 与 MQTT 代理建立连接,并在客户端和服务器之间进行双向身份验证。此演示使用基于 mbedTLS 的传输接口实现来建立服务器和经过客户端身份验证的 TLS 连接,并演示了 Q oS 1
要设置和运行 FreeRTOS 演示,请按照中的步骤操作FreeRTOS 入门。
源代码
演示源文件已命名mqtt_demo_mutual_auth.c
,可以在
目录和 GitHubfreertos
/demos/coreMQTT/
功能
该演示创建了一个单一的应用程序任务,该任务循环浏览了一组示例,这些示例演示了如何连接到代理、订阅代理上的主题、发布有关代理的话题,最后断开与代理的连接。演示应用程序既订阅又发布同一主题。每次演示向 MQTT 经纪人发布消息时,经纪人都会向演示应用程序发送相同的消息。
成功完成演示将显示类似于以下图像的输出。

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

具有指数退避和抖动的重试逻辑
Ret prvBackoffForry 函数显示了如何通过指数级退避和抖动重试
连接到 MQTT 经纪人
该 prvConnectToServerWithBackoffRetriesBackoffAlgorithm_GetNextBackoff
函数提供指数递增的退避值,并在达到最大尝试次数RetryUtilsRetriesExhausted
时返回。如果在配置的尝试次数后无法建立与代理的 TLS 连接,则该prvConnectToServerWithBackoffRetries
函数会返回失败状态。
prvCreateMQTTConnectionWithBrokerFreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c
文件中实现的 TLS 传输接口。请记住,我们正在为经纪人设置保持活动秒数xConnectInfo
。
下一个函数显示如何使用该函数在 MQTT 上下文中设置 TLS 传输接口和时间MQTT_Init
函数。它还显示了如何设置事件回调函数 pointer (prvEventCallback
)。此回调用于报告传入的消息。
订阅 MQTT 主题
prvMQttSubscribeWithBackoffRetriesRETRY_MAX_ATTEMPTS
。
向主题发布
p rvMQttPublishToTopic
接收传入的消息
如前所述,应用程序在连接到代理之前注册一个事件回调函数。该prvMQTTDemoTask
函数调用该MQTT_ProcessLoop
函数以接收传入消息。当收到传入的 MQTT 消息时,它会调用应用程序注册的事件回调函数。该 prvEventCallbackprvEventCallback
检查传入的数据包类型并调用相应的处理程序。在下面的示例中,该函数要么调prvMQTTProcessIncomingPublish()
用处理传入的发布消息,prvMQTTProcessResponse()
要么调用处理确认 (ACK)。
处理传入的 MQTT 发布数据包
prvMQttProcessIncomingPublish
取消订阅主题
工作流程的最后一步是取消订阅该主题,这样经纪人就不会从中发送任何已发布的消息mqttexampleTOPIC
。以下是函数 prvMQtt
更改演示中使用的根 CA
默认情况下,FreeRTOS 演示使用 Amazon Root CA 1 证书(RSA 2048 位密钥)向Amazon IoT Core服务器进行身份验证。可以使用其他 CA 证书进行服务器身份验证,包括 Amazon Root CA 3 证书(ECC 256 位密钥)。要更改 CoreMQTT 双向身份验证演示的根 CA,请执行以下操作:
-
在文本编辑器中,打开
文件。freertos
/vendors/vendor
/boards/board
/aws_demos/config_files/mqtt_demo_mutual_auth_config.h -
在文件中,找到以下行。
* #define democonfigROOT_CA_PEM "...insert here..."
取消注释此行,如有必要,将其移到注释块的末尾
*/
。 -
复制要使用的 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"
-
(可选)您可以更改其他演示的根 CA。对每个
文件重复步骤 1 到 3。freertos
/vendors/vendor
/boards/board
/aws_demos/config_files/demo-name
_config.h