打印
[应用相关]

AN0192—AT32基于FreeRTOS的AWS MQTT客户端

[复制链接]
1978|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ArterySW|  楼主 | 2023-10-30 19:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

使用特权

评论回复
沙发
单片小菜| | 2023-11-1 10:13 | 只看该作者
这个是MQTT的哪个版本?

使用特权

评论回复
板凳
lajfda003| | 2023-11-1 11:15 | 只看该作者
这个服务器在哪里申请?

使用特权

评论回复
地板
lajfda001| | 2023-11-2 09:15 | 只看该作者
这个是阿里云吗?

使用特权

评论回复
5
tpgf| | 2023-11-7 15:15 | 只看该作者
请问一下 mqtt存在服务器端吗

使用特权

评论回复
6
木木guainv| | 2023-11-7 15:52 | 只看该作者
MQTT有可能成为物联网的重要组成部分

使用特权

评论回复
7
磨砂| | 2023-11-7 16:55 | 只看该作者
在未来几年,MQTT的应用会越来越广,值得关注

使用特权

评论回复
8
八层楼| | 2023-11-7 19:19 | 只看该作者
如果需要下载MQTT服务器端,可以直接去MQTT官方网站点击software进行下载MQTT协议衍生出来的各个不同版本

使用特权

评论回复
9
晓伍| | 2023-11-7 19:49 | 只看该作者
通过MQTT协议,目前已经扩展出了数十个MQTT服务器端程序,可以通过PHP,JAVA,Python,C,C#等系统语言来向MQTT发送相关消息。

使用特权

评论回复
10
xiaoqizi| | 2023-11-7 20:20 | 只看该作者
它的服务器可以申请免费使用吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

276

帖子

11

粉丝