2015년 12월 17일 목요일

Insight Bluetooth로 직접 연결하기

USB Dongle 이 동작하는 것을 확인하고 Bluetooth 로 직접 연결 하기 위해 이것저것 해 보았다.

emotiv SDK 가 browser 만 봐도 chrome45 이전 NPAPI 로 구현 되어 있어서 '쓰고 싶으면
사용자가 chrome 을 다운그레이드 해서 써라' 라는 당당한 요구를 하는 것만 봐도 얼마나 느리고
보수적인 개발환경일지 예상은 했는데... 결론 부터 말하면 Ubuntu 에서는 아직 bluetooth
직접 연결로 insight 를 사용할 수 없다.

github 의 readme 를 보면,



'Insight 와 EPOC+ 를 지원하고 (BTLE 와 USB dongle 모두)'... 라고 쓰여 있고 Linux 를 지원 한다고 명시 되어 있어서 당연히 Linux 의 BTLE 를 insight 에서 지원한다고 생각했는데
모든 플랫폼과 지원 조건이 'AND' 는 아닌 것을 저렇게 모호하게 다 지원하는 것처럼 써 놨다.

더군다나 'community-sdk/doc/Ubuntu BTLE with BlueZ' 에 보면 'Connecting Emotiv device via BTLE on Ubuntu 14.04 with BlueZ library' 라는 가이드가 있으니 오해하기 딱 좋다.

위 문서의 가이드 대로 따라하면 ubuntu 14.04 이상의 환경에서 bluez-5.36 을 사용하여 insight 와 BTLE (Bluetooth Low Energy) 로 (Ubuntu Desktop 이나 Laptop 에 bluetooth4.0 을 지원하는 동글이나 칩셋이 있어야 하고 빈번한 재부팅과 insight 의 전원을 수시로 껐다 켰다해야 하는 불편함이 있긴 하지만) 연결은 할 수 있다.

가이드를 따라하면 systemd 을 disable 시켜 버리기 때문에 insight 만을 쓰기 위한 ubuntu 가 아닌 이상 주력 데탑으로 쓰는 ubuntu 를 망칠수가 없어서 나는 기존 ubuntu 에 설치 되어 있는
'bluez-5.35-0ubuntu2' 패키징을 재사용해서 bluez-5.36 으로 바꿔 치기 한 다음에 systemd
enable 된 상태에서 설치 하고 사용했다. 5.35와 5.36의 차이가 BTLE 의 gatt 지원의 차이인듯 싶다.

가이드에 step by step 으로 bluez upgrade 방법이 적혀 있으므로 자세한 설명은 생략하고,
BTLE 로 insight 와 Pairing 을 하고 나면 아래와 같은 로그를 볼 수 있다.

$ bluetoothctl 
[NEW] Controller 00:19:0E:17:A2:64 my-DeskTop-System-0 [default]
[NEW] Device C6:64:7D:53:E8:BE Insight (59684XXX)
[CHG] Device C6:64:7D:53:E8:BE Connected: yes
[NEW] Service /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0001 Generic Access Profile (Primary)
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0001/char0002 Device Name
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0001/char0004 Appearance
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0001/char0006 Peripheral Preferred Connection Parameters
[NEW] Service /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0008 Generic Attribute Profile (Primary)
[NEW] Service /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009 Vendor specific (Primary)
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009/char000a Vendor specific
[NEW] Descriptor /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009/char000a/desc000c Client Characteristic Configuration
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009/char000d Vendor specific
[NEW] Descriptor /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009/char000d/desc000f Client Characteristic Configuration
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0009/char0010 Vendor specific
[NEW] Service /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0012 Battery Service (Primary)
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0012/char0013 Battery Level
[NEW] Descriptor /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0012/char0013/desc0015 Client Characteristic Configuration
[NEW] Service /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016 Device Information (Primary)
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Manufacturer Name String
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0019 Serial Number String
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char001b Hardware Revision String
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char001d Firmware Revision String
[NEW] Characteristic /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char001f Software Revision String

추가로 위 Characteristic 중 'Manufacturer Name String' 을 읽어 보면 'Emotiv' 를 읽어온다.

[bluetooth]# connect C6:64:7D:53:E8:BE
Attempting to connect to C6:64:7D:53:E8:BE
Connection successful
[Insight (596842D3):/service0016]# select-attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017
[Insight (596842D3):/service0016/char0017]# read
Attempting to read /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x45
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x6d
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x6f
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x74
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x69
[CHG] Attribute /org/bluez/hci0/dev_C6_64_7D_53_E8_BE/service0016/char0017 Value: 0x76
45 6d 6f 74 69 76 Emotiv

이렇게 연결 되고 나면 HOGP (HID Over Gatt Profile) 로 insight 의 정보를 받아와야 하는데
USB dongle 에서 만들어 뒀던 helloworld 를 사용해서 테스트를 해보면 아무런 동작을 하지 않는다.

dbus-monitor 을 봐도 syslog 를 봐도 BTLE 에 관련된 어떤 동작도 찾아 볼 수 없다.
libedk.so 의 소스코드가 공개되지 않아서 추측 밖에 할 수 없지만, linux library 에 BTLE 기능이
포함되지 않았거나 아직 배포 하지 않은 것으로 보여진다.

같은 조건으로 windows 환경에서는 BTLE 가 정상 동작 하는 것으로 보아 내 추측이맞을 확률이 높고 조만간 linux sdk 를 update 해주면 사용할 수 있을 것 같다. 당분간은 USB dongle 로만 사용해야 할 것 같다. 참고로 안드로이드 에서도 동작하는 것으로 보이나 아쉽게도 nexus6 를 사용하는 나로서는
확인할 방법이 없다. forum 에서도 nexus6 사용자들이 불만을 토로 하고 있는데 안드로이드 마쉬멜로 6.0.1 에서 BTLE 에 관한 patch 가 있을거라고 하니 좀 기다려 봐야 겠다.

댓글 없음: