

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

# 移植 FreeRTOS 库
<a name="afr-porting"></a>

开始移植之前，按照[为移植设置工作区和项目](porting-set-up-project.md)中的说明进行操作。

[FreeRTOS 移植流程图](porting-chart.md) 描述了移植所需的库。

要将 FreeRTOS 移植到您的设备，请按照以下主题中的说明操作。

1. [配置 FreeRTOS 内核移植](afr-porting-kernel.md)

1. [实现库日志记录宏](afr-library-logging-macros.md)

1. [移植 TCP/IP 堆栈](afr-porting-tcp.md)

1. [移植网络传输接口](afr-porting-network-transport-interface.md)

1. [移植 corePKCS11 库](afr-porting-pkcs.md)

1. [配置 coreMQTT 库](afr-porting-mqtt.md)

1. [配置 coreHTTP 库](afr-porting-corehttp.md)

1. [移植 AWS IoT over-the-air (OTA) 更新库](afr-porting-ota.md)

1. [移植蜂窝接口库](freertos-porting-cellular.md)

# FreeRTOS 移植流程图
<a name="porting-chart"></a>

在将 FreeRTOS 移植到主板时，请使用下面的移植流程图作为可视化辅助工具。

![\[配置包含 TLS 连接和 MQTT 的 FreeRTOS 的流程图。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/portingguide/images/afr-porting.png)


# 配置 FreeRTOS 内核移植
<a name="afr-porting-kernel"></a>

此部分提供有关将 FreeRTOS 内核移植集成到 FreeRTOS 移植测试项目的说明。有关可用内核移植的列表，请参阅 [FreeRTOS 内核移植](https://freertos.org/RTOS_ports.html)。

FreeRTOS 使用 FreeRTOS 内核来支持多任务处理和任务间通信。有关更多信息，请参阅《FreeRTOS 用户指南》和 FreerTOS.org 中的 [FreeRTOS 内核基础知识](https://docs.aws.amazon.com/freertos/latest/userguide/dev-guide-freertos-kernel.html)和 [FreeRTOS.org](https://freertos.org/index.html)。**

**注意**  
将 FreeRTOS 内核移植到新架构不在本文档的讨论范围内。如果您有兴趣，请[联系 FreeRTOS 工程团队](https://freertos.org/RTOS-contact-and-support.html)。  
对于 FreeRTOS 资格认证计划，仅支持现有 FreeRTOS 内核端口。该计划不接受对这些移植进行修改。有关更多信息，请查看 [FreeRTOS 内核移植策略](https://freertos.org/differences-between-officially-supported-and-contributed-FreeRTOS-code.html)。

## 先决条件
<a name="porting-prereqs-kernel"></a>

要设置 FreeRTOS 内核以进行移植，需要具备以下条件：
+ 用于目标平台的正式 FreeRTOS 内核移植或 FreeRTOS 支持的移植。
+ 一个 IDE 项目，其中包括用于目标平台和编译器的正确 FreeRTOS 内核端口文件。有关设置测试项目的信息，请参阅[为移植设置工作区和项目](porting-set-up-project.md)。

## 配置 FreeRTOS 内核
<a name="porting-steps-kernel"></a>

FreeRTOS 内核使用名为 `FreeRTOSConfig.h` 的配置文件进行自定义。该文件为内核指定应用程序特定的配置设置。有关每个配置选项的说明，请参阅 FreeRTOS.org 上的[自定义](https://freertos.org/a00110.html)。

要将 FreeRTOS 内核配置为与您的设备配合使用，请包含 `FreeRTOSConfig.h` 并修改任何其他 FreeRTOS 配置。

有关每个配置选项的说明，请参阅 FreeRTOS.org 上的[自定义](https://freertos.org/a00110.html)配置。

## 测试
<a name="porting-testing-kernel"></a>
+ 运行一个简单的 FreeRTOS 任务，将消息记录到串行输出控制台。
+ 验证消息是否按预期输出到控制台。

# 实现库日志记录宏
<a name="afr-library-logging-macros"></a>

FreeRTOS 库使用以下日志记录宏，这些宏按详细程度的递增顺序列出。
+ `LogError`
+ `LogWarn`
+ `LogInfo`
+ `LogDebug`

必须为所有宏提供定义。建议是：
+ 宏应支持 `C89` 样式的记录记录。
+ 日志记录应具备线程安全性。来自多个任务的日志行不得相互交错。
+ 日志记录 APIs 不得阻塞，并且必须使应用程序任务免于在 I/O 上被阻塞。

有关实现规范，请参阅 FreerTos.org 上的[日志记录功能](https://www.freertos.org/logging.html)。您可以在此[示例](https://github.com/FreeRTOS/lab-iot-reference-nxp-rt1060/tree/main/examples/common/logging)中查看一种实现。

## 测试
<a name="testing-logging"></a>
+ 运行包含多个任务的测试，以便验证日志不会交错。
+ 运行测试以验证日志记录 APIs 不会阻塞 I/O。
+ 使用各种标准（例如，`C89,C99` 样式日志记录）测试日志记录宏。
+ 通过设置不同的日志级别（例如，`Debug`、`Info`、`Error` 和 `Warning`）来测试日志记录宏。

# 移植 TCP/IP 堆栈
<a name="afr-porting-tcp"></a>

本节提供移植和测试板载 TCP/IP 堆栈的说明。如果您的平台将 TCP/IP 和 TLS 功能分载到单独的网络处理器或模块，您可以跳过此移植部分并访问[移植网络传输接口](afr-porting-network-transport-interface.md)。

[FreeRTOS\$1TCP](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html) 是 FreeRTOS 内核的原生 TCP/IP 堆栈。FreeRTOS\$1TCP 由 FreeRTOS 工程团队维护，是推荐与 FreeRTOS 配合使用的 TCP/IP 堆栈。有关更多信息，请参阅 [移植 FreeRTOS\$1TCP](#porting-freertos-tcp)。或者，您可以使用第三方 TCP/IP 堆栈 [lwIP](https://savannah.nongnu.org/projects/lwip/)。本节提供的测试说明使用适用于 TCP 纯文本的传输接口测试，并且不依赖于具体实现的 TCP/IP 堆栈。

## 移植 FreeRTOS\$1TCP
<a name="porting-freertos-tcp"></a>

FreeRTOS\$1TCP 是 FreeRTOS 内核的原生 TCP/IP 堆栈。有关更多信息，请参阅 [FreeRTOS.org](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/)。

### 先决条件
<a name="porting-prereqs-freertos-tcp"></a>

要移植 FreeRTOS\$1TCP 库，您需要以下信息：
+ 包括供应商提供的以太网或 Wi-Fi 驱动程序在内的 IDE 项目。

  有关设置测试项目的信息，请参阅[为移植设置工作区和项目](porting-set-up-project.md)。
+ FreeRTOS 内核的经验证配置。

  有关为您的平台配置 FreeRTOS 内核的信息，请参阅[配置 FreeRTOS 内核移植](afr-porting-kernel.md)。

### 移植
<a name="porting-steps-freertos-tcp"></a>

在开始移植 FreeRTOS\$1TCP 库之前，请检查 [GitHub](https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/tree/main/source/portable/NetworkInterface) 目录以了解是否已存在您的主板的移植。

如果移植不存在，请执行以下操作：

1. 按照 FreeRTOS.org 上[将 FreeRTOS\$1TCP 移植到不同微控制器](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Ethernet_Porting.html)的说明，将 FreeRTOS\$1TCP 移植到您的设备。

1. 如有必要，请按照 FreeRTOS.org 上[将 FreeRTOS\$1TCP 移植到新的嵌入式 C 编译器](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Compiler_Porting.html)的说明，将 FreeRTOS\$1TCP 移植到新的编译器。

1. 在名为 `NetworkInterface.c` 的文件中实施使用供应商提供的以太网或 Wi-Fi 驱动程序的新移植。访问 [GitHub](https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/tree/main/source/portable/NetworkInterface/board_family) 存储库以获取模板。

在创建移植后，或者如果移植已存在，请创建 `FreeRTOSIPConfig.h` 并编辑配置选项，以使它们适合您的平台。有关配置选项的更多信息，请参阅 FreeRTOS.org 上的 [FreeRTOS\$1TCP 配置](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_IP_Configuration.html)。

## 测试
<a name="testing-tcp"></a>

无论您使用的是 freerTOS\$1TCP 库还是第三方库，请按照以下步骤进行测试：
+ 在传输接口测试中提供 `connect/disconnect/send/receive` API 的实现。
+ 在纯文本 TCP 连接模式下设置 Echo 服务器，然后运行传输接口测试。

**注意**  
要使设备正式获得 FreeRTOS 的资格，如果您的架构需要移植 TCP/IP 软件堆栈，则需要在 AWS IoT Device Tester 的纯文本 TCP 连接模式下根据传输接口测试验证设备移植的源代码。按照《FreeRTOS 用户指南》中[使用适用于 FreeRTOS 的 AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)中的说明为移植验证设置 AWS IoT Device Tester。**要测试特定库的移植，必须在 Device Tester `device.json` 文件夹下面的 `configs` 文件中启用正确的测试组。

# 移植 corePKCS11 库
<a name="afr-porting-pkcs"></a>

公有密钥加密标准 \$111 定义了一个独立于平台的 API，可用于管理和使用加密令牌。[PKCS 11](https://en.wikipedia.org/wiki/PKCS_11) 是指它定义的标准和 API。PKCS \$111 加密 API 用于提取密钥存储、加密对象的 get/set 属性以及会话语义。该标准在操纵常见加密对象时应用广泛。它的功能允许应用程序软件使用、创建、修改和删除加密对象，而无需将这些对象暴露在应用程序的内存中。

FreeRTOS 库和参考集成使用 PCKS \$111 接口标准的子集，重点是涉及非对称密钥、随机数生成和哈希的操作。下表列出了使用案例和需要支持的 PKCS \$111 API。


**应用场景**  

| 用例 | 必需的 PKCS \$111 API 系列 | 
| --- | --- | 
| 全部 | 初始化、最终确定、打开/关闭会话、GetsLotList、登录 | 
| 预置 | GenerateKeyPair、CreateObject、DestroyObject、InitToken、GetTokenInfo | 
| TLS | 随机、签名、FindObject、GetAttributeValue | 
| FreeRTOS\$1TCP | 随机，摘要 | 
| OTA | 验证、摘要、FindObject、GetAttributeValue | 

## 何时实现完整的 PKCS \$111 模块
<a name="implemeting-pkcs"></a>

在通用闪存中存储私有密钥对于评估和快速原型设计场景非常方便。在生产场景中，为了减少数据窃取和设备复制的威胁，我们建议您使用专用加密硬件。加密硬件包含具有防止导出加密密钥功能的组件。为了支持这一点，您必须实现使用上表中定义的 FreeRTOS 库所需的 PKCS \$111 子集。

## 何时使用 FreeRTOS corePKCS11
<a name="using-pkcs"></a>

corePKCS11 库包含 PKCS \$111 接口 (API) 的基于软件的实现，该接口使用 [Mbed TLS](https://tls.mbed.org/) 提供的加密功能。这是在没有专用加密硬件的情况下，为硬件的快速原型设计和评估场景提供的。在这种情况下，您只需要实现 corePKCS11 PAL 即可让基于 corePKCS11 软件的实现与您的硬件平台配合使用。

## 移植 corePKCS11
<a name="porting-core-pkcs"></a>

您必须有实现才能读取加密对象并将其写入非易失性存储器 (NVM)，例如板载闪存。加密对象必须存储在设备重新编程时未初始化且未擦除的 NVM 部分。corePKCS11 库的用户将使用凭证预置设备，然后使用可通过 corePKCS11 接口访问这些凭证的新应用程序重新编程设备。corePKCS11 PAL 移植必须提供一个位置来存储：
+ 设备客户端证书
+ 设备客户端私有密钥
+ 设备客户端公有密钥
+ 受信任的根 CA
+ 代码验证公有密钥（或包含代码验证公有密钥的证书），用于安全引导加载程序和空中下载 (OTA) 更新
+ 即时预置证书。

包含[头文件](https://github.com/FreeRTOS/corePKCS11/blob/main/source/include/core_pkcs11_pal.h)并实现定义的 PAL API。


**PAL API**  

| 函数 | 描述 | 
| --- | --- | 
| PKCS11\$1PAL\$1Initialize |  初始化 PAL 层。由 corePKCS11 库在其初始化序列开始时调用。  | 
| PKCS11\$1PAL\$1SaveObject |  将数据写入非易失性存储。  | 
| PKCS11\$1PAL\$1FindObject |  使用 PKCS \$111 `CKA_LABEL` 来在非易失性存储中搜索相应的 PKCS \$111 对象，并返回该对象的句柄（如果存在）。  | 
| PKCS11\$1PAL\$1GetObjectValue |  检索对象的值，给定句柄。  | 
| PKCS11\$1PAL\$1GetObjectValueCleanup |  `PKCS11_PAL_GetObjectValue` 调用的清除。可用于释放 `PKCS11_PAL_GetObjectValue` 调用中分配的内存。  | 

## 测试
<a name="porting-testing-pkcs"></a>

如果您使用 FreeRTOS corePKCS11 库或实现所需的 PKCS11 API 子集，则必须通过 FreeRTOS PKCS11 测试。这些测试用于验证 FreeRTOS 库所需的函数能否按预期执行。

本节还介绍了如何使用资格认证测试在本地运行 FreeRTOS PKCS11 测试。

### 先决条件
<a name="porting-testing-prereqs"></a>

要设置 FreeRTOS PKCS11 测试，必须实现以下几点。
+ PKCS11 API 支持的移植。
+ FreeRTOS 资格认证测试平台功能的实现，其中包括：
  + `FRTest_ThreadCreate`
  + `FRTest_ThreadTimedJoin`
  + `FRTest_MemoryAlloc`
  + `FRTest_MemoryFree`

（参阅 GitHub 上有关 PKCS \$111 的 FreeRTOS 库集成测试的 [README.md](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11) 文件。）

### 移植测试
<a name="porting-tests-pkcs11"></a>
+ 将 [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11) 作为子模块添加到您的项目中。只要可以构建子模块，就可以将其放在项目的任何目录中。
+ 将 `config_template/test_execution_config_template.h` 和 `config_template/test_param_config_template.h` 复制到构建路径中的项目位置，然后将其重命名为`test_execution_config.h`和`test_param_config.h`。
+ 将相关文件包含到构建系统中。如果使用 `CMake`，则可以使用 `qualification_test.cmake` 和 `src/pkcs11_tests.cmake` 来包含相关文件。
+ 实现 `UNITY_OUTPUT_CHAR`，这样，测试输出日志就不会与设备日志交错。
+ 集成 MbedTLS，用于验证 cryptoki 的操作结果。
+ 从应用程序调用 `RunQualificationTest()`。

### 配置测试
<a name="configure-pkcs11-tests"></a>

PKCS11 测试套件必须根据 PKCS11 实现进行配置。下表在 `test_param_config.h` 头文件中列出了 PKCS11 测试所需的配置。


**PKSC11 测试配置**  

| 配置 | 描述 | 
| --- | --- | 
| PKCS11\$1TEST\$1RSA\$1KEY\$1SUPPORT |  该移植支持 RSA 密钥功能。  | 
| PKCS11\$1TEST\$1EC\$1KEY\$1SUPPORT |  该移植支持 EC 密钥功能。  | 
| PKCS11\$1TEST\$1IMPORT\$1PRIVATE\$1KEY\$1SUPPORT |  移植支持导入私有密钥。如果已启用支持密钥功能，则将在测试中验证 RSA 和 EC 密钥导入。  | 
| PKCS11\$1TEST\$1GENERATE\$1KEYPAIR\$1SUPPORT |  移植支持生成密钥对。如果已启用支持密钥功能，则将在测试中验证 EC 密钥对生成。  | 
| PKCS11\$1TEST\$1PREPROVISIONED\$1SUPPORT |  移植具有预置凭证。`PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`、`PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` 和 `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS` 是证书的示例。  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1PRIVATE\$1KEY\$1FOR\$1TLS |  测试中使用的私有密钥的标签。  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1PUBLIC\$1KEY\$1FOR\$1TLS |  测试中使用的公有密钥的标签。  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1CERTIFICATE\$1FOR\$1TLS |  测试中使用的证书的标签。  | 
| PKCS11\$1TEST\$1JITP\$1CODEVERIFY\$1ROOT\$1CERT\$1SUPPORTED |  该移植支持 JITP 的存储。将其设置为 1 可启用 JITP `codeverify` 测试。  | 
| PKCS11\$1TEST\$1LABEL\$1CODE\$1VERIFICATION\$1KEY |  JITP `codeverify` 测试中使用的代码验证密钥的标签。  | 
| PKCS11\$1TEST\$1LABEL\$1JITP\$1CERTIFICATION |  JITP `codeverify` 测试中使用的 JITP 证书的标签。  | 
| PKCS11\$1TEST\$1LABEL\$1ROOT\$1CERTIFICATE |  JITP `codeverify` 测试中使用的根证书的标签。  | 

FreeRTOS 库和参考集成必须支持至少一种密钥功能配置，例如 RSA 或 Elliptic 曲线密钥，以及 PKCS11 API 支持的一种密钥预置机制。该测试必须启用以下配置：
+ 至少启用以下密钥功能配置之一：
  + PKCS11\$1TEST\$1RSA\$1KEY\$1SUPPORT
  + PKCS11\$1TEST\$1EC\$1KEY\$1SUPPORT
+ 至少启用以下密钥预置配置之一：
  + PKCS11\$1TEST\$1IMPORT\$1PRIVATE\$1KEY\$1SUPPORT
  + PKCS11\$1TEST\$1GENERATE\$1KEYPAIR\$1SUPPORT
  + PKCS11\$1TEST\$1PREPROVISIONED\$1SUPPORT 

预先配置的设备凭证测试必须在以下条件下运行：
+ 必须启用 `PKCS11_TEST_PREPROVISIONED_SUPPORT` 并禁用其他配置机制。
+ 只有一个密钥功能（`PKCS11_TEST_RSA_KEY_SUPPORT` 或 `PKCS11_TEST_EC_KEY_SUPPORT`）处于启用状态。
+ 根据您的密钥功能设置预先配置的密钥标签，包括 `PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`、`PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` 和 `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS`。在运行测试之前，这些凭证必须存在。

如果实现支持预先配置的凭证和其他配置机制，则测试可能需要使用不同的配置运行多次。

**注意**  
如果启用 `PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT` 或 `PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT`，则会在测试期间销毁带有标签 `PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`、`PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` 和 `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS` 的对象。

### 运行测试
<a name="running-tests"></a>

本节介绍如何通过资格认证测试在本地测试 PKCS11 接口。或者，您也可以使用 IDT 自动执行。有关详细信息，请参阅《FreeRTOS 用户指南》中 [适用于 FreeRTOS 的 AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)。**

以下说明介绍了如何运行测试：
+ 打开 `test_execution_config.h` 并将 **CORE\$1PKCS11\$1TEST\$1ENABLED** 定义为 1。
+ 构建应用程序并将其刷写到您的设备上，以便运行。测试结果会输出到串行端口。

下面是输出测试结果的一个示例。

```
TEST(Full_PKCS11_StartFinish, PKCS11_StartFinish_FirstTest) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_GetFunctionList) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_InitializeFinalize) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_GetSlotList) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_OpenSessionCloseSession) PASS
TEST(Full_PKCS11_Capabilities, PKCS11_Capabilities) PASS
TEST(Full_PKCS11_NoObject, PKCS11_Digest) PASS
TEST(Full_PKCS11_NoObject, PKCS11_Digest_ErrorConditions) PASS
TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandom) PASS
TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandomMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_CreateObject) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObject) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValue) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_Sign) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObjectMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValueMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_DestroyObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GenerateKeyPair) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_CreateObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_FindObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValue) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_Sign) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_Verify) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_FindObjectMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValueMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_SignVerifyMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_DestroyObject) PASS

-----------------------
27 Tests 0 Failures 0 Ignored
OK
```

 当所有测试均已通过后，测试完成。

**注意**  
要正式对设备进行 FreeRTOS 资格认证，您必须使用 AWS IoT Device Tester 验证设备的移植源代码。按照《FreeRTOS 用户指南》中[使用适用于 FreeRTOS 的 AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)中的说明为移植验证设置 AWS IoT Device Tester。要测试特定库的移植，必须在 AWS IoT Device Tester `configs` 文件夹下面的 `device.json` 文件中启用正确的测试组。

# 移植网络传输接口
<a name="afr-porting-network-transport-interface"></a>

## 集成 TLS 库
<a name="afr-porting-tls"></a>

传输层安全性协议 (TLS) 身份验证，请使用首选 TLS 堆栈。我们建议使用 [Mbed TLS](https://tls.mbed.org/)，因为它已通过 FreeRTOS 库进行了测试。你可以在这个[GitHub](https://github.com/FreeRTOS/FreeRTOS)存储库中找到一个这样的例子。

无论您的设备使用哪种 TLS 实现，您都必须为带 TCP/IP 堆栈的 TLS 堆栈实现底层传输挂钩。它们必须支持 [AWS IoT支持的 TLS 密码套件](https://docs.aws.amazon.com/iot/latest/developerguide/transport-security.html#tls-cipher-suite-support)。

## 移植网络传输接口库
<a name="network-intro"></a>

您必须实现一个网络传输接口才能使用 [coreMQTT](https://www.freertos.org/mqtt/index.html) 和 [coreHTTP](https://www.freertos.org/http/index.html)。网络传输接口包含在单个网络连接上发送和接收数据所需的函数指针和上下文数据。有关更多详细信息，请参阅[传输接口](https://www.freertos.org/network-interface.html)。FreeRTOS 提供了一组内置的网络传输接口测试来验证这些实现。以下部分将指导您设置项目以运行这些测试。

## 先决条件
<a name="prereqs"></a>

要完成此测试，您需要具备以下条件：
+ 一个带有构建系统的项目，该系统可以使用经过验证的 FreeRTOS 内核移植来构建 FreeRTOS。
+ 网络驱动程序的工作实现。

## 移植
<a name="porting-network-transport-interface"></a>
+ [ FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests)作为子模块添加到您的项目中。只要子模块可以构建，将其放在项目中的哪个位置并不重要。
+ 将 `config_template/test_execution_config_template.h` 和 `config_template/test_param_config_template.h` 复制到构建路径中的项目位置，然后将其重命名为`test_execution_config.h`和`test_param_config.h`。
+ 将相关文件包含到构建系统中。如果使用 `CMake`，则使用 `qualification_test.cmake` 和 `src/transport_interface_tests.cmake` 来包含相关文件。
+ 在适当的项目位置实现以下功能：
+ 
  + `network connect function`：签名由 `src/common/network_connection.h` 中的 `NetworkConnectFunc` 定义。此函数接收指向网络上下文的指针、指向主机信息的指针和指向网络凭证的指针。它使用提供的网络凭证与主机信息中指定的服务器建立连接。
  + `network disconnect function`：签名由 `src/common/network_connection.h` 中的 `NetworkDisconnectFunc` 定义。此函数接收指向网络上下文的指针。它断开存储在网络上下文中先前建立的连接。
  + `setupTransportInterfaceTestParam()`：在 `src/transport_interface/transport_interface_tests.h` 中定义。实现的名称和签名必须与 `transport_interface_tests.h` 定义的完全相同。这个函数接受一个指向*TransportInterfaceTestParam*结构的指针。它将填充传输接口测试使用的*TransportInterfaceTestParam*结构中的字段。
+ 实现 **UNITY\$1OUTPUT\$1CHAR**，这样，测试输出日志就不会与设备日志交错。
+ 从应用程序调用 `runQualificationTest()`。在调用之前，必须正确初始化设备硬件并连接网络。

### 凭证管理（设备端生成的密钥）
<a name="cred-management-key"></a>

将 `test_param_config.h` 中的 **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR** 设置为 1 时，设备应用程序会生成新的设备端密钥对并输出公有密钥。在与 Echo 服务器建立 TLS 连接时，设备应用程序使用 **ECHO\$1SERVER\$1ROOT\$1CA** 和 **TRANSPORT\$1CLIENT\$1CERTIFICATE** 作为 Echo 服务器根 CA 和客户端证书。IDT 在资格认证运行期间设置这些参数。

### 凭据管理（导入密钥）
<a name="cred-management-importing-key"></a>

在与 Echo 服务器建立 TLS 连接时，设备应用程序使用 `test_param_config.h` 中的 **ECHO\$1SERVER\$1ROOT\$1CA**、**TRANSPORT\$1CLIENT\$1CERTIFICATE** 和 **TRANSPORT\$1CLIENT\$1PRIVATE\$1KEY** 作为 Echo 服务器根 CA、客户端证书和客户端私有密钥。IDT 在资格认证运行期间设置这些参数。

## 测试
<a name="testing-transport-interface"></a>

本节介绍如何通过资格认证测试在本地测试传输接口。更多详细信息可以在上的 transport [\$1inter](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/transport_interface) face 部分提供的 README.md 文件中找到。 FreeRTOS-Libraries-Integration-Tests GitHub

或者，您也可以使用 IDT 自动执行。有关详细信息，请参阅《FreeRTOS 用户指南》中 [适用于 FreeRTOS 的AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)。**

### 启用测试
<a name="enabling-test"></a>

打开 `test_execution_config.h` 并将 **TRANSPORT\$1INTERFACE\$1TEST\$1ENABLED** 定义为 1。

### 设置测试的 Echo 服务器
<a name="configuring-echo-server-test"></a>

本地测试需要一台可从运行测试的设备访问的 Echo 服务器。如果传输接口实现支持 TLS，则 Echo 服务器必须支持 TLS。如果你还没有，那么[ FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/tools/echo_server) GitHub 存储库有一个回声服务器实现。

### 配置测试的项目
<a name="configure-project"></a>

在 `test_param_config.h` 中，将 **ECHO\$1SERVER\$1ENDPOINT** 和 **ECHO\$1SERVER\$1PORT** 更新为上一步中的端点和服务器设置。

### 设置凭证（设备端生成的密钥）
<a name="setup-credentials-device-key"></a>
+ 将 **ECHO\$1SERVER\$1ROOT\$1CA** 设置为 Echo 服务器的服务器证书。
+ 将 **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR** 设置为 1 以生成密钥对并获取公有密钥。
+ 生成密钥后，将 **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR** 设置回 0。
+ 使用公有密钥和服务器密钥以及证书生成客户端证书。
+ 将 **TRANSPORT\$1CLIENT\$1CERTIFICATE** 设置为生成的客户端证书。

### 安装凭证（导入密钥）
<a name="setup-credentials-import-key"></a>
+ 将 **ECHO\$1SERVER\$1ROOT\$1CA** 设置为 Echo 服务器的服务器证书。
+ 将 **TRANSPORT\$1CLIENT\$1CERTIFICATE** 设置为预先生成的客户端证书。
+ 将 **TRANSPORT\$1CLIENT\$1PRIVATE\$1KEY** 设置为预先生成的客户端私有密钥。

### 构建并刷写应用程序
<a name="build-flash"></a>

使用您选择的工具链构建和刷写应用程序。调用 `runQualificationTest()` 时，将运行传输接口测试。测试结果会输出到串行端口。

**注意**  
要使设备正式获得FreeRTOS的资格，您必须使用OTA PAL和OTA E2E测试组验证设备的移植源代码。 AWS IoT Device Tester按照《[FreeRTOS 用户指南》中的 “用 AWS IoT Device Tester 于](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) *FreeRTOS” 中的说明进行端口验证*设置。 AWS IoT Device Tester 要测试特定库的端口，必须在 AWS IoT Device Tester `configs`文件夹`device.json`的文件中启用正确的测试组。

# 配置 coreMQTT 库
<a name="afr-porting-mqtt"></a>

边缘设备可以使用 MQTT 协议与 AWS 云通信。AWS IoT 中托管一个 MQTT 代理，可与连接的边缘设备相互发送和接收消息。

coreMQTT 库会为运行 FreeRTOS 的设备实现 MQTT 协议。不需要移植 coreMQTT 库，但您设备的测试项目必须通过所有 MQTT 测试才能获得资格。有关更多信息，请参阅《FreeRTOS 用户指南》中的 [coreMQTT 库](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)。**

## 先决条件
<a name="testing-prereqs-mqtt"></a>

要设置 coreMQTT 库测试，您需要一个网络传输接口移植。请参阅[移植网络传输接口](afr-porting-network-transport-interface.md)，了解更多信息。

## 测试
<a name="testing-mqtt"></a>

运行 coreMQTT 集成测试：
+ 向 MQTT 代理注册客户端证书。
+ 在 `config` 中设置代理端点并运行集成测试。

## 创建参考 MQTT 演示
<a name="reference-mqtt"></a>

我们建议使用 coreMQTT 代理来处理所有 MQTT 操作的线程安全。用户还需要发布和订阅任务以及 Device Advisor 测试，以验证应用程序是否有效地集成了 TLS、MQTT 和其他 FreeRTOS 库。

要使设备正式获得 FreeRTOS 的资格，请使用 AWS IoT Device Tester MQTT 测试用例验证您的集成项目。有关设置和测试的说明，请参阅 [AWS IoT Device Advisor 工作流程](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-console-tutorial.html)。下面列出了 TLS 和 MQTT 的强制测试用例：


**TLS 测试用例**  

| 测试用例 | 测试用例 | 必需测试 | 
| --- | --- | --- | 
| TLS | TLS 连接 | 是 | 
| TLS | TLS 支持 AWS IoT 密码套件 | 推荐的[密码套件](https://docs.aws.amazon.com/iot/latest/developerguide/transport-security.html#tls-cipher-suite-support)  | 
| TLS | TLS 不安全服务器证书 | 是 | 
| TLS | TLS 主题名称服务器证书不正确 | 是 | 


**MQTT 测试用例**  

| 测试用例 | 测试用例 | 必需测试 | 
| --- | --- | --- | 
| MQTT | MQTT Connect | 是 | 
| MQTT | MQTT Connect 抖动重试次数 | 是，无警告 | 
| MQTT | MQTT 订阅 | 是 | 
| MQTT | MQTT 发布 | 是 | 
| MQTT | MQTT ClientPuback QoS1 | 是 | 
| MQTT | MQTT No Ack PingResp | 是 | 

# 配置 coreHTTP 库
<a name="afr-porting-corehttp"></a>

边缘设备可以使用 HTTP 协议来与 AWS 云通信。AWS IoT 服务中托管了一个 HTTP 服务器，可与连接的边缘设备相互发送和接收消息。

## 测试
<a name="testing-corehttp"></a>

请按照以下步骤进行测试：
+ 设置 PKI 以使用 AWS 或 HTTP 服务器进行 TLS 双向身份验证。
+ 运行 CoreHTTP 集成测试。

# 移植 AWS IoT over-the-air (OTA) 更新库
<a name="afr-porting-ota"></a>

通过 FreeRT over-the-air OS (OTA) 更新，您可以执行以下操作：
+ 将固件映像部署到单个设备、一组设备或整个机群。
+ 在将设备添加到组，或重置或重新预配置设备时，将固件部署到设备。
+ 将新固件部署到设备之后，验证其真实性和完整性。
+ 监控部署进度。
+ 调试失败的部署。
+ 使用代码签名对固件进行数字签名。 AWS IoT

[有关更多信息，请参阅 [FreeRTOS Over-the-Air 用户](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-ota-dev.html)指南中的 *FreeRTOS 更新以及更新*文档。AWS IoT Over-the-air ](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html)

您可以使用 OTA 更新库将 OTA 功能集成到您的 FreeRTOS 应用程序中。有关更多信息，请参阅《FreeRTOS 用户指南》中的 [FreeRTOS OTA 更新库](https://docs.aws.amazon.com/freertos/latest/userguide/ota-update-library.html)。**

FreeRTOS 设备必须在它们接收到的 OTA 固件映像上强制实施加密代码签名验证。我们建议采用下列算法：
+ 椭圆曲线数字签名算法 (ECDSA)
+ NIST P256 曲线
+ SHA-256 哈希

## 先决条件
<a name="porting-prereqs-ota"></a>
+ 完成[为移植设置工作区和项目](porting-set-up-project.md)中的说明。
+ 创建网络传输接口端口。

  有关信息，请参阅[移植网络传输接口](afr-porting-network-transport-interface.md)。
+ 集成 coreMQTT 库。请参阅《FreeRTOS 用户指南》中的 [coreMQTT 库](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)。
+ 创建 OTA 更新的引导加载程序。

## 平台移植
<a name="porting-steps-ota"></a>

您必须提供 OTA 便携式抽象层 (PAL) 的实现才能将 OTA 库移植到新设备。PAL APIs 是在 [ota\$1platform\$1interface.h](https://github.com/aws/ota-for-aws-iot-embedded-sdk/blob/main/source/include/ota_platform_interface.h) 文件中定义的，必须提供具体的实现细节。


| 函数名称 | 说明 | 
| --- | --- | 
| `otaPal_Abort` | 停止 OTA 更新。 | 
| `otaPal_CreateFileForRx` | 创建一个文件来存储收到的数据块。 | 
| `otaPal_CloseFile` | 关闭指定的文件。如果使用实现加密保护的存储，则可能会对文件进行身份验证。 | 
| `otaPal_WriteBlock` | 按照指定偏移量将数据块写入指定文件。如果成功，则返回写入的字节数。否则，该函数返回负错误代码。数据块大小始终为二的乘方，并且将保持对齐。有关更多信息，请参阅 [OTA 库配置](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_config.html)。 | 
| `otaPal_ActivateNewImage` | 激活或启动新的固件映像。对于某些端口，如果以编程方式同步重置设备，此函数将不会返回。 | 
| `otaPal_SetPlatformImageState` | 执行平台所需的任何操作来接受或拒绝最新的 OTA 固件映像（或包）。要实现此函数，请参阅您的主板（平台）的文档以了解详细信息和架构。 | 
| `otaPal_GetPlatformImageState` | 获取 OTA 更新映像的状态。 | 

如果您的设备已内置相应支持，实施此表中的函数。


| 函数名称 | 说明 | 
| --- | --- | 
| `otaPal_CheckFileSignature` | 验证指定文件的签名。 | 
| `otaPal_ReadAndAssumeCertificate` | 从文件系统读取指定的签署人证书并将其返回给调用方。 | 
| `otaPal_ResetDevice` | 重置设备。 | 

**注意**  
确保您有支持 OTA 更新的引导加载程序。有关创建 AWS IoT 设备引导加载程序的说明，请参阅[IoT 设备引导加载程序](#afr-bootloader)。

## E2E 和 PAL 测试
<a name="porting-steps-testing"></a>

 运行 OTA PAL 和 E2E 测试。

### E2E 测试
<a name="porting-ota-e2e"></a>

OTA 端到端 (E2E) 测试用于验证设备的 OTA 能力和模拟现实场景。该测试包括错误处理。

#### 先决条件
<a name="e2e-prereqs"></a>

要完成此测试，您需要具备以下条件：
+ 一个集成了 AWS OTA 库的项目。有关更多信息，请访问[《OTA 库移植指南》](https://www.freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_porting.html)。
+ 使用 OTA 库移植演示应用程序与 AWS IoT Core 交互以进行 OTA 更新。请参阅[移植 OTA 演示应用程序](#e2e-porting-demo-application)。
+ 设置 IDT 工具。这将运行 OTA E2E 主机应用程序来构建、刷写和监控具有不同配置的设备，并验证 OTA 库的集成。

#### 移植 OTA 演示应用程序
<a name="e2e-porting-demo-application"></a>

OTA E2E 测试必须有 OTA 演示应用程序才能验证 OTA 库的集成。该演示应用程序必须具有执行 OTA 固件更新的能力。[你可以在 FreeRTOS 存储库中找到 FreeRTOS OTA 演示应用程序。 GitHub](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator)我们建议您使用该演示应用程序作为参考，并根据您的规范进行修改。

##### 移植测试
<a name="e2e-port-demo"></a>

1. 初始化 OTA 代理。

1. 实现 OTA 应用程序回调函数。

1. 创建 OTA 代理事件处理任务。

1. 启动 OTA 代理。

1. 监控 OTA 代理统计信息。

1. 关闭 OTA 代理。

有关详细说明，请访问 [FreeRTOS OTA over MQTT - 演示的入口点](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OtaMqttAgentEntryPoint)。

##### 配置
<a name="e2e-port-config"></a>

必须使用以下配置才能与之交互 AWS IoT Core：
+ AWS IoT Core 客户凭证
  + 在 `Ota_Over_Mqtt_Demo/demo_config.h` 中使用 Amazon Trust Services 端点设置 **democonfigROOT\$1CA\$1PEM**。有关更多详细信息，请参阅 [AWS 服务器身份验证](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html)。
  + **使用你的客户端**凭据设置 democonfigClient\$1certificate\$1pem 和 democonfigClient\$1Private\$1key\$1pem**。** `Ota_Over_Mqtt_Demo/demo_config.h` AWS IoT 要了解有关客户端证书和私有密钥的信息，请参阅 [AWS 客户端身份验证详细信息](https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html)。
+ 应用程序版本
+ OTA 控制协议
+ OTA 数据协议
+ 代码签名凭证
+ 其他 OTA 库配置

在 FreeRTOS OTA 演示应用程序中，您可以在 `demo_config.h` 和 `ota_config.h` 中找到上述信息。有关更多信息，请访问 [FreeRTOS OTA over MQTT - 设置设备](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OTABasicDemoClient)。

##### 构建验证
<a name="e2e-port-validation"></a>

运行演示应用程序以运行 OTA 作业。成功完成后，您可以继续运行 OTA E2E 测试。

F [reeRTOS OTA](https://www.freertos.org/ota/ota-mqtt-agent-demo.html) 演示提供了有关在 FreeRTOS Windows 模拟器上设置 OTA 客户端和 AWS IoT Core OTA 作业的详细信息。 AWS OTA 同时支持 MQTT 和 HTTP 协议。有关更多详细信息，请参阅以下示例：
+ [Windows 模拟器上的 OTA over MQTT 演示](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Mqtt_Demo)
+ [Windows 模拟器上的 OTA over HTTP 演示](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Http_Demo)

#### 使用 IDT 工具运行测试
<a name="e2e-idt"></a>

要运行 OTA 端到端测试，必须使用 AWS IoT Device Tester (IDT) 自动执行。有关更多详细信息，请参阅《FreeRTOS 用户指南》中 [适用于 FreeRTOS 的AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)。**

##### E2E 测试用例
<a name="e2e-test-cases"></a>


| 测试用例 | 说明 | 
| --- | --- | 
| `OTAE2EGreaterVersion` | 定期 OTA 更新的满意路径 (Happy Path) 测试。它使用设备成功更新的新版本创建更新。 | 
| `OTAE2EBackToBackDownloads` | 此测试会连续创建 3 个 OTA 更新。预计设备将连续更新 3 次。 | 
| `OTAE2ERollbackIfUnableToConnectAfterUpdate` | 此测试会验证当设备无法使用新固件连接到网络时，是否会回滚到以前的固件。 | 
| `OTAE2ESameVersion` | 此测试确认，如果传入的固件版本保持不变，则设备会拒绝接收该固件。 | 
| `OTAE2EUnsignedImage` | 此测试验证当镜像没有签名时，设备是否会拒绝更新。 | 
| `OTAE2EUntrustedCertificate` | 如果固件使用不受信任的证书签名，此测试将验证设备是否会拒绝更新。 | 
| `OTAE2EPreviousVersion` | 此测试验证设备是否拒绝了旧更新版本。 | 
| `OTAE2EIncorrectSigningAlgorithm` | 不同的设备支持不同的签名和哈希算法。如果设备使用不支持的算法创建，则此测试会验证 OTA 更新是否失败。 | 
| `OTAE2EDisconnectResume` | 这是暂停和恢复功能的成功路径测试。此测试创建 OTA 更新并开始更新。然后，它 AWS IoT Core 使用相同的客户端 ID（事物名称）和凭据进行连接。 AWS IoT Core 然后断开设备的连接。设备应检测到已与其断开连接 AWS IoT Core，一段时间后，设备会自行进入暂停状态，然后尝试重新连接 AWS IoT Core 并恢复下载。 | 
| `OTAE2EDisconnectCancelUpdate` | 当设备处于暂停状态时，如果取消 OTA 任务，此测试会检查设备能否自行恢复。它的作用与`OTAE2EDisconnectResume`测试相同，只是在连接到设备后 AWS IoT Core，它会断开设备连接，从而取消OTA更新。新更新已创建。设备应重新连接到 AWS IoT Core，中止当前更新，返回等待状态，接受并完成下一次更新。 | 
| `OTAE2EPresignedUrlExpired` | 创建 OTA 更新时，您可以配置 S3 预签名 URL 的生命周期。此测试会验证设备是否能够执行 OTA，即使它无法在 URL 过期时完成下载。此设备应请求新的任务文档，其中包含用于恢复下载的新 URL。 | 
| `OTAE2E2UpdatesCancel1st` | 此测试会连续创建两个 OTA 更新。当设备报告正在下载第一个更新时，测试人员会强制取消第一个更新。设备预计会中止当前更新并进行第二次更新，然后完成更新。 | 
| `OTAE2ECancelThenUpdate` | 此测试会连续创建两个 OTA 更新。当设备报告正在下载第一个更新时，测试人员会强制取消第一个更新。设备预计会中止当前更新并进行第二次更新，然后完成更新。 | 
| `OTAE2EImageCrashed` | 此测试会检查设备是否能够在映像崩溃时拒绝更新。 | 

### PAL 测试
<a name="porting-ota-pal"></a>

#### 先决条件
<a name="pal-prereqs"></a>

要移植网络传输接口测试，您需要具备以下几点：
+ 一个可使用有效的 FreeRTOS 内核端口构建 FreeRTOS 的项目。
+ OTA PAL 的有效实现。

#### 移植
<a name="pal-porting"></a>
+ 将 [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests) 作为子模块添加到您的项目中。子模块必须位于项目中可构建该子模块的位置。
+ 将 `config_template/test_execution_config_template.h` 和 `config_template/test_param_config_template.h` 复制到构建路径中的位置，然后将其重命名为 `test_execution_config.h` 和 `test_param_config.h`。
+ 将相关文件包含到构建系统中。如果使用 `CMake`，则可以使用 `qualification_test.cmake` 和 `src/ota_pal_tests.cmake` 来包含相关文件。
+ 通过实现以下功能来配置测试：
  + `SetupOtaPalTestParam()`：在 `src/ota/ota_pal_test.h` 中定义。实现的名称和签名必须与 `ota_pal_test.h` 中定义的完全相同。目前，您不需要配置此函数。
+ 实现 **UNITY\$1OUTPUT\$1CHAR**，这样，测试输出日志就不会与设备日志交错。
+ 从应用程序调用 `RunQualificationTest()`。在调用之前，必须正确初始化设备硬件并连接网络。

#### 测试
<a name="ota-testing"></a>

本节介绍 OTA PAL 资格认证测试的本地测试。

##### 启用测试
<a name="ota-testing-enabling"></a>

打开 `test_execution_config.h` 并将 **OTA\$1PAL\$1TEST\$1ENABLED** 定义为 1。

在 `test_param_config.h` 中，更新以下选项：
+ **OTA\$1PAL\$1TEST\$1CERT\$1TYPE**：选择使用的证书类型。
+ **OTA\$1PAL\$1CERTIFICATE\$1FILE**：设备证书的路径（如果适用）。
+ **OTA\$1PAL\$1FIRMWARE\$1FILE**：固件文件的名称（如果适用）。
+ **OTA\$1PAL\$1USE\$1FILE\$1SYSTEM**：如果 OTA PAL 使用文件系统抽象，则设置为 1。

使用您选择的工具链构建和刷写应用程序。调用 `RunQualificationTest()` 时，OTA PAL 测试将运行。测试结果会输出到串行端口。

### 集成 OTA 任务
<a name="integrating-ota"></a>
+ 在您当前的 MQTT 演示中添加 OTA 代理。
+ 使用运行 OTA 端到端 (E2E) 测试。 AWS IoT这会验证集成是否按预期运行。

**注意**  
要使设备正式获得FreeRTOS的资格，您必须使用OTA PAL和OTA E2E测试组验证设备的移植源代码。 AWS IoT Device Tester按照《[FreeRTOS 用户指南》中的 “用 AWS IoT Device Tester 于](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) *FreeRTOS” 中的说明进行端口验证*设置。 AWS IoT Device Tester 要测试特定库的端口，必须在 AWS IoT Device Tester `configs`文件夹`device.json`的文件中启用正确的测试组。

## IoT 设备引导加载程序
<a name="afr-bootloader"></a>

您必须提供自己的安全引导加载程序应用程序。确保设计和实施能够适当缓解安全威胁。以下是供您参考的威胁建模。

### IoT 设备引导加载程序的威胁建模
<a name="afr-threat-model-for-bootloader"></a>

#### 背景
<a name="afr-threat-model-for-bootloader-background"></a>

作为一个可行的定义，此威胁模型所指的嵌入式 AWS IoT 设备是基于微控制器的与云服务交互的产品。它们可以部署在消费者、商业或工业环境中。IoT 设备可以收集有关用户、患者、机器或环境的数据，并且可以控制从灯泡和门锁到工厂机器的任何事物。

从假设对手的角度看，威胁建模是一种保护安全的方法。通过考虑对手的目标和方法，创建了一个威胁列表。威胁是对手对资源或资产发起的攻击。该列表具有优先级，并用于确定或创建缓解解决方案。在选择缓解解决方案时，实施和维护这些解决方案的成本应与它提供的实际安全价值平衡。可以使用多种[威胁模型方法](https://en.wikipedia.org/wiki/Threat_model)。每种产品都能够支持安全且成功的 AWS IoT 产品的开发。

FreeRTOS 为设备提供 OTA over-the-air () 软件更新。 AWS IoT 更新工具将云服务与设备上的软件库和合作伙伴提供的引导加载程序结合使用。该威胁模型明确侧重于针对引导加载程序的威胁。

**引导加载程序使用案例**
+ 在部署之前对固件进行数字签名和加密。
+ 将新的固件映像部署到单个设备、一组设备或整个队列中。
+ 在新固件部署到设备之后，验证其真实性和完整性。
+ 设备仅运行来自受信任的来源的未修改软件。
+ 设备可以灵活处理通过 OTA 收到的故障软件。

**数据流程图**

![\[针对嵌入式设备安全的数据流程图（包含物理访问、嵌入式设备、互联网边界和其他组件）。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/portingguide/images/bootloader-dataflow-diagram.png)


#### 威胁
<a name="afr-threat-model-for-bootloader-threats"></a>

有些攻击有多种缓解模式；例如，通过验证对 TLS 服务器提供的证书和新固件映像的代码签名者证书的信任度，可以缓解 man-in-the-middle旨在提供恶意固件映像的网络。为了最大限度提高引导加载程序的安全性，任何非引导加载程序缓解解决方案都被视为不可靠。引导加载程序应具有每种攻击的内置缓解解决方案。采用分层缓解解决方案被称为 defense-in-depth。

**威胁：**
+ 攻击者劫持设备到服务器的连接以提供恶意固件映像。

**缓解措施示例**
  + 在引导时，引导加载程序使用已知证书验证映像的加密签名。如果验证失败，引导加载程序将回滚到上一个映像。
+ 攻击者利用缓冲区溢出以将恶意行为引入到闪存中存储的现有固件映像。

**缓解措施示例**
  + 在引导时，引导加载程序将按照上面所述进行验证。如果验证失败并且没有以前的映像，引导加载程序将停止。
  + 在引导时，引导加载程序将按照上面所述进行验证。如果验证失败且没有以前的映像，引导加载程序将进入仅 OTA 故障保护模式。
+ 攻击者将设备引导到以前存储的映像，从而可以利用该映像发起攻击。

**缓解措施示例**
  + 在成功安装和测试新映像后，将擦除存储上一个映像的闪存扇区。
  + 在每次成功升级时，都会熔断保险丝，每个映像将会重新熔断保险丝才能运行，除非已熔断正确数量的保险丝。
+ OTA 更新提供故障或恶意映像，从而导致设备无法正常运行。

**缓解措施示例**
  + 引导加载程序启动硬件监视程序计时器，以触发回滚到上一个映像。
+ 攻击者修补引导加载程序以绕过映像验证，因此，设备将接受未签名的映像。

**缓解措施示例**
  + 引导加载程序位于 ROM（只读存储器）中，无法进行修改。
  + 引导加载程序位于 OTP（one-time-programmable 内存）中，无法修改。
  + 引导加载程序位于 ARM 的安全区域中 TrustZone，无法修改。
+ 攻击者替换验证证书，因此，设备将接受恶意映像。

**缓解措施示例**
  + 证书位于加密协处理器中，无法进行修改。
  + 证书位于 ROM、OTP 或安全区域中，无法进行修改。

#### 进一步的威胁建模
<a name="afr-threat-model-for-bootloader-further"></a>

该威胁模型仅考虑引导加载程序。进一步的威胁建模可能会提高整体安全性。建议的方法是列出对手的目标、这些目标针对的资产以及资产的入口点。可以考虑为控制资产而对入口点发起的攻击以创建威胁列表。以下是 IoT 设备的目标、资产和入口点示例列表。这些列表并非详尽无遗，旨在为您提供一些启发。

**对手的目标**
+ 敲诈钱财 
+ 诋毁声誉 
+ 伪造数据 
+ 转移资源 
+ 远程监视目标 
+ 实际访问站点 
+ 造成严重破坏
+ 灌输恐怖 

**主要资产**
+ 私有密钥 
+ 客户端证书 
+ CA 根证书 
+ 安全凭证和令牌 
+ 客户的个人身份信息 
+ 商业机密实施 
+ 传感器数据 
+ 云分析数据存储 
+ 云基础设施 

**入口点**
+ DHCP 响应 
+ DNS 响应 
+ 基于 TLS 的 MQTT 
+ HTTPS 响应 
+ OTA 软件映像 
+ 应用程序指示的其他内容，例如 USB 
+ 实际访问总线 
+ 开封 IC 

# 移植蜂窝接口库
<a name="freertos-porting-cellular"></a>

FreeRTOS 支持 TCP 分载的蜂窝抽象层的 AT 命令。有关更多信息，请参阅 freertos.org 上的[蜂窝接口库[和](https://freertos.org/cellular/index.html)移植蜂窝接口库](https://freertos.org/cellular-porting-guide.html)。

## 先决条件
<a name="freertos-porting-cellular-prereqs"></a>

蜂窝接口库没有直接依赖关系。但是，在 FreeRTOS 网络堆栈中，以太网、Wi-Fi 和蜂窝无法共存，因此，开发人员必须选择其中之一来与 [移植网络传输接口](afr-porting-network-transport-interface.md) 集成。

**注意**  
如果蜂窝模块能够支持 TLS 分载，或者不支持 AT 命令，则开发人员可以实现自己的蜂窝抽象来与 [移植网络传输接口](afr-porting-network-transport-interface.md) 集成。