AT32基于FreeRTOS的AWS MQTT客户端

AN0192

应用笔记

AT32基于FreeRTOS的AWS MQTT客户端

                                                                               

前言

消息队列传输(Message Queuing Telemetry Transport, 后续直接使用MQTT代称)ISO标准下基于发布 / 订阅规范的讯息协议,可视为信息传递的桥梁。本应用笔记使用AT32开发板,建立一个MQTT客户端与AWS IoT Core进行通讯,用户可以基于这个范例去开发属于自己的应用。

支持型号列表:

支持型号

具备EMAC的型号

目录

1              MQTT概述... 5

2              MQTT客户端... 6

2.1      功能简介... 6

2.2      资源准备... 6

2.3      软件设计... 6

2.4      配置AWS IoT上的政策... 9

2.5      实验效果... 9

3              文档版本历史.. 12

表目录

表1. 文档版本历史... 12

图目录

图1. MQTT通讯拓扑示意... 5

图2. AWS IoT控制台中的端点信息... 8

图3. AWS IoT控制台中的实物名称... 8

图4. 实物通讯所需的凭证及私钥... 9

图5. AWS上的政策配置... 9

图6. MQTT Client发布到MQTT Broker 10

图7. MQTT Broker发布到MQTT Client 10

图8. MQTT Client收到MQTT Broker发布的内容后印出... 11

  1. MQTT概述

MQTT的基本通讯方式,就是订阅跟发布。订阅就是不断地聆听是否有符合MQTT格式的封包传入,这个封包会以JSON的格式封装,倘若数据未以JSON格式封装,则订阅端会无法正确解析出内容;发布则是以JSON的格式将主题及内容封装之后发给整个MQTT内的实体,有订阅该主题的实体在收到封包之后就会解析其内容。MQTT的通讯拓扑示意如图1

本应用笔记将与AWS IoT Core通讯,AWS作为MQTT Broker,所有的通讯内容必须以TLS加密传输,因此客户端必须导入AWS提供的凭证及私钥方能正确加解密数据。

1. MQTT通讯拓扑示意

  1. MQTT客户端
    1. 功能简介

本范例程序需要使用的主要外设为EMAC, 基于FreeRTOS, LwIP及mbedTLS实现一个MQTT客户端,MQTT的核心部份使用第三方套件,基本上不需要修改MQTT套件的内容,只需要专注在开发应用层的部份即可。mbedTLS的套件直接包进范例程序内,用户无须再配置Run-Time environment内的component。

    1. 资源准备
  1. 硬件环境:
  •   对应产品型号的AT-START BOARD
  •   能够连接到因特网的路由器
  1. 软件环境

at32f4xx\utilities\demo\mdk_v5

    1. 软件设计
  1. 配置流程
  1. 配置 EMAC 功能
  2. 初始化 LwIP 协议栈
  3. 配置私钥及 CA 凭证给客户端
  4. 联机到MQTT Broker及初始化订阅任务
  5. 初始化发布任务
  1. 代码介绍
  1. 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 Addressport, AWSIP Address并非固定的一个位置,因此每次发起联机时都需要透过DNS去解析当前的IP为何,在本范例中有实做DNS client, domain name传给GoogleDNS server进行解析,用户该做的就是将程序代码中的AWS_IOT_SERVER换成自己的端点,这个端点信息可以在AWS IoT控制面板中找到,如图2

另外联机到AWSMQTT 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_certificatembedtls_client_key

4. 实物通讯所需的凭证及私钥

    1. 配置AWS IoT上的政策

一般来说在建立实物的时候,就会询问要以哪个政策适用在这个实物上,政策如果没有正确配置的话,MQTT client将会无法联机到MQTT Broker, 因此这边简单提示政策的配置方法,详细内容请参阅AWS的官方文件。

一个MQTT client联机到MQTT Broker, 至少会进行四个动作,分别是Connect, Receive, SubscribePublish, 这些动作只有在政策中有被列出的实体才会被允许执行,本应用笔记是直接将对象开放成只要拥有正确的凭证跟私钥的任何实物都可以执行,具体内容请参照图5

5. AWS上的政策配置

详细的AWS IoT设定,请参阅官方文件

    1. 实验效果
  1. AWS IoT控制台收到来自MCU端发布主题的内容

6. MQTT Client发布到MQTT Broker

  1. AWS IoT控制台发送主题内容到MCU

7. MQTT Broker发布到MQTT Client

8. MQTT Client收到MQTT Broker发布的内容后印出

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值