本帖最后由 ArterySW 于 2023-10-30 19:27 编辑
AT32基于FreeRTOS的AWS MQTT客户端 前言
消息队列传输(Message Queuing Telemetry Transport, 后续直接使用 MQTT代称 )是 ISO标准下基于发布 / 订阅规范的讯息协议,可视为信息传递的桥梁。 本应用笔记使用 AT32开发板,建立一个MQTT客户端与 AWS IoT Core进行通讯,用户可以基于这个范例去开发属于自己的应用。
支持型号 列表:
AT32F407xx
AT32F437xx
1 MQTT概述
MQTT的基本通讯方式,就是订阅跟发布。订阅就是不断地聆听是否有符合MQTT格式的封包传入,这个封包会以JSON的格式封装,倘若数据未以JSON格式封装,则订阅端会无法正确解析出内容;发布则是以JSON的格式将主题及内容封装之后发给整个MQTT内的实体,有订阅该主题的实体在收到封包之后就会解析其内容。MQTT的通讯拓扑示意如图1。
本应用笔记将与AWS IoT Core通讯,AWS作为MQTT Broker,所有的通讯内容必须以TLS加密传输,因此客户端必须导入AWS提供的凭证及私钥方能正确加解密数据。
图1. MQTT通讯 拓扑 示意
2 MQTT客户端
2.1 功能简介
本范例程序需要使用的主要外设为
EMAC, 基于 FreeRTOS, LwIP及 mbedTLS实现一个 MQTT客户
端, MQTT的核心部份使用第三方套件,基本上不需要修改 MQTT套件的内容,只需要专注在开发
应用层的部份即可。 mbedTLS的套件直接包进范例程序内,用户无须再配置 Run-Time environment内的 component。
2.2 资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
能够连接到因特网的路由器
2) 软件环境
at32f4xx\utilities\demo\mdk_v5
2.3 软件设计
1) 配置流程
配置 EMAC 功能
初始化 LwIP 协议栈
配置私钥及 CA 凭证给客户端
联机到MQTT Broker及初始化订阅任务
初始化发布任务
2) 代码介绍
mqtt_subscrib_thread函数代码描述
void mqtt_subscrib_thread(void *arg)
{
mqtt_client_t *client = NULL;
printf("welcome to mqttclient test...\r\n");
client = mqtt_lease();
mqtt_set_port(client, AWS_IOT_PORT);
#ifndef MQTT_NETWORK_TYPE_NO_TLS
mqtt_set_ca(client, (char*)mbedtls_aws_root_certificate);
#endif
mqtt_set_host(client, AWS_IOT_SERVER);
mqtt_set_client_id(client, AWS_CLIENT_ID);
mqtt_set_user_name(client, "");
mqtt_set_password(client, "");
mqtt_set_clean_session(client, 1);
mqtt_connect(client);
mqtt_subscribe(client, "atk/subscribe", QOS0, topic1_handler);
if(sys_thread_new("mqtt_publish_thread", mqtt_publish_thread, client, MQTT_PUBLISH_STK_SIZE, MQTT_PUBLISH_THREAD_PRIO) == NULL)
{
printf("thread could not be created\r\n");
}
while(1)
{
vTaskDelay(2000);
}
}
在这个函式中,会联机到MQTT Broker, 发起一个联机需要的是目标socket, 也就是IP Address跟port, AWS的IP Address并非固定的一个位置,因此每次发起联机时都需要透过DNS去解析当前的IP为何,在本范例中有实做DNS client, 将domain name传给Google的DNS server进行解析,用户该做的就是将程序代码中的AWS_IOT_SERVER换成自己的端点,这个端点信息可以在AWS IoT控制面板中找到,如图2。
另外联机到AWS的MQTT Broker, 也需要正确的Client ID, 这个Client ID会与你建立的实物名称一致,用户必须根据实际的实物名称填入代码中的AWS_CLIENT_ID, 实际内容也可以在AWS IoT控制台中找到,如图3。
图2. AWS IoT控制台中的端点信息
图3. AWS IoT控制台中的实物名称
客户端虽然发起了联机,但因为AWS使用TLS加密,因此没有正确的凭证及私钥的话,联机会被拒绝,这个凭证跟私钥会在AWS IoT控制台建立实物的时候生成,请将其下载下来,解压缩之后的内容如图4, 红框的部份是需要导入程序代码的内容,请将其打开编辑成C语言可以读取的字符串后,分别复制到nettype_tls.c中的mbedtls_aws_root_certificate, mbedtls_client_certificate和mbedtls_client_key。
图4. 实物通讯所需的凭证及私钥
2.4 配置 AWS IoT上的政策
一般来说在建立实物的时候,就会询问要以哪个政策适用在这个实物上,政策如果没有正确配置的话,MQTT client将会无法联机到MQTT Broker, 因此这边简单提示政策的配置方法,详细内容请参阅AWS的官方文件。
一个MQTT client联机到MQTT Broker, 至少会进行四个动作,分别是Connect, Receive, Subscribe和Publish, 这些动作只有在政策中有被列出的实体才会被允许执行,本应用笔记是直接将对象开放成只要拥有正确的凭证跟私钥的任何实物都可以执行,具体内容请参照图5。
图5. AWS上的政策配置
详细的AWS IoT设定,请参阅官方文件
2.5 实验效果
AWS IoT控制台收到来自MCU端发布主题的内容
图6. MQTT Client发布到 MQTT Broker
AWS IoT控制台发送主题内容到MCU端
图7. MQTT Broker发布到 MQTT Client
图8. MQTT Client收到 MQTT Broker发布的内容后印出
详细内容请参考附件:
AN0192_AWS_MQTT_Client_on_FreeRTOS_V2.0.0
|