취미/Smart Home

스위처 블루투스 분석 - 언젠간 Siri에 연결될 수 있도록..

zipi 2017. 4. 20. 23:08
반응형

언젠간.. Siri에 스위처를 연동하겠다는.. 목표로 스위처 분석한 결과...


스위처는 BLE 기반으로 작동...

스위처는 BLE 기반으로 작동해서 별도의 페어링 과정이 없이 동작함.
Mac 주소만 알고 있으면 또는 스캔해서 사용하면 페어링 없이 동작..

스위처를 구매하면 사용자에게 Mac주소를 할당해서 해당 Mac주소로 동작하도록 하는것 같음.
공유코드는 이러한 Mac주소를 다른 사용자들과 같이 쓸 수 있도록 하는것 같음.


BLE에 대해선 아래 글을 읽어두니 분석할 때 도움이 많이 되었다.

Bluetooth Low Energy(BLE) 파헤치기

BLE(Bluetooth Low Energy) 이해하기



쭉 읽어보고, 실제 해보니 중요한건 Characteristic라는 UUID 값이다.

하나의 기능을 가르키는 고유 값이며, 여러개의 기능을 묶어 1개의 서비스를 나타낸다.


예를들면 스위처에서 스위치를 조작하는 기능, 그리고 스위치를 누르는 발의 길이를 조절하는 기능을 묶어서,

한개의 서비스로 만드는 것이다.


스위처를 조작하려면 Characteristic를 알아야 하고, 해당 Characteristic에 원하는 값을 실어서 보내면,

BLE통신으로 스위처에서 처리하게 된다.



스위처 분석하기...

스위처를 분석하기 위해서 Linux(Ubuntu 16.04 이용)을 이용하여 진행하였다.

한성 스마터 X1을 이용하였으며, 별도의 블루투스 동글을 이용하였다.

참고로.. 스마터 X1에는 내장된 블루투스가 있는데, 신호가 완전히 잡히지 않는다. 설계 불량 같다.
그리고.. 별도 동글도 연결하였으나 신호가 잘 안잡힌다. 케이스 문제 같다...
별도로 외장 USB 케이블을 이용하니 잘 된다... 처음에 이것때문에 몇일을 허비했다... 
신호가 안잡혀서 블루투스 동글이 문제인건지.. Linux에 드라이버가 안설치된건지... 



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 : 두번째 스위치 토글



해보면 진짜로 된다...



언젠간 Siri에...

아직은 명령어로만 하는데..
siri에 연동되도록 찾아봐야 할것 같다.

오픈소스로 나온것은 On/Off로 0과 1만되기 때문에 소스 수정이 필요하다.
더구나.. 현재 어떤 상태인지 알 수가 없다...

이게 꽤나 중요한것 같은데.. 현재 상태를 알 수 없으면 동작이 안한은것 같다...
스위처에서 값을 읽을 수 있으면 좋겠는데 못읽는다..

분명히 켰으면 내부적으로 켰다고 알고 있을듯 한데.. 못읽다니.. 아쉽다..


반응형