Upload
recruit-technologies
View
421
Download
2
Embed Size (px)
Citation preview
UriBeacon• 今回はUriBeaconを用意しました
• 配置しておくのでここからURIを拾ってみます
• 興味のある人はConfigで値を変えてみてください
• https://itunes.apple.com/us/app/physical-web/id927653608?mt=8 (公式アプリ)
UriBeacon• 自分で用意する場合
• https://github.com/google/uribeacon/tree/master/beacons (iOSはNG, Androidは5以降でデバイスが対応してるものなら)
• 購入する場合(技適マーク注意)
• https://www.blesh.com/product/blesh-pack-3-beacons/
Bluetooth Classic
• 旧来のよく知られているBluetooth
• LEとの差別化のためにClassicと呼ばれる
• 2000年くらいから流行
• ユビキタスネットワーク -> 最近でいうところのIoT
• 高速化を追求
• 他の無線技術とあまり差別化できなくなってきていた
Bluetooth Low Energy (BTLE)
• LE = Low Energy (省エネ)
• Bluetooth 4.0から
• それまで(Bluetooth Classic)は高速化を追求
• 別物と考えるくらいで
• 4.0=LEではなく、4.0の中にLEの他にHS(HightSpeed)なども
Paring• 旧来のBluetoothでは基本的にデバイスのペアリング必要。2.1以上ではSecure Simple Paring
• Just Works
• Out of Band (NFCとか)
• Passkey Entry
• Numeric Comparison
• iBeaconなどに見られるようにLEではペアリングの無いユースケースがほとんど
• LEも似たようなモデルがあり、PassKeyEntryも一応存在するし、逆に、上に上げたように、ClassicにもJust Worksがあり、確認なしで使える仕様も存在はする。
• とはいえ、LE用のSDK/チップではJust Worksしか採用されてなかったりする
Bluetoothのネットワークトポロジピコネット
ClassicではMaster/Slaveという言い方をして、 Central/Peripheralとは言わない
Central
Peripheral
例: PC
例: キーボード マウス
Peripheral
例: 室温系
Peripheral
例: 体重系
ペリフェラルがサービスの主体になるデータを提供するケース (ペリフェラルがサーバー、セントラルがクライアント)
が多い
複数のデバイスとやりとりする中心になるのがセントラル
ペリフェラルにデータをWriteするケースもある サーモスタットの温度とか(設定系)
Bluetoothのネットワークトポロジスキャタネット
MasterSlave
例: PC
例: キーボード マウス
Slave
例: 室温系
Slave
例: 体重系Master
例: ヘッドホン
Slave
ヘッドホンなどは主体となるデータ(音声データ)の置き場はPC側になり、データの流れが逆になる
Masterは同時にSlaveとなり、他のピコネットに参加することができる
Advertising Packet• サービスのUUID • LocalName • その他
ネットワークへの参加
Observer Broadcaster(Peripheral)(Central)
ペリフェラルは周期的にアドバタイジングパケットを発信 「こんなサービスを提供していますよ」という情報
Advertising Packet• サービスのUUID • LocalName • その他
ネットワークへの参加
Observer Broadcaster(Peripheral)(Central)
セントラルは周期的にスキャンを行い、 周囲からアドバタイジングパケットを探す。
Scan Response
ネットワークへの参加
Observer Broadcaster(Peripheral)(Central)
ペリフェラルは、Scan Requestを受け取った場合はScan Responseを返す。 アドバタイジングパケットに乗り切らない情報をここに載せることが出来る 最初のアドバタイジングパケットが大きすぎると省エネ的にも良くない。
Advertising Packet• サービスのUUID • LocalName • その他
接続要求
ネットワークへの参加
Central Peripheral
セントラルは受け取った情報から UUIDなどを見て、つなぎたいサービスかどうか判断。
サービスを受けたい場合は接続要求を ペリフェラルに投げて接続を開始
接続が完了するとBroadcaster/Observerとしての役目は終わり、 Peripheral/Centralとなる
ポーリング
CentralとPeripheralのやりとり
Central Peripheral
接続が完了するとセントラルは定期的に、空パケットで ポーリングを行い接続を維持する。要はPing。
必要だったらポーリングのレスポンスにデータを載せたり。
CentralとPeripheralのやりとり
Central Peripheral
周波数チャンネル
混線によるノイズを避けるために 周波数ホッピングを行い、 チャンネルを切り替えながら通信する
ClassicでもLEでも周波数ホッピングは あるが、LEではホッピングの回数が 少なくなるよう工夫されている。
Profile
Host
Controller
Profiles (Application)
HCI - Host Controller Interface
物理層
あらかじめ用意された アプリケーション仕様(Profile)
ヘッドセット、キーボードなどの入力、オーディオなど Bluetoothでの利用されるような機能は Profile仕様が最初から用意されている
• HSP(HeadSetProfile) • HIDP(HumanInterfaceDeviceProfile) • …
Profile
Host
あらかじめ用意されたものでなくて、自由にサービスを設計したいときは?
Classicの場合はSPP(Serial Port Profile)
LEの場合はGATT(General Attribute Profile)
GATT
Central
Peripheral
サービス
Peripheralが提供するサービスとはどんなもの?
室温計の例
現在の室温: 28度
READ
センサーから取得できる変動値サービスが提供する値を 読み取ることができる
GATT
Central
Peripheral
サービス
Peripheralが提供するサービスとはどんなもの?
サーモスタットの例
設定温度: 28度
WRITE
機械の内部のconfig値
スイッチ: offコントロールポイント
一つのサービスは 複数の値をもてる
サービスが提供する値に 書き込むことができる
GATT
Peripheral
サービス
設定温度: 28度機械の内部のconfig値
スイッチ: offコントロールポイント
characteristic
characteristic
Centralから読み書きさせることが出来る これらの値のことをcharacteristicと呼ぶ
一つのサービスは複数のcharacteristicを持てる
読み書き以外に、値が変化したときの通知依頼も
GATT
Peripheral
サービス
設定温度: 28度機械の内部のconfig値
スイッチ: offコントロールポイント
一つのPeripheralは複数のサービスを持つことが出来る
サービス
現在の室温: 28度センサーから取得できる変動値
Bluetooth LEのサービス利用手順まとめ
• Peripheralとして振る舞うデバイスがアドバタイズ
• Centralとして振る舞うデバイスがスキャンしてアドバタイジングパケットを発見
• CentralやPeripheralに接続して、目的のサービスを検索
• サービスの中から目的のCharacteristicを発見し、読み書き等
iOS/Androidでのsupport状況
• iOSは5.0からBTLEがSDK(CoreBluetooth)に、まずはセントラルのみ。6以降でペリフェラルとしても動作可能。なのでほぼ普及済と考えられる。
• Androidは4.3からBTLE(セントラル)搭載。Preview Lからペリフェラルとしても動作可能。Preview Lからはle用にパッケージが別になったので、4.3のときに使えたセントラル用のAPIも刷新されてる。
iOS/AndroidでのBluetooth Classic
• LEサポート前からClassicのほうは利用できた
• LEのようにGATTがないので、既存のプロファイルにない自由なサービスを使おうとするとSPP(serial port profile)を使う必要がある
• iOSではAppleからMFi (Made for iPhone)を取得する必要
iOS/Androidでのsupport状況
iOSではLEが簡単でClassic&SPPがMFiのため面倒 AndroidではSPPは簡単、LEは普及に時間かかりそう
iOSとAndroidで通信したい場合は悩ましい
iBeacon
Advertising Packet• サービスのUUID • LocalName • その他
Broadcaster(Peripheral)Broadcasterとしてのみ
振る舞うBTLEデバイス
パケットの送信距離が10m程度なのを利用して データ転送よりも近接検知に利用
用語の注意
• iBeaconが近接検知技術と言われるが
• NFCなどのスマートカード界隈では近接(proximity)は10cm以内、70cm以内だと近傍(vicinity)とか
iBeaconの近接 = BTLEのパケット送信可能距離
ICカードの近接 = カード/リーダで電磁誘導が発生する距離
iBeacon
Advertising Packet
ビーコン
Advertising Packet
電波が届く距離までビーコンに近寄ったことがわかる 電波強度(RSSI)からアバウトに距離の推測 ノイズの問題もあり正確には分からない。ビーコンの方位もわからない。
iBeacon
ビーコン
Advertising Packet
ビーコンが飛ばすパケットにはUUIDと二つの16bit整数値(major/minor)がある
UUIDを指定して監視しておいて、対応するアプリでアクションを実行したり、 PassKitでクーポンを表示したり。
UUIDmajor/minor
iBeacon
ビーコンA
二つの数値を利用して、どのビーコンに近接したかの判断
施設内での移動の検知
ビーコンB
Advertising Packet
UUIDmajor: 1 minor: 1
Advertising Packet
UUIDmajor: 1 minor: 2
iBeaconでのBTLEまとめ
• Bluetooth LE の Broadcasterである
• Peripheral/Central間で接続確立&データ転送はしない
• Advertising Packetの中に収まるデータしか使えない
•major/minorという16bit整数値二つ入れる
Bluetooth LEの利用の仕方自体はものすごくシンプル
実装してみる
• https://github.com/google/uribeacon/tree/master/ios-uribeacon
• ライブラリ使えば超簡単!
Android• https://github.com/google/uribeacon/blob/master/android-uribeacon/uribeacon-sample/src/main/java/org/uribeacon/sample/UriBeaconScanActivity.java
• https://github.com/google/physical-web/blob/master/android/PhysicalWeb/app/src/main/java/org/physical_web/physicalweb/UriBeaconDiscoveryService.java
UriBeaconリポジトリのサンプル
Physical Webリポジトリの公式アプリコード (Serviceなどちゃんと使ってるのでしっかり作るならこっちを参考に)
BLEのAPI自体はOSのものをそのまま使い、パケットのパースなどはライブラリを使う
APIを自分で用意するには?
• https://github.com/google/physical-web/tree/master/web-service
• handlers.pyのResolveScanが主役
公式にpythonで書かれたサンプルがあります
今回はAPIを用意してあるので それを叩いてみましょう
http://atl-phyweb.net/resolve-scan
前ページで注釈したように 少し古いバージョンになっています
やってることは• JSONのencode/decode
• 圧縮URLの展開
• 目的のURLをHTTP GETして取得したHTMLをパースしてデータを取得
• キャッシュ
そこまで大したことはしてないので自作も難しくはない
さらに
• UITableViewでリストとして表示してみましょう
• タップするとopenURLでブラウザ上で開くとか、あるいはWebViewで開くようにしてみましょう
• 同じURLに対して毎回解決しないようにキャッシュ機構を用意してみましょう