bonxを支える技術:bluetooth編 ~bluetoothを120%使い倒す方法~

27
BONXを支える技術:BluetoothBluetooth120%使い倒す方法 麻植泰輔 / Taisuke Oe Twitter: @OE_uia GitHub: taisukeoe

Upload: taisuke-oe

Post on 14-Jan-2017

1.944 views

Category:

Software


0 download

TRANSCRIPT

Page 1: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXを支える技術:Bluetooth編Bluetoothを120%使い倒す方法

麻植泰輔 / Taisuke OeTwitter: @OE_uiaGitHub: taisukeoe

Page 2: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

自己紹介

麻植泰輔 / OE TAISUKE

- ScalaMatsuri co-chair- deeplearning4j/nd4s author

BONX

- Androidアプリをスクラッチから開発

したり

- 中国に飛んでファームを直したり

- iOS/Androidプラットフォーム間の

差を吸収する仕様考えたり

- Android OSのBLEバグとか機種依

存バグとか戦ったり

- 色んなBad Know-Howを日々貯め

るお仕事をしています

Page 3: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

今日話すこと BONXは、Bluetoothでも

● Bluetooth Low Energy● Classic Bluetooth

両方を活用した珍しいサービス

です。

今回はBLEの基礎を解説しな

がら、このあたりを紐解いてご

紹介します。

Page 4: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXとは?野外の激しい運動中でも

複数の仲間とスムーズに

コミュニケーションを取れる

サービス

Page 5: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

「複数の仲間とスムーズに」?

周囲にいるユーザーの発見

し、ルームに招待して通話を開

始する機能を

Bluetooth Low Energy

で実現しています

Page 6: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Bluetooth Low Energy?

Page 7: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Bluetooth Low Energy?

● Bluetoothの規格の一種、Bluetooth 4.0の別称。3.0以前と互換性はない。

● 最近のiOS, Android端末はだいたい対応している

○ iPhone4S / iOS 6 以上

○ Android 4.3以上(一部機能は5.0以上かつ、チップセット依存有)● 省電力、低コストなので、色んなデバイスに備え付けやすい(IoT!)● 通信距離は場合によるが数m ~ 数十m程度

他にも色々ありますが、今日はBLEについて2つのポイントだけ覚えてください。

Page 8: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Bluetooth Low Energyの2つのフェイズ

Scanと

Connect

Page 9: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE Scan? ● 周囲のBLEデバイスが発信している信

号(Advertise)を発見するプロセス

● BLEの信号の中には様々な情報

(UUID、Local Name, 製造者情報など)が含まれている(Advertise Packet)ので、Scan時にフィルタリングも可能。

● 見つける側をCentral、見つけられる側

をPeripheral(ペリフェラル)と呼びま

す。

Advertise

Scan

見つける側(Central)

見つけられる側(Peripheral)

Page 10: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE ScanでBONXアプリのBLEの信号を見つける

● BONXアプリは、見つける側、見つけら

れる側両方の機能がある

● 招待用のUUIDを含むBLEの信号

(Advertise Packet)のみを取得

近くにいるユーザー同士がお互いのデバイ

スを発見可能(Scan時点ではお互いが「誰

か」は分からない)

BONXユーザー(Central)

他のBONXユーザー(Peripheral)

招待用UUIDを含むPacket

Page 11: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE Connect(接続)?

● BLEデバイス同士が接続を確立するプロ

セス。

● 接続される側(GATT Server)の、データ構

造(Characteristic)を通じて、データのや

り取りが可能。○ Read○ Write○ Notification

接続する側(Central /

GATT Client)

接続される側(Peripheral /

GATT Server)

接続

Page 12: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE Connectして、ユーザーIDを読み取る

● GATT ServerとなっているBONXユーザー

のユーザーIDを、ユーザーID用Characteristicから読み取るREAD

ユーザーID

読む側(GATT Client)

読まれる側(GATT Server)

Page 13: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE Connectして、ルームへ招待する

● GATT Serverの招待用Characteristicに値を書き込むことで、GATT Serverに招待

したことを通知する

WRITE

招待する側(GATT Client)

招待される側(GATT Server)

Page 14: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BLE 招待スキームの問題点

Page 15: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

AndroidのBLEサポート対応状況が複雑

● BLE Central(見つける側), Peripheral(見つけ

られる側)両方の機能が必要

● AndroidでBLE Peripheral機能のサポート状

況が複雑で、かつサポートしている端末が少

ない○ Android OSでのサポート状況

○ Android ハードウェアでのサポート状況

Scan

見つける側(Central)

見つけられる側(Peripheral)

BLE Advertise

Page 16: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Android OSのサポート状況

● BLE Central関連APIは4.3以上

● BLE Peripheral関連API(Advertiseを含む)は5.0以上

Scan

見つける側(Central)

見つけられる側(Peripheral)

Android 5.0以上しかBLE Peripheral機能をサポートでき

ない(2016年4月時点:シェア40.4%)

