SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
BONXを支える技術:Bluetooth編
Bluetoothを120%使い倒す方法
麻植泰輔 / Taisuke Oe
Twitter: @OE_uia
GitHub: taisukeoe
自己紹介
麻植泰輔 / OE TAISUKE
- ScalaMatsuri co-chair
- deeplearning4j/nd4s author
BONX
- Androidアプリをスクラッチから開発
したり
- 中国に飛んでファームを直したり
- iOS/Androidプラットフォーム間の
差を吸収する仕様考えたり
- Android OSのBLEバグとか機種依
存バグとか戦ったり
- 色んなBad Know-Howを日々貯め
るお仕事をしています
今日話すこと BONXは、Bluetoothでも
● Bluetooth Low Energy
● Classic Bluetooth
両方を活用した珍しいサービス
です。
今回はBLEの基礎を解説しな
がら、このあたりを紐解いてご
紹介します。
BONXとは?
野外の激しい運動中でも
複数の仲間とスムーズに
コミュニケーションを取れる
サービス
「複数の仲間とスムーズに」?
周囲にいるユーザーの発見
し、ルームに招待して通話を開
始する機能を
Bluetooth Low Energy
で実現しています
Bluetooth Low Energy?
Bluetooth Low Energy?
● Bluetoothの規格の一種、Bluetooth 4.0の別称。3.0以前と互換性はない。
● 最近のiOS, Android端末はだいたい対応している
○ iPhone4S / iOS 6 以上
○ Android 4.3以上(一部機能は5.0以上かつ、チップセット依存有)
● 省電力、低コストなので、色んなデバイスに備え付けやすい(IoT!)
● 通信距離は場合によるが数m ~ 数十m程度
他にも色々ありますが、今日はBLEについて2つのポイントだけ覚えてください。
Bluetooth Low Energyの2つのフェイズ
Scan
と
Connect
BLE Scan? ● 周囲のBLEデバイスが発信している信
号(Advertise)を発見するプロセス
● BLEの信号の中には様々な情報
(UUID、Local Name, 製造者情報など)
が含まれている(Advertise Packet)の
で、Scan時にフィルタリングも可能。
● 見つける側をCentral、見つけられる側
をPeripheral(ペリフェラル)と呼びま
す。
Advertise
Scan
見つける側
(Central)
見つけられる側
(Peripheral)
BLE ScanでBONXアプリのBLEの信号を見つける
● BONXアプリは、見つける側、見つけら
れる側両方の機能がある
● 招待用のUUIDを含むBLEの信号
(Advertise Packet)のみを取得
近くにいるユーザー同士がお互いのデバイ
スを発見可能(Scan時点ではお互いが「誰
か」は分からない)
BONXユーザー
(Central)
他のBONXユーザー
(Peripheral)
招待用UUIDを含む
Packet
BLE Connect(接続)?
● BLEデバイス同士が接続を確立するプロ
セス。
● 接続される側(GATT Server)の、データ構
造(Characteristic)を通じて、データのや
り取りが可能。
○ Read
○ Write
○ Notification
接続する側
(Central /
GATT Client)
接続される側
(Peripheral /
GATT Server)
接続
BLE Connectして、ユーザーIDを読み取る
● GATT ServerとなっているBONXユーザー
のユーザーIDを、ユーザーID用
Characteristicから読み取るREAD
ユーザーID
読む側
(GATT Client)
読まれる側
(GATT Server)
BLE Connectして、ルームへ招待する
● GATT Serverの招待用Characteristicに
値を書き込むことで、GATT Serverに招待
したことを通知する
WRITE
招待する側
(GATT Client)
招待される側
(GATT Server)
BLE 招待スキームの問題点
AndroidのBLEサポート対応状況が複雑
● BLE Central(見つける側), Peripheral(見つけ
られる側)両方の機能が必要
● AndroidでBLE Peripheral機能のサポート状
況が複雑で、かつサポートしている端末が少
ない
○ Android OSでのサポート状況
○ Android ハードウェアでのサポート状況
Scan
見つける側
(Central)
見つけられる側
(Peripheral)
BLE Advertise
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
Scan
見つける側
(Central)
見つけられる側
(Peripheral)
Android ハードウェア側のサポート状況
● Androidで現在使われているBluetoothプロ
トコル・スタック Bluedroidは、Advertiseの
APIがBroadcomチップのベンダ独自のHCI
コマンド “multiple advertisement”に依存し
ている(抽象化の意味…)
● このHCIコマンドに対応した無線チップが搭
載された端末でなければAdvertiseできない
● このHCIコマンドに対応しているかどうかは、
端末スペックから類推できない(!!)
Android
Broadcomチップ
の命令に非準拠
Android 5.0以上で、なおかつBroadcomのHCIコマンド
に対応したチップを搭載している端末しかBLE Advertise
できない(シェア:40%未満)
http://taisukeoe.github.io/blog/2015/12/24/android-ble/
Android ハードウェアのサポート状況
解決策:
BONXイヤフォンがAndroid BLEを補完する
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以
前)の両方に対応したデュアルチップ
SPP接続BLE接続
見つける側
(Central)
見つけられる側
(Peripheral)
BONXイヤフォンはBluetooth デュアルチップを搭載している
ため、ペアリング中のAndroid端末とのSPP接続と、「見つける
側」の端末とのBLE接続を同時にできる
BONXイヤフォンと
ペアリングしてるAndroid
(BLE Advertise不可)
BONXイヤフォンはBLEとSPPを橋渡しする
BONXイヤフォンはBLEとSPPを橋渡しする
SPP接続
ユーザーID
READ
ユーザーID
BLE接続
BONXイヤフォンと
ペアリングしてるAndroid
(BLE Advertise不可)
ペアリング中のAndroid端末からSPP経由でユーザーIDを書
き込むと、BONXイヤフォンのユーザーID用Characteristicに
格納されるため、「読む側(GATT Client)」は何も意識せず
ユーザーIDを取得できる
読む側
(GATT Client)
読まれる側
(GATT Server)
BONXイヤフォンはBLEとSPPを橋渡しする
SPP接続BLE接続
BONXイヤフォンと
ペアリングしてるAndroid
(BLE Advertise不可)
招待する際も同様に、BONXイヤフォンの招待用
Characteristicへの書き込みを検知したら、ペアリング中の
Android端末にSPP経由で同じ値を書き込むため、「招待する
側(GATT Client)」は何も意識しなくてよい
WRITE WRITE
招待する側
(GATT Client)
招待される側
(GATT Server)
BONXイヤフォンの通話中の各種機能
BONXイヤフォンと
ペアリングしてる端末
BONXイヤフォンのボタン機能もBLE(iOSの場合)ないしはSPP
(Androidの場合)で実現している。
通話開始時にはこれらのプロファイルでのBluetooth接続に加
えて、HFPで接続し音声データを送受信する
VOICE
SERVER
HFP(音声通話)
SPP(ボタン機能)
BLE(ボタン機能)
VOICE
SERVER
BONXを支える技術: Bluetooth編 まとめ
iOS Android BONXイヤフォン
BLE
周囲のユーザー発見
招待の通知
BONXイヤフォンのボタ
ン機能
周囲のユーザー発見
招待の通知
他のユーザーに発見・招待し
てもらう(一部のAndroid向け)
ボタン機能(iOS向け)
Classic
BT
SPP 使用しない
BONXイヤフォンのBLE
Advertise状態及びデータ
の制御
BONXイヤフォンのボタン
機能
AndroidからのBLE Advertise
制御への応答
ボタン機能(Android向け)
HFP 音声通話
電話着信応答
音声通話
電話着信応答
音声通話
電話着信応答
種々のBluetoothプロファイルを
あらゆる場面で使い倒しています!
Futher Reading...
BLEについてもっと知りたい人は
堤修一さん(BONXのiOSのBLE招待フローの原案者)、松
村礼央さん共著の
「iOSxBLE Core Bluetoothプログラミング」
を読みましょう!
http://www.amazon.co.jp/dp/4883379736
We are hiring!
BONXサービスを提供しているチケイ株式会社で
は、ソフトウェアエンジニアを大募集しています!
● Androidエンジニア (Bluetoothアレコレ,VOIP, Netty, ReactiveX, Scala...)
● iOSエンジニア (Bluetoothアレコレ,Core Audio, VOIP, Swift...)
● サーバーエンジニア(Go lang, Ruby, AWS….)
興味ある方は、お気軽にお声がけください
ご静聴ありがとうございました。
ご質問は懇親会で!

