

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

# 低功耗蓝牙库
<a name="freertos-ble-library"></a>

**重要**  <a name="deprecation-message-library"></a>
该库托管在已弃用的 Amazon-FreeRTOS 存储库中。当您创建新项目时，我们建议[从此处开始](freertos-getting-started-modular.md)。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目，请参阅 [Amazon-FreeRTOS Github 存储库迁移指南](github-repo-migration.md)。

## 概述
<a name="freertos-ble-overview"></a>

FreeRTOS 支持通过代理设备（例如手机）使用低功耗蓝牙功能发布和订阅消息队列遥测传输 (MQTT) 主题。借助 FreeRTOS [低功耗蓝牙 (BLE) 库，您的微控制器可以安全地与 MQT](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html) T 代理进行通信。 AWS IoT 

![\[AWS IoT Core MQTT/HTTP/Websocket通过 AWS Cognito 连接的 BLE 设备。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/blediagram.jpg)


使用 SDKs 适用于 FreeRTOS 蓝牙设备的移动版，您可以编写原生移动应用程序，通过 BLE 与微控制器上的嵌入式应用程序通信。有关移动设备的更多信息 SDKs，请参阅[SDKs 适用于 FreeRTOS 蓝牙设备的移动设备](freertos-ble-mobile.md)。

FreeRTOS BLE 库包含一些用于配置 Wi-Fi 网络，传输大量数据以及通过 BLE 提供网络抽象的服务。FreeRTOS BLE 库还包括中间件和 APIs 较低级别，可以更直接地控制你的 BLE 堆栈。

## 架构
<a name="freertos-ble-arch"></a>

FreeRTOS BLE 库包含三个层：服务、中间件和低级别包装程序。

![\[云架构层：用户应用程序、服务、中间件、低级别包装器、制造商 BLE 堆栈。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/ble-architecture.png)


### Services
<a name="freertos-ble-services"></a>

FreeRTOS BLE 服务层由四个利用中间件的通用属性 (GATT) 服务组成： APIs
+ 设备信息
+ Wi-Fi 预置
+ 网络抽象
+ 大型对象传输

#### 设备信息
<a name="ble-device-information"></a>

设备信息服务可收集有关微控制器的详细信息，其中包括：
+ 您的设备正在使用的 FreeRTOS 的版本。
+ 设备注册的账户的 AWS IoT 终端节点。
+ 低功耗蓝牙最大传输单元 (MTU)。

#### Wi-Fi 预置
<a name="ble-wifi-provisioning"></a>

利用 Wi-Fi 预置服务，具有 Wi-Fi 功能的微控制器可执行以下操作：
+ 列出范围内的网络。
+ 将网络和网络凭证保存到闪存。
+ 设置网络优先级。
+ 从闪存中删除网络和网络凭证。

#### 网络抽象
<a name="ble-network-abstraction"></a>

网络抽象服务将应用程序的网络连接类型抽象化。通用 API 与您的设备的 Wi-Fi、以太网和低功耗蓝牙硬件堆栈交互，使得应用程序兼容多种连接类型。

#### 大型对象传输
<a name="ble-object-transfer"></a>

大型对象传输服务向客户端发送数据并从客户端接收数据。Wi-Fi 预置和网络抽象等其他服务使用大型对象传输服务来发送和接收数据。您还可以使用大型对象传输 API 来直接与服务交互。

#### MQTT over BLE
<a name="ble-device-mqtt"></a>

MQTT over BLE 包含用于通过 BLE 创建 MQTT 代理服务的 GATT 配置文件。MQTT 代理服务允许 MQTT 客户端通过网关设备与 AWS MQTT 代理进行通信。例如，您可以使用代理服务通过智能手机应用程序将运行 FreeRTOS 的设备连接 AWS 到 MQTT。BLE 设备是 GATT 服务器，并且公开了网关设备的服务和特性。使用这些公开的服务和特性，GATT 服务器通过云为设备执行 MQTT 操作。有关详细信息，请参考 [附录 A：MQTT over BLE GATT 配置文件](#freertos-ble-gatt-profile)。

### 中间件
<a name="freertos-ble-middleware"></a>

FreeRTOS 低功耗蓝牙中间件是从较低级别抽象出来的。 APIs中间件 APIs为低功耗蓝牙堆栈提供了更加用户友好的界面。

使用中间件 APIs，您可以跨多个层向单个事件注册多个回调。初始化低功耗蓝牙中间件还会初始化服务并启动通告。

#### 灵活的回调订阅
<a name="freertos-ble-flexible-callbacks"></a>

假设您的低功耗蓝牙硬件断开连接，并且低功耗蓝牙 MQTT 服务需要检测断开连接事件。您编写的应用程序可能还需要检测相同的断开连接事件。低功耗蓝牙中间件可以将事件路由到已注册回调的代码的各个部分，而不会让较高的层争用低级别资源。

### 低级别包装程序
<a name="freertos-ble-arch-lowlevel"></a>

低级别 FreeRTOS 低功耗蓝牙包装器是来自制造商的低功耗蓝牙堆栈的抽象。低级封装器提供了一组 APIs 用于直接控制硬件的通用封装器。低级会 APIs 优化 RAM 使用情况，但功能有限。

使用低功耗蓝牙服务 APIs 与低功耗蓝牙服务进行交互。该服务比低级 APIs服务 APIs 需要更多的资源。

## 依赖项和要求
<a name="freertos-ble-dependencies"></a>

低功耗蓝牙库具有以下直接依赖项：
+ [线性容器](https://docs.aws.amazon.com/freertos/latest/lib-ref/c-sdk/linear_containers/index.html)库
+ 一个平台层，直接与操作系统交互用于线程管理、计时器、时钟功能和网络访问。

![\[架构图，展示了组件 BLE、列表/队列、网络和时钟，以及表示 BLE 与其他组件的交互关系的带方向箭头。\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/images/ble-dependencies.png)


只有 Wi-Fi 预配置服务具有 FreeRTOS 库依赖项：


****  

| GATT 服务 | 依赖关系 | 
| --- | --- | 
| Wi-Fi 预置 | [Wi-Fi 库](freertos-wifi.md) | 

要与 AWS IoT MQTT 经纪人通信，您必须拥有一个 AWS 账户，并且必须将您的设备注册为 AWS IoT 事物。有关设置的更多信息，请参阅 [AWS IoT 开发人员指南](https://docs.aws.amazon.com/iot/latest/developerguide/)。

在移动设备上，FreeRTOS 低功耗蓝牙使用 Amazon Cognito 进行用户身份验证。要使用 MQTT 代理服务，您必须创建一个 Amazon Cognito 身份和用户池。每个 Amazon Cognito 身份都必须附加适当的策略。有关更多信息，请参阅《[Amazon Cognito 开发人员指南](https://docs.aws.amazon.com/cognito/latest/developerguide/)》。

## 库配置文件
<a name="freertos-ble-configuration"></a>

使用 FreeRTOS 低功耗蓝牙 MQTT 服务的应用程序必须提供一个定义了配置参数的 `iot_ble_config.h` 标头文件。未定义的配置参数将采用 `iot_ble_config_defaults.h` 中指定的默认值。

一些重要的配置参数包括：

**`IOT_BLE_ADD_CUSTOM_SERVICES`**  
允许用户创建其自己的服务。

**`IOT_BLE_SET_CUSTOM_ADVERTISEMENT_MSG`**  
允许用户自定义通告和扫描响应消息。

有关更多信息，请参阅[低功耗蓝牙 API 参考](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html)。

## 优化
<a name="freertos-ble-optimization"></a>

在优化主板性能时，请注意以下事项：
+ 低级 APIs 使用较少的 RAM，但提供的功能有限。
+ 您可以将 `iot_ble_config.h` 标头文件中的 `bleconfigMAX_NETWORK` 参数设置为一个较小的值来减少使用的堆栈量。
+ 您可以将 MTU 大小增至其最大值来限制消息缓冲，并加快代码运行速度和减少占用的 RAM。

## 使用限制
<a name="freertos-ble-restrictions"></a>

默认情况下，FreeRTOS 低功耗蓝牙库将 `eBTpropertySecureConnectionOnly` 属性设置为 TRUE，这会将设备置于“仅安全连接”模式。按照[蓝牙核心规范](https://www.bluetooth.com/specifications/bluetooth-core-specification) 5.0 版第 3 册 C 部分 10.2.4 中所述，当设备处于“仅安全连接”模式中时，需要最高 LE 安全模式 1 级别（级别 4）才能访问任何权限高于最低 LE 安全模式 1 级别（级别 1）的属性。在 LE 安全模式 1 级别 4，设备必须具有输入和输出功能才能进行数字比较。

此处列出了支持的模式及其关联属性：

**模式 1、级别 1（不安全）**  

```
/* Disable numeric comparison */
#define IOT_BLE_ENABLE_NUMERIC_COMPARISON        ( 0 )
#define IOT_BLE_ENABLE_SECURE_CONNECTION         ( 0 )
#define IOT_BLE_INPUT_OUTPUT                     ( eBTIONone )
#define IOT_BLE_ENCRYPTION_REQUIRED               ( 0 )
```

**模式 1、级别 2（无身份验证配对，有加密）**  

```
#define IOT_BLE_ENABLE_NUMERIC_COMPARISON        ( 0 )
#define IOT_BLE_ENABLE_SECURE_CONNECTION         ( 0 )
#define IOT_BLE_INPUT_OUTPUT                     ( eBTIONone )
```

**模式 1、级别 3（有身份验证配对，有加密）**  
不支持此模式。

**模式 1、级别 2（有身份验证 LE 安全连接配对，有加密）**  
默认支持此模式。

有关 LE 安全模式的信息，请参阅[蓝牙核心规范](https://www.bluetooth.com/specifications/bluetooth-core-specification) 5.0 版第 3 册 C 部分 10.2.1。

## 初始化
<a name="freertos-ble-init"></a>

如果您的应用程序通过中间件与低功耗蓝牙堆栈交互，则您只需初始化中间件即可。中间件负责初始化堆栈的较低层。

### 中间件
<a name="freertos-ble-init-middle"></a>

**初始化中间件**

1. 在调用低功耗蓝牙中间件 API 之前初始化任意低功耗蓝牙硬件驱动程序。

1. 启用低功耗蓝牙。

1. 使用 `IotBLE_Init()` 初始化中间件
**注意**  
如果您正在运行 AWS 演示，则不需要执行此初始化步骤。演示初始化由网络管理器处理，该管理器位于 `freertos/demos/network_manager`。

### 低级 APIs
<a name="freertos-ble-init-low"></a>

如果您不想使用FreeRTOS蓝牙低功耗GATT服务，则可以绕过中间件直接与低级交互以节省资源。 APIs 

**初始化低级 APIs**

1. 

****

   在调用之前，请初始化所有低功耗蓝牙硬件驱动程序 APIs。驱动程序初始化不是低功耗 APIs蓝牙低功耗的一部分。

1. 

****

   蓝牙低功耗低级 API 提供对低功耗蓝牙堆栈的 enable/disable 调用，以优化功耗和资源。在调用之前 APIs，必须启用低功耗蓝牙。

   ```
   const BTInterface_t * pxIface = BTGetBluetoothInterface();
   xStatus = pxIface->pxEnable( 0 );
   ```

1. 

****

   蓝牙管理器 APIs 包含低功耗蓝牙和经典蓝牙共有的内容。常见管理器的回调必须是第二个初始化的。

   ```
   xStatus = xBTInterface.pxBTInterface->pxBtManagerInit( &xBTManagerCb );
   ```

1. 

****

   低功耗蓝牙适配器位于常见 API 的上方。您必须初始化其回调，就像您初始化常见 API 一样。

   ```
   xBTInterface.pxBTLeAdapterInterface = ( BTBleAdapter_t * ) xBTInterface.pxBTInterface->pxGetLeAdapter();
   xStatus = xBTInterface.pxBTLeAdapterInterface->pxBleAdapterInit( &xBTBleAdapterCb );
   ```

1. 

****

   注册新的用户应用程序。

   ```
   xBTInterface.pxBTLeAdapterInterface->pxRegisterBleApp( pxAppUuid );
   ```

1. 

****

   初始化对 GATT 服务器的回调。

   ```
   xBTInterface.pxGattServerInterface = ( BTGattServerInterface_t * ) xBTInterface.pxBTLeAdapterInterface->ppvGetGattServerInterface();
   xBTInterface.pxGattServerInterface->pxGattServerInit( &xBTGattServerCb );
   ```

   在初始化低功耗蓝牙适配器后，您可以添加 GATT 服务器。一次只能注册一个 GATT 服务器。

   ```
   xStatus = xBTInterface.pxGattServerInterface->pxRegisterServer( pxAppUuid );
   ```

1. 

****

   设置应用程序属性，如仅安全连接和 MTU 大小。

   ```
   xStatus = xBTInterface.pxBTInterface->pxSetDeviceProperty( &pxProperty[ usIndex ] );
   ```

## API 参考
<a name="freertos-ble-api"></a>

有关完整 API 参考，请参阅[低功耗蓝牙 API 参考](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html)。

## 示例用法
<a name="freertos-ble-examples"></a>

以下示例说明了如何将低功耗蓝牙库用于通告和创建新服务。有关所有 FreeRTOS 低功耗蓝牙演示应用程序，请参阅[低功耗蓝牙演示应用程序](https://docs.aws.amazon.com/freertos/latest/userguide/ble-demo.html)。

### 广告
<a name="freertos-ble-advertising"></a>

1. 在您的应用程序中，设置通告 UUID：

   ```
   static const BTUuid_t _advUUID =
   {
       .uu.uu128 = IOT_BLE_ADVERTISING_UUID,
       .ucType   = eBTuuidType128
   };
   ```

1. 然后，定义 `IotBle_SetCustomAdvCb` 回调函数：

   ```
   void IotBle_SetCustomAdvCb( IotBleAdvertisementParams_t * pAdvParams,  IotBleAdvertisementParams_t * pScanParams)
   {
       memset(pAdvParams, 0, sizeof(IotBleAdvertisementParams_t));
       memset(pScanParams, 0, sizeof(IotBleAdvertisementParams_t));
   
       /* Set advertisement message */
       pAdvParams->pUUID1 = &_advUUID;
       pAdvParams->nameType = BTGattAdvNameNone;
   
       /* This is the scan response, set it back to true. */
       pScanParams->setScanRsp = true;
       pScanParams->nameType = BTGattAdvNameComplete;
   }
   ```

   此回调在通告消息中发送 UUID，在扫描响应中发送全名。

1. 打开 `vendors/vendor/boards/board/aws_demos/config_files/iot_ble_config.h` 并将 `IOT_BLE_SET_CUSTOM_ADVERTISEMENT_MSG` 设置为 `1`。这将触发 `IotBle_SetCustomAdvCb` 回调。

### 添加新服务
<a name="freertos-ble-add-service"></a>

有关服务的完整示例，请参阅 `freertos/.../ble/services`。

1.  UUIDs 为服务的特征和描述符创建：

   ```
   #define xServiceUUID_TYPE \
   {\
       .uu.uu128 = gattDemoSVC_UUID, \
       .ucType   = eBTuuidType128 \
   }
   #define xCharCounterUUID_TYPE \
   {\
       .uu.uu128 = gattDemoCHAR_COUNTER_UUID,\
       .ucType   = eBTuuidType128\
   }
   #define xCharControlUUID_TYPE \
   {\
       .uu.uu128 = gattDemoCHAR_CONTROL_UUID,\
       .ucType   = eBTuuidType128\
   }
   #define xClientCharCfgUUID_TYPE \
   {\
       .uu.uu16 = gattDemoCLIENT_CHAR_CFG_UUID,\
       .ucType  = eBTuuidType16\
   }
   ```

1. 创建缓冲区以注册特性和描述符的处理：

   ```
   static uint16_t usHandlesBuffer[egattDemoNbAttributes];
   ```

1. 创建属性表。为节省一些 RAM，请将表定义为 `const`。
**重要**  
始终按顺序创建属性，将服务作为第一个属性。

   ```
   static const BTAttribute_t pxAttributeTable[] = {
        {    
            .xServiceUUID =  xServiceUUID_TYPE
        },
       {
            .xAttributeType = eBTDbCharacteristic,
            .xCharacteristic = 
            {
                 .xUuid = xCharCounterUUID_TYPE,
                 .xPermissions = ( IOT_BLE_CHAR_READ_PERM ),
                 .xProperties = ( eBTPropRead | eBTPropNotify )
             }
        },
        {
            .xAttributeType = eBTDbDescriptor,
            .xCharacteristicDescr =
            {
                .xUuid = xClientCharCfgUUID_TYPE,
                .xPermissions = ( IOT_BLE_CHAR_READ_PERM | IOT_BLE_CHAR_WRITE_PERM )
             }
        },
       {
            .xAttributeType = eBTDbCharacteristic,
            .xCharacteristic = 
            {
                 .xUuid = xCharControlUUID_TYPE,
                 .xPermissions = ( IOT_BLE_CHAR_READ_PERM | IOT_BLE_CHAR_WRITE_PERM  ),
                 .xProperties = ( eBTPropRead | eBTPropWrite )
             }
        }
   };
   ```

1. 创建回调阵列。此回调阵列必须与以上定义的表阵列采用相同的顺序。

   例如，如果在访问 `xCharCounterUUID_TYPE` 时触发 `vReadCounter`，并在访问 `xCharControlUUID_TYPE` 时触发 `vWriteCommand`，则定义阵列如下：

   ```
   static const IotBleAttributeEventCallback_t pxCallBackArray[egattDemoNbAttributes] =
       {
     NULL,
     vReadCounter,
     vEnableNotification,
     vWriteCommand
   };
   ```

1. 创建服务：

   ```
   static const BTService_t xGattDemoService = 
   {
     .xNumberOfAttributes = egattDemoNbAttributes,
     .ucInstId = 0,
     .xType = eBTServiceTypePrimary,
     .pusHandlesBuffer = usHandlesBuffer,
     .pxBLEAttributes = (BTAttribute_t *)pxAttributeTable
   };
   ```

1. 使用您在上一步中创建的结构调用 API `IotBle_CreateService`。中间件同步所有服务的创建，因此在触发 `IotBle_AddCustomServicesCb` 回调时必须已经定义好了所有新服务。

   1. 在 `vendors/vendor/boards/board/aws_demos/config_files/iot_ble_config.h` 中将 `IOT_BLE_ADD_CUSTOM_SERVICES` 设置为 `1`。

   1. AddCustomServicesCb 在您的应用程序中创建 IotBle \$1：

      ```
      void IotBle_AddCustomServicesCb(void)
      {
          BTStatus_t xStatus;
          /* Select the handle buffer. */
          xStatus = IotBle_CreateService( (BTService_t *)&xGattDemoService, (IotBleAttributeEventCallback_t *)pxCallBackArray );
      }
      ```

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

### 用户输入和输出外围设备
<a name="freertos-ble-porting-io"></a>

安全连接需要输入和输出以进行数字比较。可使用事件管理器注册 `eBLENumericComparisonCallback` 事件：

```
xEventCb.pxNumericComparisonCb = &prvNumericComparisonCb;
xStatus = BLE_RegisterEventCb( eBLENumericComparisonCallback, xEventCb );
```

外围设备必须显示数字密钥，并将比较结果作为输入。

### 移植 API 实施
<a name="freertos-ble-porting-apis"></a>

要将 FreeRTOS 移植到新目标，必须为 Wi-Fi 配置服务和蓝牙低功耗功能实现 APIs 一些功能。

#### 低功耗蓝牙 APIs
<a name="freertos-ble-porting-ble"></a>

要使用 FreeRTOS 低功耗蓝牙中间件，必须实现一些。 APIs

##### APIs 常见于蓝牙经典版的 GAP 和低功耗蓝牙的 GAP 之间
<a name="gap-common-apis"></a>
+ `pxBtManagerInit`
+ `pxEnable`
+ `pxDisable`
+ `pxGetDeviceProperty`
+ `pxSetDeviceProperty`（所有选项都是强制性的，`eBTpropertyRemoteRssi` 和 `eBTpropertyRemoteVersionInfo` 除外）
+ `pxPair`
+ `pxRemoveBond`
+ `pxGetConnectionState`
+ `pxPinReply`
+ `pxSspReply`
+ `pxGetTxpower`
+ `pxGetLeAdapter`
+ `pxDeviceStateChangedCb`
+ `pxAdapterPropertiesCb`
+ `pxSspRequestCb`
+ `pxPairingStateChangedCb`
+ `pxTxPowerCb`

##### APIs 专门针对低功耗蓝牙的 GAP
<a name="gap-common-apis-ble"></a>
+ `pxRegisterBleApp`
+ `pxUnregisterBleApp`
+ `pxBleAdapterInit`
+ `pxStartAdv`
+ `pxStopAdv`
+ `pxSetAdvData`
+ `pxConnParameterUpdateRequest`
+ `pxRegisterBleAdapterCb`
+ `pxAdvStartCb`
+ `pxSetAdvDataCb`
+ `pxConnParameterUpdateRequestCb`
+ `pxCongestionCb`

##### GATT 服务器
<a name="gap-common-apis-gatt"></a>
+ `pxRegisterServer`
+ `pxUnregisterServer`
+ `pxGattServerInit`
+ `pxAddService`
+ `pxAddIncludedService`
+ `pxAddCharacteristic`
+ `pxSetVal`
+ `pxAddDescriptor`
+ `pxStartService`
+ `pxStopService`
+ `pxDeleteService`
+ `pxSendIndication`
+ `pxSendResponse`
+ `pxMtuChangedCb`
+ `pxCongestionCb`
+ `pxIndicationSentCb`
+ `pxRequestExecWriteCb`
+ `pxRequestWriteCb`
+ `pxRequestReadCb`
+ `pxServiceDeletedCb`
+ `pxServiceStoppedCb`
+ `pxServiceStartedCb`
+ `pxDescriptorAddedCb`
+ `pxSetValCallbackCb`
+ `pxCharacteristicAddedCb`
+ `pxIncludedServiceAddedCb`
+ `pxServiceAddedCb`
+ `pxConnectionCb`
+ `pxUnregisterServerCb`
+ `pxRegisterServerCb`

有关将 FreeRTOS 低功耗蓝牙库移植到您的平台的更多信息，请参阅《FreeRTOS 移植指南》中的[移植低功耗蓝牙库](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-ble.html)。

# SDKs 适用于 FreeRTOS 蓝牙设备的移动设备
<a name="freertos-ble-mobile"></a>

**重要**  <a name="deprecation-message-library"></a>
该库托管在已弃用的 Amazon-FreeRTOS 存储库中。当您创建新项目时，我们建议[从此处开始](freertos-getting-started-modular.md)。如果您已经有一个基于现已弃用的 Amazon-FreeRTOS 存储库的 FreeRTOS 项目，请参阅 [Amazon-FreeRTOS Github 存储库迁移指南](github-repo-migration.md)。

您可以使用 SDKs 适用于 FreeRTOS 蓝牙设备的移动版来创建通过低功耗蓝牙与您的微控制器交互的移动应用程序。移动设备 SDKs 还可以使用Amazon Cognito进行用户身份验证，从而与 AWS 服务进行通信。

## 适用于 FreeRTOS 蓝牙设备的 Android 开发工具包
<a name="freertos-ble-android"></a>

使用适用于 FreeRTOS 蓝牙设备的 Android 开发工具包来构建通过低功耗蓝牙与微控制器交互的 Android 移动应用程序。该软件开发工具包已在上线[GitHub](https://github.com/aws/amazon-freertos-ble-android-sdk/)。

要安装适用于 FreeRTOS 蓝牙设备的 Android 开发工具包，请按照项目的 [README.md](https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/README.md) 文件中“设置开发工具包”的说明进行操作。

有关设置和运行开发工具包中所含演示移动应用程序的信息，请参阅[先决条件](ble-demo.md#ble-demo-prereqs)和 [FreeRTOS 低功耗蓝牙移动开发工具包演示应用程序](ble-demo.md#ble-sdk-app)。

## 适用于 FreeRTOS 蓝牙设备的 iOS 开发工具包
<a name="freertos-ble-ios"></a>

使用适用于 FreeRTOS 蓝牙设备的 iOS 开发工具包来构建通过低功耗蓝牙与微控制器交互的 iOS 移动应用程序。该软件开发工具包已在上线[GitHub](https://github.com/aws/amazon-freertos-ble-ios-sdk/)。

**安装 iOS 开发工具包**

1. 安装 [CocoaPods](http://cocoapods.org/)：

   ```
   $ gem install cocoapods
   $ pod setup
   ```
**注意**  
您可能需要使用`sudo`才能安装 CocoaPods。

1. 使用以下命令安装 SDK CocoaPods （将其添加到你的 podfile 中）：

   ```
   $ pod 'FreeRTOS', :git => 'https://github.com/aws/amazon-freertos-ble-ios-sdk.git'
   ```

有关设置和运行开发工具包中所含演示移动应用程序的信息，请参阅[先决条件](ble-demo.md#ble-demo-prereqs)和 [FreeRTOS 低功耗蓝牙移动开发工具包演示应用程序](ble-demo.md#ble-sdk-app)。

## 附录 A：MQTT over BLE GATT 配置文件
<a name="freertos-ble-gatt-profile"></a>

### GATT 服务详细信息
<a name="freertos-ble-gatt-profile-details"></a>

MQTT over BLE 使用数据传输 GATT 服务的实例在 FreeRTOS 设备和代理设备之间发送 MQTT 简洁二进制对象表示法 (CBOR) 格式的消息。数据传输服务会公开某些特征，这些特征有助于通过 BLE GATT 协议发送和接收原始数据。它还可以处理有效负载大于 BLE 最大传输单元 (MTU) 大小的分段和程序集。

**服务 UUID**  
`A9D7-166A-D72E-40A9-A002-4804-4CC3-FF00` 

**服务实例**  
每次与代理进行的 MQTT 会话时都会创建一个 GATT 服务实例。每项服务都有一个用于标识类型的唯一 UUID（两个字节）。每个实例都根据实例 ID 进行区分。  
每项服务都作为每个 BLE 服务器设备上的主要服务进行实例化。您可以在指定设备上创建该服务的多个实例。MQTT 代理服务类型具有唯一的 UUID。

**特性**  
特征内容格式：**CBOR**   
最大特征值大小：512 字节     
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/freertos-ble-library.html)

**GATT 过程要求 **    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/freertos-ble-library.html)

**消息类型 **  
交换以下消息类型。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/freertos/latest/userguide/freertos-ble-library.html)

**大有效负载传输特征 **    
**TXLarge消息 **  
TXLarge设备使用消息发送大于为 BLE 连接协商的 MTU 大小的大型有效负载。  
+ 设备通过特征将有效负载前面的 MTU 字节作为通知发送。
+ 代理根据此特征发送有关剩余字节的读取请求。
+ 设备最多发送 MTU 大小或有效负载的剩余字节，以较小者为准。它每次都会根据发送的有效负载大小来增加读取的偏移量。
+ 代理将继续读取特征，直到获得长度为零的有效负载或小于 MTU 大小的有效负载。
+ 如果设备在指定的超时时间内没有收到读取请求，则传输将失败，代理和网关会释放缓冲区。
+ 如果代理在指定的超时时间内没有收到读取响应，则传输将失败，代理会释放缓冲区。  
**RXLarge消息 **  
RXLarge设备使用消息接收大于 BLE 连接协商的 MTU 大小的大型有效负载。  
+ 代理使用响应此特征的写入来逐一写入不超过 MTU 大小的消息。
+ 设备会缓存消息，直到收到长度为零或长度小于 MTU 大小的写入请求。
+ 如果设备在指定的超时时间内没有收到写入请求，则传输将失败，设备会释放缓冲区。
+ 如果代理在指定的超时时间内没有收到写入响应，则传输将失败，代理会释放缓冲区。