: ble_app_interactive 프로젝트에서 사용되는 handle값을 UUID 와 함께 정리해 봤습니다.
Service --> handle_range
typedef struct
{
ble_uuid_t uuid; /**< Service UUID. */
ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */
} ble_gattc_service_t;
characteristics
--> decl_handle
--> value_handle
descriptor
--> cccd_desc_handle
typedef struct
{
ble_uuid_t uuid; /**< UUID of the characteristic. */
uint16_t decl_handle; /**< Handle of the characteristic declaration. */
uint16_t value_handle; /**< Handle of the characteristic value. */
uint16_t cccd_desc_handle; /**< Handle of the CCCD descriptors. */
ble_gatt_char_props_t char_props; /**< GATT Characteristic Properties. */
} char_data_t;
1> 아래 내용은 ble_app_blinky 를 연결한 상태에서 디버깅한 내용입니다.
▶ nRF Connect 앱에 장치를 연결한 상태에서 내용을 보시면 이해가 되실겁니다.
▶ 서비스가 3개 발견되고 각각의 handle_range 값은 다음과 같습니다.
service UUID | handle_range(start_handle ~ end_handle) | characteristics 갯수 |
0x1800 (Generic Access) | 1 ~9 | 4개 |
0x1801 (Generic Attribute) | A ~ A | 0개 |
0x1523 (Nordic LED Button Service) : Vendor specific | B ~ 0xFFFF | 2개 |
총 Characteristics는 6개이고 사용되는 handle 값은 아래 내용 참고하세요.
Characteristics UUID | decl_handle / value_handle | Service UUID |
0x2A00 (Device Name) | 2/3 | 0x1800 |
0x2A01 (Appearance) | 4/5 | |
0x2A04 (Peripheral Preferred Connection Parameters) | 6/7 | |
0x2AA6 (Central Address Resolution) | 8/9 | |
0x1524 (Button) | 0x0C/0x0D | 0x1523 |
0x1525 (LED) | 0x0F/0x10 |
: 순서적으로 값이 증가하다가 0xE가 빠졌네요. 0xE는 CCCD 가 할당이 되어 있습니다.
Descriptor UUID : indicate or notify 의 경우 사용 됩니다.
CCCD UUID | cccd_desc_handle | Characteristics UUID |
0x2902 | 0x0E | 0x1524 |
: 0x1524 characteristics의 설정 descriptor 입니다.
< 기타>
제 나름대로 정리하면
기본적으로 service handle 값의 범ㅇ위의 start_handle 은 겹치지 안고
end_handle은 characteristic value_handle 또는 cccd_desc_handle 과 겹치고
handle 값 순서는 다음과 같습니다.
cccd 가 있을경우
service_start_handle --> characteristic decl_handle --> characteristic value_handle --> cccd_desc_handle
--> characteristic decl_handle --> characteristic value_handle ---> ...중략 ... --> service:: end_handle
cccd가 없을경우
service_start_handle --> characteristic decl_handle --> characteristic value_handle
--> characteristic decl_handle --> characteristic value_handle ---> ...중략 ... --> service:: end_handle
그럼 수고하세요