Contenu connexe

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

CoreBluetoothでつくるBluetooth Low Energyデバイス
CoreBluetoothでつくるBluetooth Low EnergyデバイスCoreBluetoothでつくるBluetooth Low Energyデバイス
CoreBluetoothでつくるBluetooth Low EnergyデバイスShin Ise
 
COCOA検証用アプリの開発はいかに大変か.pptx
COCOA検証用アプリの開発はいかに大変か.pptxCOCOA検証用アプリの開発はいかに大変か.pptx
COCOA検証用アプリの開発はいかに大変か.pptxMasuda Tomoaki
 
Microsoft bot frameworkを触ってみた
Microsoft bot frameworkを触ってみたMicrosoft bot frameworkを触ってみた
Microsoft bot frameworkを触ってみたKazuhide Maruyama
 
NoOps Meetup Tokyo #5 Opening
NoOps Meetup Tokyo #5 Opening NoOps Meetup Tokyo #5 Opening
NoOps Meetup Tokyo #5 Opening Hiromasa Oka
 
CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ
 CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ
CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 BotのプチレシピKazumi IWANAGA
 
Android端末のroot化について
Android端末のroot化についてAndroid端末のroot化について
Android端末のroot化についてShuichi Takaya
 
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪Kazumi IWANAGA
 
