

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 블루투스 로우 에너지 라이브러리
블루투스 로우 에너지

**중요**  <a name="deprecation-message-library"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

## 개요


FreeRTOS는 프록시 디바이스(예: 휴대폰)를 통해 블루투스 로우 에너지(BLE)를 이용한 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/ko_kr/freertos/latest/userguide/images/blediagram.jpg)


FreeRTOS 블루투스 디바이스용 모바일 SDK를 사용하여 BLE를 통해 마이크로컨트롤러의 내장형 애플리케이션과 통신하는 기본 모바일 애플리케이션을 작성할 수 있습니다. 모바일 SDK에 대한 자세한 내용은 [FreeRTOS 블루투스 디바이스용 모바일 SDK](freertos-ble-mobile.md)을 참조하십시오.

FreeRTOS BLE 라이브러리에는 Wi-Fi 네트워크를 구성하고 대용량 데이터를 전송하며 BLE를 통해 네트워크 추상화를 제공하는 서비스가 포함됩니다. 또한 FreeRTOS BLE 라이브러리에는 BLE 스택을 통해 더 직접적으로 제어하기 위한 하위 수준 API와 일부 미들웨어도 포함됩니다.

## 아키텍처


FreeRTOS BLE 라이브러리는 세 계층, 즉 서비스, 미들웨어 및 하위 수준 래퍼로 구성되어 있습니다.

![\[클라우드 아키텍처 계층: 사용자 애플리케이션, 서비스, 미들웨어, 하위 수준 래퍼, 제조업체 BLE 스택.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/ble-architecture.png)


### 서비스


FreeRTOS BLE 서비스 계층은 미들웨어 API를 활용하는 4개의 일반 속성(GATT) 서비스로 구성됩니다.
+ 디바이스 정보
+ Wi-Fi 프로비저닝
+ 네트워크 추상화
+ 대용량 객체 전송

#### 디바이스 정보


디바이스 정보 서비스는 마이크로컨트롤러에 대한 다음 세부 정보를 수집합니다.
+ 디바이스가 사용 중인 FreeRTOS의 버전
+ 디바이스가 등록된 계정의 AWS IoT 엔드포인트입니다.
+ 블루투스 로우 에너지 최대 전송 단위(MTU)

#### Wi-Fi 프로비저닝


Wi-Fi 기능이 있는 마이크로컨트롤러는 Wi-Fi 프로비저닝 서비스를 통해 다음을 수행할 수 있습니다.
+ 범위에 있는 네트워크 나열
+ 네트워크 및 네트워크 자격 증명을 플래시 메모리에 저장
+ 네트워크 우선 순위 설정
+ 플래시 메모리에서 네트워크 및 네트워크 자격 증명 삭제

#### 네트워크 추상화


네트워크 추상화 서비스는 애플리케이션의 네트워크 연결 유형을 추상화합니다. 공통 API는 애플리케이션이 여러 연결 유형과 호환될 수 있도록 디바이스의 Wi-Fi, 이더넷 및 블루투스 로우 에너지 하드웨어 스택과 상호 작용합니다.

#### 대용량 객체 전송


대용량 객체 전송 서비스는 클라이언트와 데이터를 주고 받습니다. Wi-Fi 프로비저닝 및 네트워크 추상화와 같은 다른 서비스는 대용량 객체 전송 서비스를 사용하여 데이터를 보내고 받습니다. 또한 대용량 객체 전송 API를 사용하여 서비스와 직접 상호 작용할 수 있습니다.

#### MQTT over BLE


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) 단원을 참조하십시오.

### 미들웨어


FreeRTOS 블루투스 로우 에너지 미들웨어는 하위 수준 API의 추상화입니다. 미들웨어 API는 블루투스 로우 에너지 스택에 대해 보다 사용자 친화적인 인터페이스를 구성합니다.

미들웨어 API를 사용하여 다중 계층의 여러 콜백을 단일 이벤트에 등록할 수 있습니다. 블루투스 로우 에너지 미들웨어를 초기화하면 서비스가 초기화되고 광고가 시작됩니다.

#### 유연한 콜백 구독


블루투스 로우 에너지 하드웨어가 연결 해제되었고, MQTT over 블루투스 로우 에너지 서비스가 이 연결 해제를 감지해야 한다고 가정해 보겠습니다. 작성한 애플리케이션도 이 동일한 연결 해제 이벤트를 감지해야 할 수 있습니다. 블루투스 로우 에너지 미들웨어는 상위 수준 계층이 하위 수준 리소스를 두고 경쟁하게 하지 않고 콜백을 등록한 코드의 여러 부분으로 이벤트를 라우팅할 수 있습니다.

### 하위 수준 래퍼


