GATT(Generic Attribute Profile)
데이터 테이블(Attribute Table, the profile)을 정의할 수 있음 : 장치의 특징, 작동상태 또는 버튼의 상태 등(on/off)
GATT 데이터 구조:
Services, Characteristics, Descriptors
1. Services: 최상위 구조체, 다수의 Characteristics 보유
2. Characteristics : 개별 항목의 상태 정보, 타입, 관련값, 추가적인 작동등 설정
연결된 장치가 읽을수는 있지만, 쓸수는 없다.
3. Descriptors : 특정 Characteristics에 속하며, Characteristics의 특성을 설명하는 메타데이타(metadata)를 갖고있다.
Characteristics의 옵션사항(없어도 상관없음)
GATT의 작동이 notification으로 정의 된 경우:
연결장치의 요청이 있을경우 또는 characteristic value 변경시, 스케쥴에 따라서 연결된 장치에 characteristic value을 포함한 메세지 전송.
Descriptors 내의 특정 타입의 플래그 설정으로 정의됨.
Bluetooth SIG에 할당되어 정의되어 있는 Services, Characteristics, Descriptors는 아래 사이트에서 확인 가능하다.
https://www.bluetooth.com/specifications/assigned-numbers
GATT server: service, characteristics and descriptors의 호스트
GATT client : service, characteristics and descriptors의 호스트에 접속하는 장치
GAP(Generic Access Profile) : 장치의 검색 및 연결 방법
블루투스 4.0 BLE 장치의 4 roles
1. Peripheral : Central devices에 검색용 패킷 전송(advertises) 및 연결 허용. 예) 심박수 모니터
특징: 연결을 요청하지 못함 - 다른 Peripheral에 연결 불가.
다른 장치의 스캔 불가 - 검색용 패킷 전송만 가능 - 두 Peripherals간 검색용 패킷만으로는 상호작용 불가
Peripheral는 한번에 한개의 연결만 허용(Bluetooth 4.1에서는 복수도 가능)
보통 다른 장치의 연결을 허락한 후 GATT server 역할(하지만, Peripheral과 GATT server는 서로 독립적임)
- advertises: 다른 블루투스 4.0 장치가 검색할 수 있도록 빠른 주기로 소량의 데이터를 전송 하는것
2. Central: 검색용 패킷을 검색하고 연결요청. 예) 스마트폰
보통 다른 장치에 연결한 후 GATT client 역할(Central과 GATT client는 서로 독립적임)
장치에 연결된 후 GATT server로 변경 가능
3. Broadcaster: 검색용 패킷을 전송하지만 연결은 허용하지 않음. 예) 블루투스 비콘
4. Observer : 패킷을 검색하고 패킷을 재전송, 다른 장치로의 연결을 시도 하지 않음. 예) 비콘 앱
ATT(Attribute Protocol) : Bluetooth LE stack의 레이어
연결된 GATT client가 GATT server와 서로 통신하도록 하는 Bluetooth LE stack.
client가 접속 서버의 Attribute Table에 등록된 GATT services, Characteristic의 현재 값 요청 및 그 값의 변경, 일림을 끄고 켜기 또는 표시 등을 찾을 수 있도록 한다.
GATT는 장치의 특성을 텍스트 구조로 표시하고, ATT는 그 데이터 구조가 Bluetooth LE 통신에 사용되도록 한다.
Service: Proximity Monitoring
Characteristic: Client Proximity
Field: uint8 client_proximity_band
Field: uint8 rssi_at_client
Properties: Write Without Response
앱은 보통 ATT와 직접적으로 상호 작용하지 않고 ATT 프로토콜 데이터를 주고 받으며 디코딩하는 APIs를 사용한다.
UUID(Universally Unique Identifier) : GATT의 고유 아이디
Services, characteristics, descriptors는 모두 각자의 타입에 맞는 UUID를 필요로 하고, 특정 항목들은 Bluetooth SIG에의해 그 UUID가 이미 할당 되어져 있다. 하지만, 우리는 보통 커스텀 UUID를 사용하게되는데 기본 구성은 아래와 같다.
BASE_UUID 00000000-0000-1000-8000-00805F9B34FB
HM-10 또는 그 복제품 AT-09의 기본 UUID:
0000FFE0-0000-1000-8000-00805F9B34FB
0000FFE1-0000-1000-8000-00805F9B34FB
AT-09의 경우 AT명령을 통해 0x0001 ~ 0xFFFE 까지 변경할 수 있다.
그외 특정 보드나 ESP32를 사용하는 경우라면 UUID 생성 사이트를 통해 고유한 UUID를 생성하여 사용할 수 있다.
3E099910-293F-11E4-93BD-AFD0FE6D1DFD
3E099911-293F-11E4-93BD-AFD0FE6D1DFD
UUID 관련 사이트
https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
Bluetooth SIG에 등록된 회사 고유번호
at-09의 칩셋 : Bluetooth SIG Company : texas instruments inc. 0x000D
https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers
Nordic Semiconductor ASA사의 nRF Connect앱을 사용하여 위의 용어들을 확인해 보자.
https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ko
* 확실하지는 않으나 상기 앱에 백그라운드에서 실행되는 전면 광고 코드가 심어진것 같다. 필요사항을 확인한 뒤에는 삭제하길 바란다.
nRF Connect앱을 실행한뒤 스캔을 클릭하여 블루투스 4.0 BLE 장치를 검색하게 되면 SCANNER 항목에 아래와 같이 장치들의 목록이 표시된다.
아두이노에 AT-09를 설치해 놓아서 BT-05라는 장치 이름이 검색되었다. 연결을 하기전에 장치이름을 클릭하여 기본 정보를 확인해 보자.
연결을 하면 Bluetooth SIG에의해 할당된 GATT Services UUID와 커스텀 UUID를 확인 할 수 있다.
Generic Access UUID: 0x1800, Generic Attribute UUID: 0x1801, Device Information UUID: 0x180A,
Immediate Alert UUID: 0x1802, Link Loss UUID: 0x1803, Tx Power UUID: 0x1804 등
Tx Power UUID: 읽기를 할 때 현재의 전송 파워 레벨 값 전송, 장치와의 거리 측정에 사용
아래 사이트에서 더 많은 할당된 UUID를 확인 할 수 있다.
https://www.bluetooth.com/specifications/gatt/services/
Generic Access를 클릭하면 Bluetooth SIG에의해 할당된 GATT Characteristics UUID를 확인 할 수 있다.
Reconnection Address UUID: 0x2A03, Peripheral Preferred Connection Parameters UUID: 0x2A04,
Service Changed UUID: 0x2A05
https://www.bluetooth.com/specifications/gatt/characteristics/
Generic Attribute를 클릭하면 Bluetooth SIG에의해 할당된 GATT Characteristics UUID와 GATT Descriptors UUID를 확인 할 수 있다.
Characteristic User Description UUID: 0x2901, Client Characteristic Configuration UUID: 0x2902
https://www.bluetooth.com/specifications/gatt/descriptors/
Device Information을 클릭한 뒤 아래 그림처럼 PnP ID의 읽기(아래 방향 화살표)를 클릭해 보면 칩셋 제조사를 확인해 볼 수 있다.
마지막 커스텀 서비스인 Unknown Service를 클릭해 보면 AT-09에 설정되어 있는 Characteristic UUID와 현재 읽은 값을 확인 할 수 있다.
현재 아두이노에 이전 포스트에서 다루었던 코드가 업로드 되어 있어 아두이노에서 가변저항 값을 프로토콜 형식에 맞춰 AT-09를 통해 보내고 있으며 앱은 이 값을 읽어 들인 것이다.
Unknown Characteristic의 쓰기(위쪽 방향 화살표)를 클릭하여 데이터를 전송해 보도록 하자.
LED의 밝기를 141로 조절하기 위해 F3018D00F1을 입력하고 BYTE 타입 상태로 SEND를 클릭하면 LED의 밝기가 변하는 것을 볼 수 있고, 응답으로 "blue_control"이 헥사값으로 들어온 것을 볼 수 있다(응답 코드가 있을경우).
* F3(헤더) - 01(슬라이드번호) - 8D00(PWM 값-2바이트 숫자) - F1(종료문자) 임.
데이터 타입을 text로 변경하고 "hello"를 보내보면 시리얼 모니터에 "hello"가 표시되고 전송값에 대한 정보도 같이 표시됨을 볼 수 있다.
관련 글
[arduino] - 블루투스 4.0 BLE, 스마트폰 연결과 페어링(pairing), AT-09
[arduino] - 블루투스 4.0 BLE 기초 용어
[arduino] - 블루투스 4.0 BLE 이용 아두이노 및 ESP32 원격제어
[arduino] - ESP32 블루투스 4.0 BLE, 비밀번호(pin code) 이용 페어링 연결
'Arduino' 카테고리의 다른 글
ESP32 블루투스 2.0 클래식 pin code 이용 페어링(비밀번호 사용 연결) 원격제어 (2) | 2019.05.18 |
---|---|
ESP32 블루투스 4.0 BLE, 비밀번호(pin code) 이용 페어링 연결 (2) | 2019.05.17 |
아두이노 - 시리얼통신 주요함수와 예제, String class (0) | 2019.05.15 |
블루투스 4.0 BLE 이용 아두이노 및 ESP32 원격제어 (0) | 2019.05.15 |
ESP32의 특징 및 아두이노 IDE에 ESP32 사용 환경 설치하기 (0) | 2019.05.12 |
아두이노 IDE에 ESP8266 사용 환경 설치하기 (0) | 2019.05.12 |
블루투스 4.0 BLE, 스마트폰 연결과 페어링(pairing), AT-09 (0) | 2019.05.11 |
아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 5편 (2) | 2019.05.07 |