TypeScript x Bot Framework
TypeScript x Bot FrameworkTypeScript x Bot Framework
TypeScript x Bot FrameworkKazumi IWANAGA
 
超高速でflutterアプリをビルドする
超高速でflutterアプリをビルドする超高速でflutterアプリをビルドする
超高速でflutterアプリをビルドするssuser34abd0
 
【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5幸夫 茅根
 
Androidとは。ちょっと変った視点から
Androidとは。ちょっと変った視点からAndroidとは。ちょっと変った視点から
Androidとは。ちょっと変った視点からdemuyan
 
DevOpsが引き金となるインフラエンジニアの進撃
DevOpsが引き金となるインフラエンジニアの進撃DevOpsが引き金となるインフラエンジニアの進撃
DevOpsが引き金となるインフラエンジニアの進撃Teruo Adachi
 
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころKazumi IWANAGA
 

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

CoreBluetoothでつくるBluetooth Low Energyデバイス
CoreBluetoothでつくるBluetooth Low EnergyデバイスCoreBluetoothでつくるBluetooth Low Energyデバイス
CoreBluetoothでつくるBluetooth Low Energyデバイス
 
COCOA検証用アプリの開発はいかに大変か.pptx
COCOA検証用アプリの開発はいかに大変か.pptxCOCOA検証用アプリの開発はいかに大変か.pptx
COCOA検証用アプリの開発はいかに大変か.pptx
 
Beaconのお話
Beaconのお話Beaconのお話
Beaconのお話
 
Wio lte iot_hub
Wio lte iot_hubWio lte iot_hub
Wio lte iot_hub
 
Microsoft bot frameworkを触ってみた
Microsoft bot frameworkを触ってみたMicrosoft bot frameworkを触ってみた
Microsoft bot frameworkを触ってみた
 
NoOps Meetup Tokyo #5 Opening
NoOps Meetup Tokyo #5 Opening NoOps Meetup Tokyo #5 Opening
NoOps Meetup Tokyo #5 Opening
 
IoT LT 大阪 20160406
IoT LT 大阪 20160406IoT LT 大阪 20160406
IoT LT 大阪 20160406
 
Winストアアプリでble接続
Winストアアプリでble接続Winストアアプリでble接続
Winストアアプリでble接続
 
真Drone入門
真Drone入門真Drone入門
真Drone入門
 
Azure Bot Service で CI/CD on Azure Dev Ops
Azure Bot Service で CI/CD on Azure Dev OpsAzure Bot Service で CI/CD on Azure Dev Ops
Azure Bot Service で CI/CD on Azure Dev Ops
 
CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ
 CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ
CLR/H #clrh104 あなたのアプリにスパイスを! ~ コグニティブと対話 Botのプチレシピ
 
Android端末のroot化について
Android端末のroot化についてAndroid端末のroot化について
Android端末のroot化について
 
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪
観たいセッションがかぶった!なんて心配ご無用。今年は、興味の赴くままにあれもこれも♪
 
TypeScript x Bot Framework
TypeScript x Bot FrameworkTypeScript x Bot Framework
TypeScript x Bot Framework
 
IoT ChatOps #IoTLT
IoT ChatOps #IoTLTIoT ChatOps #IoTLT
IoT ChatOps #IoTLT
 
超高速でflutterアプリをビルドする
超高速でflutterアプリをビルドする超高速でflutterアプリをビルドする
超高速でflutterアプリをビルドする
 
【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5
 
Androidとは。ちょっと変った視点から
Androidとは。ちょっと変った視点からAndroidとは。ちょっと変った視点から
Androidとは。ちょっと変った視点から
 
DevOpsが引き金となるインフラエンジニアの進撃
DevOpsが引き金となるインフラエンジニアの進撃DevOpsが引き金となるインフラエンジニアの進撃
DevOpsが引き金となるインフラエンジニアの進撃
 
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ
【NLU祭り 場外編】コミュニケーションをより身近に、よりかしこく。LUIS と Azure AI サービスの使いどころ
 

Plus de Taisuke Oe

プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」Taisuke Oe
 
How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1Taisuke Oe
 
Monix Taskが便利だという話
Monix Taskが便利だという話Monix Taskが便利だという話
Monix Taskが便利だという話Taisuke Oe
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits Taisuke Oe
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Taisuke Oe
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決するTaisuke Oe
 
Real World Android Akka
Real World Android AkkaReal World Android Akka
Real World Android AkkaTaisuke Oe
 
Real world android akka
Real world android akkaReal world android akka
Real world android akkaTaisuke Oe
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターンTaisuke Oe
 

Plus de Taisuke Oe (10)

プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」
 
How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1
 
Monix Taskが便利だという話
Monix Taskが便利だという話Monix Taskが便利だという話
Monix Taskが便利だという話
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決する
 
Real World Android Akka
Real World Android AkkaReal World Android Akka
Real World Android Akka
 
Real world android akka
Real world android akkaReal world android akka
Real world android akka
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
 

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