Android ~ 4.4

Page 17: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Scan

見つける側(Central)

見つけられる側(Peripheral)

Android ハードウェア側のサポート状況

● Androidで現在使われているBluetoothプロ

トコル・スタック Bluedroidは、AdvertiseのAPIがBroadcomチップのベンダ独自のHCIコマンド “multiple advertisement”に依存し

ている(抽象化の意味…)● このHCIコマンドに対応した無線チップが搭

載された端末でなければAdvertiseできない

● このHCIコマンドに対応しているかどうかは、

端末スペックから類推できない(!!)

AndroidBroadcomチップの命令に非準拠

Android 5.0以上で、なおかつBroadcomのHCIコマンド

に対応したチップを搭載している端末しかBLE Advertiseできない(シェア:40%未満)

http://taisukeoe.github.io/blog/2015/12/24/android-ble/

Android ハードウェアのサポート状況

Page 18: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

解決策: BONXイヤフォンがAndroid BLEを補完する

Page 19: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXイヤフォンが代わりにBLE Advertiseする

SPP接続

BLE Advertise

Scan

BONXイヤフォンとペアリングしてるAndroid(BLE Advertise不可)

見つける側(Central)

見つけられる側(Peripheral)

BONXイヤフォンが搭載しているCSR製Bluetoothモジュール

はBluetooth Low Energy(v4.0)とClassic Bluetooth(v3.0以前)の両方に対応したデュアルチップ

Page 20: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

SPP接続BLE接続

見つける側(Central)

見つけられる側(Peripheral)

BONXイヤフォンはBluetooth デュアルチップを搭載している

ため、ペアリング中のAndroid端末とのSPP接続と、「見つける

側」の端末とのBLE接続を同時にできる

BONXイヤフォンとペアリングしてるAndroid(BLE Advertise不可)

BONXイヤフォンはBLEとSPPを橋渡しする

Page 21: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXイヤフォンはBLEとSPPを橋渡しする

SPP接続

ユーザーIDREAD

ユーザーID

BLE接続

BONXイヤフォンとペアリングしてるAndroid(BLE Advertise不可)

ペアリング中のAndroid端末からSPP経由でユーザーIDを書

き込むと、BONXイヤフォンのユーザーID用Characteristicに格納されるため、「読む側(GATT Client)」は何も意識せず

ユーザーIDを取得できる

読む側(GATT Client)

読まれる側(GATT Server)

Page 22: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXイヤフォンはBLEとSPPを橋渡しする

SPP接続BLE接続

BONXイヤフォンとペアリングしてるAndroid(BLE Advertise不可)

招待する際も同様に、BONXイヤフォンの招待用

Characteristicへの書き込みを検知したら、ペアリング中の

Android端末にSPP経由で同じ値を書き込むため、「招待する

側(GATT Client)」は何も意識しなくてよい

WRITE WRITE

招待する側(GATT Client)

招待される側(GATT Server)

Page 23: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXイヤフォンの通話中の各種機能

BONXイヤフォンとペアリングしてる端末

BONXイヤフォンのボタン機能もBLE(iOSの場合)ないしはSPP(Androidの場合)で実現している。

通話開始時にはこれらのプロファイルでのBluetooth接続に加

えて、HFPで接続し音声データを送受信する

VOICESERVER

HFP(音声通話)

SPP(ボタン機能)

BLE(ボタン機能)

VOICESERVER

Page 24: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

BONXを支える技術: Bluetooth編 まとめ

iOS Android BONXイヤフォン

BLE周囲のユーザー発見招待の通知BONXイヤフォンのボタン機能

周囲のユーザー発見招待の通知

他のユーザーに発見・招待してもらう(一部のAndroid向け)ボタン機能(iOS向け)

Classic BT

SPP 使用しない

BONXイヤフォンのBLE Advertise状態及びデータの制御BONXイヤフォンのボタン機能

AndroidからのBLE Advertise制御への応答ボタン機能(Android向け)

HFP 音声通話電話着信応答

音声通話電話着信応答

音声通話電話着信応答

種々のBluetoothプロファイルを

あらゆる場面で使い倒しています!

Page 25: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

Futher Reading...

BLEについてもっと知りたい人は

堤修一さん(BONXのiOSのBLE招待フローの原案者)、松村礼央さん共著の

「iOSxBLE Core Bluetoothプログラミング」

を読みましょう!

http://www.amazon.co.jp/dp/4883379736

Page 26: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

We are hiring!

BONXサービスを提供しているチケイ株式会社で

は、ソフトウェアエンジニアを大募集しています!

● Androidエンジニア (Bluetoothアレコレ,VOIP, Netty, ReactiveX, Scala...)● iOSエンジニア (Bluetoothアレコレ,Core Audio, VOIP, Swift...)● サーバーエンジニア(Go lang, Ruby, AWS….)

興味ある方は、お気軽にお声がけください

Page 27: BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~

ご静聴ありがとうございました。ご質問は懇親会で!