스위처 블루투스 분석 - 언젠간 Siri에 연결될 수 있도록..
언젠간.. Siri에 스위처를 연동하겠다는.. 목표로 스위처 분석한 결과...
스위처는 BLE 기반으로 작동...
Bluetooth Low Energy(BLE) 파헤치기
BLE(Bluetooth Low Energy) 이해하기
쭉 읽어보고, 실제 해보니 중요한건 Characteristic라는 UUID 값이다.
하나의 기능을 가르키는 고유 값이며, 여러개의 기능을 묶어 1개의 서비스를 나타낸다.
예를들면 스위처에서 스위치를 조작하는 기능, 그리고 스위치를 누르는 발의 길이를 조절하는 기능을 묶어서,
한개의 서비스로 만드는 것이다.
스위처를 조작하려면 Characteristic를 알아야 하고, 해당 Characteristic에 원하는 값을 실어서 보내면,
BLE통신으로 스위처에서 처리하게 된다.
스위처 분석하기...
hcitool과 gattool 명령어를 이용하여 분석하였다.
Mac 주소 찾기
zipi@mini:~/homebridge$ sudo hcitool lescan
[sudo] password for zipi:
LE Scan ...
DA:B0:75:XX:XX:XX SWITCHER_M
DA:B0:75:XX:XX:XX (unknown)
DA:B0:75:XX:XX:XX SWITCHER_M
DA:B0:75:XX:XX:XX (unknown)
DA:B0:75:XX:XX:XX SWITCHER_M
hcitool lescan 명령을 하면 BLE 통신으로 주변에 BLE 기기를 스캔한다.
정상적으로 동작하면 위처럼 SWITCHER_M 이라는 장치가 표시된다.
앞부분에 나오는 부분이 해당 스위처의 Mac 주소이다.
mac주소가 꼭 필요하니 메모해두어야 한다.
Characteristic 찾기
위에서 찾은 Mac주소를 이용하여 아래 명령어를 입력한다.
gatttool -b DA:B0:75:XX:XX:XX -I -t random
gattool은 BLE로 통신할 수 있도록 해준다. 그리고 connect라고 쳐준다.
정상적으로 연결되면, 연결되었다고 나타나며 대기상태로 들어간다.
이때부터 종료할 때까지 스마트폰에서는 연결이 안된다... 일종의 페어링되어 쌍방으로 통신하는 상태...
zipi@mini:~/homebridge$ gatttool -b DA:B0:75:XX:XX:XX -I -t random
[DA:B0:75:XX:XX:XX][LE]> connect
Attempting to connect to DA:B0:75::XX:XX:XX
Connection successful
[DA:B0:75:XX:XX:XX][LE]>
primary와 characteristics 명령어를 이용해서 어떤 값이 있는지 확인하자.
[DA:B0:75:XX:XX:XX][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x000e uuid: 0000150a-0000-1000-8000-00805f9b34fb
attr handle: 0x000f, end grp handle: 0x0013 uuid: 0000150b-0000-1000-8000-00805f9b34fb
attr handle: 0x0014, end grp handle: 0x001a uuid: 0000150c-0000-1000-8000-00805f9b34fb
attr handle: 0x001b, end grp handle: 0x0022 uuid: 0000150d-0000-1000-8000-00805f9b34fb
attr handle: 0x0023, end grp handle: 0x002b uuid: 0000150e-0000-1000-8000-00805f9b34fb
attr handle: 0x002c, end grp handle: 0xffff uuid: 00001530-1212-efde-1523-785feabcd123
[DA:B0:75:XX:XX:XX][LE]> characteristics
handle: 0x0002, char properties: 0x0a, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x20, char value handle: 0x000a, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x02, char value handle: 0x000e, uuid: 000015aa-0000-1000-8000-00805f9b34fb
handle: 0x0010, char properties: 0x0c, char value handle: 0x0011, uuid: 000015ba-0000-1000-8000-00805f9b34fb
handle: 0x0012, char properties: 0x0e, char value handle: 0x0013, uuid: 000015bb-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x0c, char value handle: 0x0016, uuid: 000015ca-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 000025ca-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 000035ca-0000-1000-8000-00805f9b34fb
handle: 0x001c, char properties: 0x0c, char value handle: 0x001d, uuid: 000015da-0000-1000-8000-00805f9b34fb
handle: 0x001e, char properties: 0x12, char value handle: 0x001f, uuid: 000025da-0000-1000-8000-00805f9b34fb
handle: 0x0021, char properties: 0x0c, char value handle: 0x0022, uuid: 000035da-0000-1000-8000-00805f9b34fb
handle: 0x0024, char properties: 0x02, char value handle: 0x0025, uuid: 000015ea-0000-1000-8000-00805f9b34fb
handle: 0x0026, char properties: 0x02, char value handle: 0x0027, uuid: 000025ea-0000-1000-8000-00805f9b34fb
handle: 0x0028, char properties: 0x0e, char value handle: 0x0029, uuid: 000035ea-0000-1000-8000-00805f9b34fb
handle: 0x002a, char properties: 0x0e, char value handle: 0x002b, uuid: 000045ea-0000-1000-8000-00805f9b34fb
handle: 0x002d, char properties: 0x04, char value handle: 0x002e, uuid: 00001532-1212-efde-1523-785feabcd123
handle: 0x002f, char properties: 0x18, char value handle: 0x0030, uuid: 00001531-1212-efde-1523-785feabcd123
handle: 0x0032, char properties: 0x02, char value handle: 0x0033, uuid: 00001534-1212-efde-1523-785feabcd123
[DA:B0:75:XX:XX:XX][LE]>
맨 위에 BLE 글을 읽었다면, primary는 서비스에 해당하는 UUID를 알 수 있고,
characteristics는 서비스 내의 실제 동작을 하는 UUID를 알 수 있게된다.
이제 이 값들을 이용해서 실제로 스위처를 동작시킬 수 있다.
homebridge를 이용하면 UUID를 이용하는데, gattool에서는 characteristics의 handle값을 이용한다.(Bold체)
값 읽기.
[DA:B0:75:XX:XX:XX][LE]> char-read-uuid 000015AA-0000-1000-8000-00805f9b34fb
handle: 0x000e value: 1b
[DA:B0:75:XX:XX:XX][LE]>
char-read-uuid를 이용하여 값을 읽을 수 있다.
위에서 찾은 uuid를 막 입력해보면 어떤 값들을 읽을 수 있게된다.
hex값이 주로 읽힌다. 못읽는것도 있다. 특성에 따라서 write만 되는것들이 있다.
참고로 저 위의 값은 배터리 양을 가져오는 uuid이다. 1b는 16진수이고, 10진수로 변환하면 27이다.
실제 앱으로 보면 27%의 배터리가 남은것을 알 수 있다.
이외에도 펌웨어나 시리얼 번호등을 알 수 있었는데, 중요한건 배터리와 실제 동작이다.
값 쓰기.
[DA:B0:75:XX:XX:XX][LE]> char-write-req 11 00
Characteristic value was written successfully
값 쓰기를 통해서 실제 스위처를 컨트롤 할 수 있다.
char-write-req handle value 위와 같은 형태이다.
하나하나 해보니, handle: 0x0011, uuid: 000015ba-0000-1000-8000-00805f9b34fb
위의 UUID 값이 스위처를 컨트롤 한다.
값은 아래와 같다.
00 : 첫번째 스위치 켜기
01 : 첫번째 스위치 끄기
02 : 두번째 스위치 켜기
03 : 두번째 스위치 끄기
04 : 첫번째 스위치 토글
05 : 두번째 스위치 토글
해보면 진짜로 된다...