1. 들어가기
KeyFob과 USB 동글이 서로 연결을 맺고 있다. KeyFob이 어떤 상태를 감지하고 나서 USB 동글 쪽으로 데이터를 보내는 방법에는 두 가지가 있다.
Notifications
Indications
Notification은 보내고 나서 수신 확인을 하지 않는 것이고, Indication은 보내고 나서 수신자로부터 확인을 받는 것이다. KeyFob에서 가속도의 변화를 감지할 때마다 USB 동글 쪽으로 가속도 값을 보내는 상황에서는 어느 방식이 더 적합할까? 대개의 경우 시간에 따른 가속도 값의 변화 추이를 살펴 보는 것이 완벽한 수신율을 보장하는 것보다 더 중요하기 때문에 수신 확인을 받을 필요가 없는 Notification이 Indication을 사용하는 것보다 적합할 것이다.
그렇다면 KeyFob이 제공하는 characteristic 중에서 Notification 방식으로 보내는 것이 무엇인지 어떻게 알 수 있는가? 그리고 그 값을 Notification 방식으로 보내도록 하려면 어떻게 해야 하는가? KeyFob은 현재 KeyFobDemo 애플리케이션을 실행하고 있는 중이다.
2. 가속도 측정 및 전송
KeyFobDemo 애플리케이션이 제공하고 있는 가속도계 서비스는 블루투스 SIG 표준이 아니라 TI에서 예제로 구현한 것이다. 아래 문서의 Figure 27에서 가속도계 서비스에 대한 attribute 테이블을 찾을 수 있다.
Bluetooth Low Energy CC2540/41 Mini Development Kit User's Guide (http://www.ti.com/litv/pdf/swru270c)
2.1 가속도계 구동
Figure 27에서 가속도계를 구동시키는 것과 관련된 characteristic은 아래 두 줄의 attribute로 정의되어 있다.
Handle Type Value Permissions
0x33 0x2803 0A 34 00 A1 FF Read
0x34 0xFFA1 00 Read/Write
위의 테이블에서 각 줄의 attribute 유형이 의미하는 바는 다음과 같다.
0x2803 하나의 characteristic을 선언하는 attribute이다.
0xFFA1 가속도계 구동을 결정하는 값을 담고 있는 attribute이다.
characteristic을 선언하고 있는 attribute의 값이 의미하는 바를 살펴 보도록 하자.
0x0A - characteristic의 값에 대하여 읽기(0x02)와 쓰기(0x08)를 할 수 있다.
0x0034 - characteristic의 값은 핸들 0x0034로 접근할 수 있다.
0xFFA1 - characteristic의 값은 가속도계 구동을 결정하는 것이다.
따라서 가속도계를 구동시키려면 BTool의 Characteristic Write 영역에서 아래와 같이 지정하고 Write 버튼을 누르면 된다.
Characteristic Value Handle: 0x0034
Value: 01:00
2.2 가속도계의 X-축 값 전송 시작
Figure 27에서 가속도계의 X-축 값과 관련된 characteristic은 아래 네 줄의 attribute로 정의되어 있다.
Handle Type Value Permissions
0x39 0x2803 10 3A 00 A3 FF Read
0x3A 0xFFA3 00 00 (none)
0x3B 0x2902 00 00 Read/Write
0x3C 0x2901 "Accel X-Coordinate" Read
위의 테이블에서 각 줄의 attribute 유형이 의미하는 바는 다음과 같다.
0x2803 하나의 characteristic을 선언하는 attribute이다.
0xFFA3 가속도계 X-축 값을 담고 있는 attribute이다.
0x2902 characteristic에 대한 설정을 담고 있는 attribute이다.
0x2901 characteristic에 대한 설명을 담고 있는 attribute이다.
characteristic을 선언하고 있는 attribute의 값이 의미하는 바를 살펴 보도록 하자.
0x10 - characteristic의 값에 대하여 Notify(0x10)을 받을 수 있다.
0x003A - characteristic의 값은 핸들 0x003A로 접근할 수 있다.
0xFFA3 - characteristic의 값은 가속도계의 X-축 값이다.
위의 테이블에서 핸들 0x3A의 Permissions를 살펴 보면 X-축 값을 직접 읽거나 쓰는 것은 허용되지 않음을 알 수 있다. 그렇다면 가속도계 서비스가 X-축 값을 Notification 방식으로 전송을 시작하도록 설정해 주어야 한다. 이러한 작업은 Characteristic Descriptor들 중에서 attribute 유형이 0x2902인 Client Characteristic Configuration을 통해서 이루어진다. 해당 descriptor의 bit 값은 다음과 같이 정의되어 있다.
0x0001 Notification
0x0002 Indication
따라서 Notification을 시작하도록 명령하는 것은 핸들 0x3B의 값을 0x0001로 바꾸어 주는 것이다. BTool의 Characteristic Write 영역에서 아래와 같이 지정하고 Write 버튼을 누른다.
Characteristic Value Handle: 0x003B
Value: 01:00
이제 KeyFob을 움직여 보자. 그러면 BTool의 로그창에 가속도계의 X-축 값이 나타날 것이다. 단 한 차례만 Notification을 보내는 것이 아니라 값의 변화가 있을 때마다 그 값을 보내 준다.
1. 문서
가. Bluetooth Low Energy CC2540/41 Mini Development Kit User's Guide (http://www.ti.com/litv/pdf/swru270c)
4. Using BTool
Appendix
나. Bluetooth Core Specifications 4.0 (https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=229737)
다. Assigned Numbers for Bluetooth GATT services (http://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx)
2. 소프트웨어
가. Bluetooth low energy software stack and tools 1.3 (www.ti.com/blestack)
- KeyFobDemo 애플리케이션과 BTool을 포함하고 있다.
질문좀 드려도 될까요? 핸들은 링크가 될때마다 달라질수가 있는것인지요? 아니면 0x003B 처럼 고정된 값인건가요?
답글삭제정확하게는 핸들의 의미가 궁금합니다. ^^