

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Bluetooth Low Energy ライブラリ
<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 は、携帯電話などのプロキシデバイスを使用した Bluetooth Low Energy 経由での Message Queuing Telemetry Transport (MQTT) トピックのパブリッシュおよびサブスクライブをサポートします。FreeRTOS [Bluetooth Low Energy](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html) (BLE) ライブラリを使用すると、マイクロコントローラーは AWS IoT MQTT ブローカーと安全に通信できます。

![\[AWS Cognito AWS IoT Core 経由で MQTT/HTTP/Websocket 経由で に接続する BLE デバイス。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/blediagram.jpg)


FreeRTOS Bluetooth デバイス用 Mobile SDK を使用すると、マイクロコントローラー上の組み込みアプリケーションと BLE 経由で通信するネイティブモバイルアプリケーションを作成できます。この Mobile SDK の詳細については、「[FreeRTOS Bluetooth デバイス用の Mobile SDK](freertos-ble-mobile.md)」を参照してください。

FreeRTOS BLE ライブラリには、Wi-Fi ネットワークの設定、大量のデータの転送、および BLE 経由でのネットワーク抽象化の提供を行うためのサービスが含まれています。FreeRTOS BLE ライブラリには、BLE スタックをより直接的に制御するためのミドルウェアと低レベルの API も含まれています。

## アーキテクチャ
<a name="freertos-ble-arch"></a>

FreeRTOS BLE ライブラリは、サービス、ミドルウェア、および低レベルラッパーの 3 つのレイヤーで構成されます。

![\[クラウドアーキテクチャレイヤー: ユーザーアプリケーション、サービス、ミドルウェア、低レベルのラッパー、製造元の BLE スタック。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/ble-architecture.png)


### サービス
<a name="freertos-ble-services"></a>

FreeRTOS BLE サービスレイヤーは、ミドルウェア API を活用する 4 つの汎用属性 (GATT) サービスで構成されています。
+ デバイス情報
+ Wi-Fi プロビジョニング
+ ネットワークの抽象化
+ 大容量オブジェクトの転送

#### デバイス情報
<a name="ble-device-information"></a>

デバイス情報サービスは、以下を含む、マイクロコントローラーに関する詳細情報を収集します。
+ デバイスが使用する FreeRTOS のバージョン。
+ デバイスが登録されているアカウントの AWS IoT エンドポイント。
+ Bluetooth Low Energy の最大送信単位 (MTU)。

#### Wi-Fi プロビジョニング
<a name="ble-wifi-provisioning"></a>

Wi-Fi プロビジョニングサービスでは、Wi-Fi 機能を備えたマイクロコントローラーで次のことができます。
+ 範囲内のネットワークを一覧表示します。
+ ネットワークとネットワーク認証情報をフラッシュメモリに保存します。
+ ネットワークの優先度を設定します。
+ フラッシュメモリからネットワークとネットワーク認証情報を削除します。

#### ネットワークの抽象化
<a name="ble-network-abstraction"></a>

ネットワーク抽象化サービスは、アプリケーションのネットワーク接続タイプを抽象化します。一般的な API は、デバイスの Wi-Fi、イーサネット、および Bluetooth Low Energy ハードウェアスタックとやり取りして、アプリケーションが複数の接続タイプと互換性を持てるようにします。

#### 大容量オブジェクトの転送
<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 Bluetooth Low Energy ミドルウェアは、低レベルの API からの抽象化です。ミドルウェア API は、Bluetooth Low Energy スタックにユーザーが使いやすいインターフェイスを構成します。

ミドルウェア API を使用すると、複数のレイヤーにわたる複数のコールバックを 1 つのイベントに登録できます。Bluetooth Low Energy ミドルウェアを初期化すると、サービスも初期化され、広告を開始します。

#### 柔軟なコールバックサブスクリプション
<a name="freertos-ble-flexible-callbacks"></a>

Bluetooth Low Energy ハードウェアが切断され、MQTT over Bluetooth Low Energy サービスが切断を検出する必要があるとします。作成したアプリケーションも、同じ切断イベントを検出する必要があります。Bluetooth Low Energy ミドルウェアは、上位レイヤーが低レベルのリソースと競合することなく、コールバックを登録したコードの異なる部分にイベントをルーティングできます。

### 低レベルのラッパー
<a name="freertos-ble-arch-lowlevel"></a>

低レベルの FreeRTOS Bluetooth Low Energy ラッパーは、製造元の Bluetooth Low Energy スタックからの抽象化です。低レベルのラッパーは、ハードウェアを直接制御するための共通の API セットを提供します。低レベルの API は RAM の使用を最適化しますが、機能は限られています。

Bluetooth Low Energy サービス API を使用して、Bluetooth Low Energy サービスを操作します。サービス API は、低レベル API よりも多くのリソースを要求します。

## 依存関係と要件
<a name="freertos-ble-dependencies"></a>

Bluetooth Low Energy ライブラリには次の直接的な依存関係があります。
+ [線形コンテナ](https://docs.aws.amazon.com/freertos/latest/lib-ref/c-sdk/linear_containers/index.html)ライブラリ
+ スレッド管理、タイマー、クロック関数、およびネットワークアクセスのためにオペレーティングシステムと連結するプラットフォームレイヤー。

![\[コンポーネントを示すアーキテクチャ図: BLE、リスト/キュー、ネットワーク、クロック、およびやり取りを示す方向矢印。\]](http://docs.aws.amazon.com/ja_jp/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 Bluetooth Low Energy は、モバイルデバイスでのユーザー認証に 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 over Bluetooth Low Energy サービスを使用するアプリケーションは、設定パラメータが定義されている `iot_ble_config.h` ヘッダーファイルを提供する必要があります。定義されていない設定パラメータは、`iot_ble_config_defaults.h` で指定されたデフォルト値を使用します。

次のような重要な設定パラメータがあります。

**`IOT_BLE_ADD_CUSTOM_SERVICES`**  
ユーザーに独自のサービスの作成を許可します。

**`IOT_BLE_SET_CUSTOM_ADVERTISEMENT_MSG`**  
ユーザーに広告およびスキャン応答メッセージのカスタマイズを許可します。

詳細については、「[Bluetooth Low Energy API リファレンス](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html)」を参照してください。

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

ボードのパフォーマンスを最適化する場合は、次の点を考慮してください。
+ 低レベルの API はあまり RAM を使用しませんが、機能は限られています。
+ `iot_ble_config.h` ヘッダーファイルの `bleconfigMAX_NETWORK` パラメータをより低い値に設定すると、消費されるスタックの量を減らすことができます。
+ MTU サイズを最大値まで拡大してメッセージのバッファリングを制限し、コードの実行速度を向上させ、RAM の消費を抑えることができます。

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

デフォルトでは、FreeRTOS Bluetooth Low Energy ライブラリは `eBTpropertySecureConnectionOnly` プロパティを TRUE に設定し、デバイスをセキュア接続のみモードにします。[Bluetooth コア仕様](https://www.bluetooth.com/specifications/bluetooth-core-specification) v5.0、ボリューム 3、パート C、10.2.4 で指定されているように、デバイスがセキュア接続のみモードにある場合、最も低い LE セキュリティモード 1 レベル、レベル 1 より高いアクセス許可を持つ属性へのアクセスには、最も高い LE セキュリティモード 1 レベル、レベル 4 が必要です。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、レベル 4 (暗号化のある認証された LE のセキュアな接続ペアリング)**  
このモードはデフォルトでサポートされています。

LE セキュリティモードの詳細については、「[Bluetooth コア仕様](https://www.bluetooth.com/specifications/bluetooth-core-specification) v5.0、ボリューム 3、パート C、10.2.1」を参照してください。

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

アプリケーションがミドルウェアを介して Bluetooth Low Energy スタックを操作する場合は、ミドルウェアを初期化するだけで済みます。ミドルウェアは、スタックの下位レイヤーの初期化を行います。

### ミドルウェア
<a name="freertos-ble-init-middle"></a>

**ミドルウェアを初期化するには**

1. Bluetooth Low Energy ミドルウェア API を呼び出す前に、Bluetooth Low Energy ハードウェアドライバーを初期化します。

1. Bluetooth Low Energy を有効にします。

1. `IotBLE_Init()` でミドルウェアを初期化します。
**注記**  
 AWS デモを実行する場合、この初期化ステップは必要ありません。デモの初期化は、`freertos/demos/network_manager` にあるネットワークマネージャによって処理されます。

### 低レベル API
<a name="freertos-ble-init-low"></a>

FreeRTOS Bluetooth Low Energy GATT サービスを使用しない場合は、ミドルウェアをバイパスし、低レベル API を直接操作してリソースを節約できます。

**低レベル API を初期化するには**

1. 

****

   API を呼び出す前に、Bluetooth Low Energy ハードウェアドライバーを初期化します。ドライバーの初期化は、Bluetooth Low Energy 低レベル API の一部ではありません。

1. 

****

   Bluetooth Low Energy 低レベル API は、能力とリソースを最適化するために Bluetooth Low Energy スタックへの呼び出しを有効/無効にします。API を呼び出す前に Bluetooth Low Energy を有効にする必要があります。

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

1. 

****

   Bluetooth マネージャーには、Bluetooth Low Energy と Bluetooth classic の両方に共通の API が含まれています。共通マネージャーのコールバックは、2 番目に初期化する必要があります。

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

1. 

****

   Bluetooth Low Energy アダプタは、共通 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 );
   ```

   Bluetooth Low Energy アダプタを初期化すると、GATT サーバーを追加できます。GATT サーバーは一度に 1 つしか登録できません。

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

1. 

****

   セキュアな接続のみ、MTU サイズなどのアプリケーションプロパティを設定します。

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

## API リファレンス
<a name="freertos-ble-api"></a>

完全な API リファレンスについては、「[Bluetooth Low Energy API リファレンス](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html)」を参照してください。

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

以下の例では、新規サービスの広告と作成のために Bluetooth Low Energy ライブラリを使用する方法を示します。FreeRTOS Bluetooth Low Energy デモアプリケーションの詳細については、[Bluetooth Low Energy デモアプリケーション](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. サービスの特性と記述子の UUID を作成します。

   ```
   #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` がトリガーされ、`vWriteCommand` がアクセスされたとき `xCharControlUUID_TYPE` がトリガーされる場合、配列を次のように定義します。

   ```
   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. アプリケーションで IotBle\$1AddCustomServicesCb を作成します。

      ```
      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 プロビジョニングサービスおよび Bluetooth Low Energy 機能用にいくつかの API を実装する必要があります。

#### Bluetooth Low Energy API
<a name="freertos-ble-porting-ble"></a>

FreeRTOS Bluetooth Low Energy ミドルウェアを使用するには、一部の API を実装する必要があります。

##### Bluetooth Classic 用 GAP と Bluetooth Low Energy 用 GAP の共通 API
<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`

##### Bluetooth Low Energy の GAP に固有の API
<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 Bluetooth Low Energy ライブラリをご使用のプラットフォームに移植する方法については、FreeRTOS 移植ガイドの [Bluetooth Low Energy ライブラリの移植](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-ble.html)を参照してください。

## 付録 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 サービスの 1 つのインスタンスが作成されます。各サービスには、そのタイプを識別する一意の UUID (2 バイト) があります。個々のインスタンスは、インスタンス ID によって区別されます。  
各サービスは、各 BLE サーバーデバイス上でプライマリサービスとしてインスタンス化されます。特定のデバイス上に、サービスの複数のインスタンスを作成できます。MQTT プロキシサービスタイプには一意の UUID があります。

**特性**  
特性コンテンツ形式: **CBOR**   
最大特性値サイズ: 512 バイト     
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/freertos-ble-library.html)

**GATT プロシージャの要件 **    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/freertos-ble-library.html)

**メッセージタイプ **  
以下のメッセージタイプが交換されます。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/freertos-ble-library.html)

**大容量ペイロード転送特性 **    
**TXLargeMessage **  
TXLargeMessage は、BLE 接続に対してネゴシエートされた MTU サイズより大きい大容量ペイロードを送信するために、デバイスによって使用されます。  
+ デバイスはペイロードの最初の MTU バイトを特性を介して通知として送信します。
+ プロキシは、この特性に対して、残りのバイトの読み取りリクエストを送信します。
+ デバイスは、MTU サイズまたはペイロードの残りのバイト数のいずれか小さい方のサイズを送信します。そのたびに、送信されたペイロードのサイズ分だけ読み取り済みのオフセットを増やします。
+ プロキシは、取得したペイロードの長さが 0 になるか、ペイロードが MTU サイズより小さくなるまで、特性の読み取りを続けます。
+ 指定されたタイムアウト内にデバイスが読み取りリクエストを受け取らない場合、転送は失敗し、プロキシとゲートウェイはバッファを解放します。
+ 指定されたタイムアウト内にプロキシが読み取りレスポンスを受け取らない場合、転送は失敗し、プロキシはバッファを解放します。  
**RXLargeMessage **  
RXLargeMessage は、BLE 接続に対してネゴシエートされた MTU サイズより大きい大容量ペイロードを受信するためにデバイスによって使用されます。  
+ プロキシは、この特性に基づいてレスポンス付き書き込みを使用して、MTU サイズまでのメッセージを 1 つずつ書き込みます。
+ デバイスは、長さがゼロ、または MTU サイズより小さい書き込みリクエストを受信するまでメッセージをバッファします。
+ 指定されたタイムアウト内にデバイスが書き込みリクエストを受け取らない場合、転送は失敗し、デバイスはバッファを解放します。
+ 指定されたタイムアウト内にプロキシが書き込みレスポンスを受け取らない場合、転送は失敗し、プロキシはバッファを解放します。