하위 수준 FreeRTOS 블루투스 로우 에너지 래퍼는 제조업체의 블루투스 로우 에너지 스택의 추상화입니다. 하위 수준 래퍼는 하드웨어를 통한 직접 제어를 위해 공통 API 세트를 제공합니다. 하위 수준 API는 RAM 사용량을 최적화하지만 기능이 제한됩니다.

블루투스 로우 에너지 서비스 API를 사용하여 블루투스 로우 에너지 서비스와 상호 작용합니다. 서비스 API는 하위 수준 API보다 많은 리소스를 요구합니다.

## 종속성 및 요구 사항


블루투스 로우 에너지 라이브러리의 직접 종속성은 다음과 같습니다.
+ [선형 컨테이너](https://docs.aws.amazon.com/freertos/latest/lib-ref/c-sdk/linear_containers/index.html) 라이브러리
+ 스레드 관리, 타이머, 클록 기능 및 네트워크 액세스를 위해 운영 체제와 인터페이스하는 플랫폼 계층입니다.

![\[구성 요소를 보여주는 아키텍처 다이어그램: BLE, 목록/대기열, 네트워크 및 클록, 상호 작용을 나타내는 방향 화살표.\]](http://docs.aws.amazon.com/ko_kr/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/)를 참조하세요.

## 라이브러리 구성 파일


FreeRTOS MQTT over 블루투스 로우 에너지 서비스를 사용하는 애플리케이션은 구성 파라미터가 정의된 `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)를 참조하십시오.

## 최적화


보드의 성능을 최적화할 때 다음을 고려하십시오.
+ 하위 수준 API는 RAM을 덜 사용하지만 제한된 기능을 제공합니다.
+ `iot_ble_config.h` 헤더 파일에서 `bleconfigMAX_NETWORK` 파라미터를 더 작은 값으로 설정하여 사용되는 스택 양을 줄일 수 있습니다.
+ MTU 크기를 최대값으로 늘려 메시지 버퍼링을 제한하고, 코드를 더 빠르게 실행하며 RAM을 덜 사용할 수 있습니다.

## 사용 제한


기본적으로 FreeRTOS 블루투스 로우 에너지 라이브러리는 `eBTpropertySecureConnectionOnly` 속성을 TRUE로 설정하여 디바이스를 보안 연결만 허용 모드로 설정합니다. [블루투스 핵심 규격](https://www.bluetooth.com/specifications/bluetooth-core-specification) v5.0, Vol 3, Part 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 보안 모드에 대한 자세한 내용은 [블루투스 핵심 규격](https://www.bluetooth.com/specifications/bluetooth-core-specification) v5.0, Vol 3, Part C, 10.2.1을 참조하십시오.

## Initialization(초기화)


애플리케이션이 미들웨어를 통해 블루투스 로우 에너지 스택과 상호 작용하는 경우 미들웨어만 초기화하면 됩니다. 미들웨어는 더 낮은 계층의 스택 초기화를 처리합니다.

### 미들웨어


**미들웨어를 초기화하려면**

1. 블루투스 로우 에너지 미들웨어 API를 호출하기 전에 블루투스 로우 에너지 하드웨어 드라이버를 초기화합니다.

1. 블루투스 로우 에너지를 활성화합니다.

1. `IotBLE_Init()`를 사용하여 미들웨어를 초기화합니다.
**참고**  
 AWS 데모를 실행하는 경우에는이 초기화 단계가 필요하지 않습니다. 데모 초기화는 `freertos/demos/network_manager`에 있는 네트워크 관리자에 의해 처리됩니다.

### 하위 수준 API


FreeRTOS 블루투스 로우 에너지 GATT 서비스를 사용하지 않으려는 경우 미들웨어를 무시하고 하위 수준 API와 직접 상호 작용하여 리소스를 저장할 수 있습니다.

**하위 수준 API를 초기화하려면**

1. 

****

   API를 호출하기 전에 모든 블루투스 로우 에너지 하드웨어 드라이버를 초기화합니다. 드라이버 초기화는 블루투스 로우 에너지 하위 수준 API의 일부가 아닙니다.

1. 

****

   블루투스 로우 에너지 하위 수준 API는 전력 및 리소스를 최적화하기 위해 블루투스 로우 에너지 스택에 활성화/비활성화 호출을 제공합니다. API를 호출하기 전에 블루투스 로우 에너지를 활성화해야 합니다.

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

1. 

****

   블루투스 관리자에는 블루투스 로우 에너지와 블루투스 클래식 모두에 공통인 API가 포함되어 있습니다. 공통 관리자에 대한 콜백은 두 번째로 초기화해야 합니다.

   ```
   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 참조


전체 API 참조는 [블루투스 로우 에너지 API 참조](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/ble/index.html)를 참조하십시오.

## 사용 예시


아래의 예는 새로운 서비스를 광고하고 생성하기 위해 블루투스 로우 에너지 라이브러리를 사용하는 방법을 보여줍니다. 전체 FreeRTOS 블루투스 로우 에너지 데모 애플리케이션은 [블루투스 로우 에너지 데모 애플리케이션](https://docs.aws.amazon.com/freertos/latest/userguide/ble-demo.html)을 참조하세요.

### 광고


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` 콜백이 트리거됩니다.

### 새 서비스 추가


서비스의 전체 예제는 `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`가 트리거되고, `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. 애플리케이션에서 IotBle\$1AddCustomServicesCb를 생성합니다.

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

## 이식


### 사용자 입력 및 출력 주변 장치


보안 연결에는 숫자 비교를 위한 입력 및 출력이 모두 필요합니다. `eBLENumericComparisonCallback` 이벤트는 이벤트 관리자를 사용하여 등록할 수 있습니다.

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

주변 장치는 숫자 패스 키를 표시하고 비교 결과를 입력으로 사용해야 합니다.

### API 구현 이식


FreeRTOS를 새 대상으로 이식하려면 Wi-Fi 프로비저닝 서비스와 블루투스 로우 에너지 기능을 위한 몇 가지 API를 구현해야 합니다.

#### 블루투스 로우 에너지 API


FreeRTOS 블루투스 로우 에너지 미들웨어를 사용하려면 몇 가지 API를 구현해야 합니다.

##### 블루투스 클래식용 GAP와 블루투스 로우 에너지용 GAP의 공통 API

+ `pxBtManagerInit`
+ `pxEnable`
+ `pxDisable`
+ `pxGetDeviceProperty`
+ `pxSetDeviceProperty`(`eBTpropertyRemoteRssi`와 `eBTpropertyRemoteVersionInfo`를 제외한 모든 옵션은 필수)
+ `pxPair`
+ `pxRemoveBond`
+ `pxGetConnectionState`
+ `pxPinReply`
+ `pxSspReply`
+ `pxGetTxpower`
+ `pxGetLeAdapter`
+ `pxDeviceStateChangedCb`
+ `pxAdapterPropertiesCb`
+ `pxSspRequestCb`
+ `pxPairingStateChangedCb`
+ `pxTxPowerCb`

##### 블루투스 로우 에너지용 GAP 전용 API

+ `pxRegisterBleApp`
+ `pxUnregisterBleApp`
+ `pxBleAdapterInit`
+ `pxStartAdv`
+ `pxStopAdv`
+ `pxSetAdvData`
+ `pxConnParameterUpdateRequest`
+ `pxRegisterBleAdapterCb`
+ `pxAdvStartCb`
+ `pxSetAdvDataCb`
+ `pxConnParameterUpdateRequestCb`
+ `pxCongestionCb`

##### GATT 서버

+ `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)을 참조하세요.

# FreeRTOS 블루투스 디바이스용 모바일 SDK


**중요**  <a name="deprecation-message-library"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

FreeRTOS 블루투스 디바이스용 모바일 SDK를 사용하여 블루투스 로우 에너지를 통해 마이크로컨트롤러와 상호 작용하는 모바일 애플리케이션을 빌드할 수 있습니다. Mobile SDKs는 사용자 인증에 Amazon Cognito를 사용하여 AWS 서비스와 통신할 수도 있습니다.

## FreeRTOS 블루투스 디바이스용 Android SDK


FreeRTOS 블루투스 디바이스용 Android SDK를 사용하여 블루투스 로우 에너지를 통해 마이크로컨트롤러와 상호 작용하는 Android 모바일 애플리케이션을 빌드합니다. SDK는 [GitHub](https://github.com/aws/amazon-freertos-ble-android-sdk/)에서 사용 가능합니다.

FreeRTOS 블루투스 디바이스용 Android SDK를 설치하려면 프로젝트의 [README.md](https://github.com/aws/amazon-freertos-ble-android-sdk/blob/master/README.md) 파일에 있는 'SDK 설정' 지침을 따릅니다.

SDK에 포함된 데모 모바일 애플리케이션 설정 및 실행에 대한 정보는 [사전 조건](ble-demo.md#ble-demo-prereqs) 및 [FreeRTOS 블루투스 로우 에너지 모바일 SDK 데모 애플리케이션](ble-demo.md#ble-sdk-app)을 참조하십시오.

## FreeRTOS 블루투스 디바이스용 iOS SDK


FreeRTOS 블루투스 디바이스용 iOS SDK를 사용하여 블루투스 로우 에너지를 통해 마이크로컨트롤러와 상호 작용하는 iOS 모바일 애플리케이션을 빌드합니다. SDK는 [GitHub](https://github.com/aws/amazon-freertos-ble-ios-sdk/)에서 사용 가능합니다.

**iOS SDK를 설치하려면**

1. [CocoaPods](http://cocoapods.org/)를 다음과 같이 설치합니다.

   ```
   $ gem install cocoapods
   $ pod setup
   ```
**참고**  
`sudo`를 사용해 CocoaPods를 설치할 수 있습니다.

1. CocoaPods를 사용하여 SDK 설치(사용자의 Podfile에 추가):

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

SDK에 포함된 데모 모바일 애플리케이션 설정 및 실행에 대한 정보는 [사전 조건](ble-demo.md#ble-demo-prereqs) 및 [FreeRTOS 블루투스 로우 에너지 모바일 SDK 데모 애플리케이션](ble-demo.md#ble-sdk-app)을 참조하십시오.

## 부록 A: MQTT over BLE GATT 프로필


### GATT 서비스 세부 정보


MQTT over BLE는 데이터 전송 GATT 서비스 인스턴스를 사용하여 FreeRTOS 디바이스와 프록시 디바이스 간에 MQTT CBOR(간결한 이진 객체 표현) 메시지를 전송합니다. 데이터 전송 서비스는 BLE GATT 프로토콜을 통해 원시 데이터를 송수신하는 데 도움이 되는 특정 특성을 제공합니다. 또한 BLE MTU(최대 전송 단위) 크기보다 큰 페이로드의 분할과 어셈블리를 처리합니다.

**서비스 UUID**  
`A9D7-166A-D72E-40A9-A002-4804-4CC3-FF00` 

**서비스 인스턴스**  
브로커와의 각 MQTT 세션마다 GATT 서비스 인스턴스가 하나씩 생성됩니다. 각 서비스에는 해당 유형을 식별하는 고유한 UUID(2바이트)가 있습니다. 각 개별 인스턴스는 인스턴스 ID로 구분됩니다.  
각 서비스는 각 BLE 서버 디바이스에서 기본 서비스로 인스턴스화됩니다. 하나의 디바이스에서 여러 서비스 인스턴스를 생성할 수 있습니다. MQTT 프록시 서비스 유형에는 고유한 UUID가 있습니다.

**특성**  
특성 내용 형식: **CBOR**   
최대 특성 값 크기: 512바이트     
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/freertos-ble-library.html)

**GATT 절차 요구 사항 **    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/freertos-ble-library.html)

**메시지 유형 **  
다음 메시지 유형이 교환됩니다.    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/freertos-ble-library.html)

**대용량 페이로드 전송 특성 **    
**TXLargeMessage **  
TXLargeMessage는 디바이스가 BLE 연결에 대해 협상된 MTU 크기보다 큰 대용량 페이로드를 전송하는 데 사용됩니다.  
+ 디바이스는 특성을 통해 페이로드의 첫 번째 MTU 바이트를 알림으로 전송합니다.
+ 프록시는 이 특성의 나머지 바이트에 대한 읽기 요청을 전송합니다.
+ 디바이스는 최대 MTU 크기 또는 페이로드의 나머지 바이트 중 더 작은 값까지 전송합니다. 매번 전송된 페이로드 크기만큼 읽은 오프셋이 증가합니다.
+ 프록시는 길이가 0인 페이로드 또는 MTU 크기보다 작은 페이로드가 될 때까지 계속해서 특성을 읽습니다.
+ 디바이스가 지정된 제한 시간 내에 읽기 요청을 수신하지 못하면 전송이 실패하고 프록시 및 게이트웨이가 버퍼를 해제합니다.
+ 프록시가 지정된 제한 시간 내에 읽기 응답을 수신하지 못하면 전송이 실패하고 프록시가 버퍼를 해제합니다.  
**RXLargeMessage **  
RXLargeMessage는 디바이스가 BLE 연결에 대해 협상된 MTU 크기보다 큰 대용량 페이로드를 수신하는 데 사용됩니다.  
+ 프록시는 이 특성에 대한 응답과 함께 쓰기를 사용하여 메시지를 최대 MTU 크기까지 하나씩 씁니다.
+ 디바이스는 길이가 0이거나 MTU 크기보다 작은 쓰기 요청을 수신할 때까지 메시지를 버퍼링합니다.
+ 디바이스가 지정된 제한 시간 내에 쓰기 요청을 수신하지 못하면 전송이 실패하고 디바이스가 버퍼를 해제합니다.
+ 프록시가 지정된 제한 시간 내에 쓰기 응답을 수신하지 못하면 전송이 실패하고 프록시가 버퍼를 해제합니다.