SlideShare a Scribd company logo
iBeaconを利用した
サービス開発のポイント
2014年9月
GMOインターネット
次世代システム研究室
松井、佐藤、折田、塚元、宮尾
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
1.iBeaconとは
• Appleの商標
• Location and Proximity Detection Technology
「位置と近接検出技術」
1.iBeaconとは
Bluetooth Low Energy(BLE)を
利用してシグナルを発信する機器
BLEとは
• 近距離無線通信技術Bluetoothの拡張仕様
• 極低電力で通信が可能なもの
• 2010年7月に発表されたBluetooth 4.0規格
• 免許なく使える2.4GHz帯(ISMバンド)の電波を用
い、最大1Mbpsの通信が可能。
• 対応チップは従来の1/3程度の電力で動作する
ことができ
• ボタン電池一つで数年稼働することができるとさ
れている。
1.iBeaconとは
シグナルはスマホで受信可能(Android、iOS)
1.iBeaconとは
シグナルが50m先まで届く。
スマホで距離を観測できる。
結論
• BLE利用。
• 広範囲に電波が届く。
• スマホで受信可能。
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
2.基本機能
A.構成
・ブロードキャスター・オブザーバー型
・セントラル・ペリフェラル型
B.機能
・Beaconから送られてくる信号
・スマホができること
2.基本機能
オブザーバー
(スマホ)
ブロードキャスター
(Beacon端末)
発信のみ
受信のみ
2.基本機能
ペリフェラル セントラル
���み書き
(今回は対象外)
2.基本機能
1.UUID
2.Major
3.Minor
4.RSSI
Beaconから送られる信号
Beaconから送られる信号
UUID 128ビット識別子
12345678-A1B3-B2C4-C3D5-EF567GH942E2
Major 16ビットの符号なし整数。
0~65535
Minor 16ビットの符号なし整数。
0 ~ 65535
使い道
UUID 128ビット識別子
サービスで1個
Major 16ビットの符号なし整数。
ショップなどの単位で1個
Minor 16ビットの符号なし整数。
売り場、ビルの階層、支店などの小概念で1個
RSSI
• Received Signal Strength Indicator
• 受信信号強度
• マイナスの値
• 小さいほど近い状態を表す
Beaconを受信する機器が
できること(スマホ)
1.リージョン観測
2.レンジング観測
リージョン観測
•入った
•出た
リージョン観測
入った!!!
出た!!!
レンジング観測
RSSI 電波強度からおおよその距離を図る
(調整可能)
Immediate (すごく近い) 50cm以内
Near (誓い) 50cm~6m
Far (遠い) 6m~20m
Unknown (不明) ???
レンジング観測
近 遠
結論
• ブロードキャスターオブザーバー構成で
サービス開発。
• UUID、Major、Minorでビーコンを認識できる。
• 領域出入 + 距離 を利用できる。
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
3.利用可能端末
A.iBeacon端末
B.iOS , Android
iBeacon端末
• StickNFind社
iBeacon端末
• Aplix社 MyBeacon
iBeacon端末
• Estimote社
iBeacon端末
• shopbeacon
Estimote StickNFind Aplix shopbeacon
価格 3500円 3500円 1000円 4000円
技適 ○ ○ ○ ×
電池 2年 1年 1年 5年
その他 デザイ
ンが
おしゃ
れ
サイズが
小さい。
探し物ア
プリを販
売。
安い。
セキュリ
ティ機能
が強い。
米国の
百貨店
Macy’s
実績アリ
技適マーク(ぎてきまーく)とは
⇒技適マークが付いていない無線機は、
「免許を受けられない/違法になる」恐れが
ありますので無線機を購入・使用する際は
十分ご注意下さい。
技術基準適��証明と
技術基準適合認定のいずれか
あるいは両者の認証が
なされていることを
表示するマークで、
総務省令に定められたものである。
3.利用可能端末
スマホ
[iOS]
Ver.7以降
• iPhone 4s ~
• iPad 第3世代~(mini,Airは可能)
[Android]
Ver.4.3以降
Bluetoothの大分類
• Bluetooth Smart : BLEのみ
• Bluetooth Smart Ready :BLE+クラシック
• Bluetooth :クラシックのみ
Beaconの誤解
• 対応端末でも Bluetooth OFF では使えない。
iPhoneでは
位置情報も必要
結論
• 現状はAplix社のビーコンがよい。
• iOS 7 , Android 4.3
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
NFCとは?
• 近距離無線通信技術
• 「かざす」ことで通信可能
• 低速なデータ通信
NFCとiBeaconの比較
NFC iBeacon
最大距離 20cm 50m
検知 タッチ
(能動的)
Bluetooth ON で
PUSH受信
(受動的)
対応 iOS 8
Android 2.3
iOS 7
Android 4.3
価格 100円 1000円~
電池 不要 1年~
通信 424kbps 1024kbps
同時接続 1対1 N対N
結論
• NFCは能動的
• iBeaconは受動的
• 要件に応じて利用する
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
5.サービス事例
[アメリカ]
・Masy’s
・MLB
[日本]
・スマポ
・スマート座布団
Macy’s(アメリカのデパート)
来店客の
アプリへ
商品情報、
クーポンを
通知
MLB x iBeacon
20のスタジアム
(全体の3分の2)
各スタジアム
100 個のビーコン設置
MLB x iBeacon
座席案内
MLB x iBeacon
利用回数
カウント
ホットドッグの
クーポン配布
スマポ x iBeacon
来店するとポイントが
貯められるサービス
来店時に通知を発火させる
仕組みで iBeacon を利用
(近づくと通知される)
※ポイント付与は音波
スマート座布団
座布団の下に
デバイス設置。
座った重みで
ビーコンが発火。
スマート座布団
空席情報を管理。
カフェの
混雑状況を
ログ取得し
データ解析可能。
結論
• 情報発信、クーポン配布を
PUSHできるアプリの事例が
多い。
検証アプリを
開発しました
出社アプリ
セルリアンタワー
12Fにビーコンを設置
座席に近づくと
ビーコン信号を
スマホがキャッチ
⇒ アプリで出社できる!
サーバ構成
12Fビーコン スマホ Webサーバ
⇒ TimeProを叩いて出社!
出社アプリ
デモ
リージョン観測
入った!!!
レンジング観測
近 遠
「近い」で出社可能になる
デモのまとめ
バックグラウンドリージョン観測
⇒ 範囲内ビーコン検知
⇒ ローカル通知発火
レンジング観測
⇒ 距離観測(Far⇒Near)
無事動くものができた!
サービス開発のキモ
• アプリが起動していない状態でもビーコンは
検知されるか?
• Bluetoothでバッテリーは食わないか?
• 不正は行われないか?
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
iOS, Android アプリ実装の違い
A.iOS向けアプリ実装
B.Android向けアプリ実装
C.iOS、Androidの比較
iOS実装の流れ
1.UUID定義
2.リージョン観測
3.レンジング観測
4.バックグラウンドタスク
UUID定義
// 観測対象のUUIDと識別子を定義して、
// CLBeaconRegionを作成する
let uuidString = “00000000-1234-A123-B456-E123C456D789”
let beaconIdentifier = “gmo-beacon”
let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)
let beaconRegion:CLBeaconRegion
= CLBeaconRegion(proximityUUID: beaconUUID, identifier:
beaconIdentifier )
リージョン観測
入った!!!
リージョン観測
//UUIDを指定して観測スタート
locationManager = CLLocationManager()
locationManager!.delegate = self
locationManager!.
startMonitoringForRegion(beaconRegion)
LocationManager デリゲートメソッド
開始 didStartMonitoringForRegion
入った! didEnterRegion
出た! didExitRegion
失敗! monitoringDidFailForRegion:withError
didEnterRegion
func locationManager( manager: CLLocationManager!,
didEnterRegion region: CLRegion!) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_P
RIORITY_DEFAULT, 0), {
// 境界に入ったので、レンジング観測を開始
manager.startRangingBeaconsInRegion(region as
CLBeaconRegion)
})
}
レンジング監視
近 遠
レンジングデリゲートメソッド
今の状態 didRangeBeacons:inRegion
エラー rangingBeaconsDidFailForRegion:withError:
didRangeBeacons
func locationManager( manager: CLLocationManager!,
didRangeBeacons beacons: [CLBeacon]!,
inRegion region: CLBeaconRegion!) {
for beacon in beacons {
// 指定範囲に入っていなければスキップ
If (inRangeProximity.filter {$0 == beacon.proximity}).count == 0 {
continue
}
// 同じmajor,minorの最後の測定状態を取得
var arr: [CLBeacon] = []
for lb in lastBeacons {
if lb.major == beacon.major {
if lb.minor == beacon.minor{
arr.insert(lb, atIndex: arr.count)
}
}
}
値 内容
proximityUUID UUID
major major
minor minor
proximity ビーコンとの距離
accuracy 近接値の精度
rssi 受信強度
値がすぐ取れる。 Android と異なる点
didEnterRegion時バックグラウンドタスク
// バックグラウンドだと10秒程度しか起動できないので、
// バックグラウンドタスクを作成すると180秒程度、起動可能になる。
let app = UIApplication.sharedApplication()
var bgTaskId: UIBackgroundTaskIdentifier?
bgTaskId = app.beginBackgroundTaskWithExpirationHandler({
dispatch_async(dispatch_get_main_queue(), {
if bgTaskId != UIBackgroundTaskInvalid {
app.endBackgroundTask(bgTaskId!)
bgTaskId = UIBackgroundTaskInvalid
}
})
})
iOSのポイント
1.CoreLocationを使う。
※CoreBluetoothは明示的に使わなくてよい。
2.UUIDを指定する。UUIDはMAX20件。
1UUIDにつき、65535*65535通りのIDを持てる。
3.バックグラウンドでリージョン観測。
⇒これによりアプリ未起動でも挙動。
サービスの課題をクリア
Androidアプリ実装
• リージョン観測とタイムアウト
• スキャンした情報の加工
Android向けアプリ実装
まずはパーミッション
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
BLE対応端末のみインストールさせる
<uses-feature android:name=“android.hardware.bruetooth_le” android:required="true"/>
Bluetoothマネージャの初期化
BluetoothManager mBluetoothManager =
(BluetoothManager)
getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter =
mBluetoothManager.getAdapter();
リージョン観測とタイムアウト
(iOSとの違い)
//Blutooth ON 時、バックグラウンドで常に動かす
private void connect() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBluetoothAdapter.stopLeScan(BleActivity.this);
}}, 5000); // タイムアウトを設定
// スキャン開始
mBluetoothAdapter.startLeScan(this);
}
リージョン観測後の情報の取得
private BluetoothAdapter.LeScanCallback
mLeScanCallback
= new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device,
int rssi,byte[] scanRecord) {
//UUID,major,miner,RSSIの判定処理
} }
UUID、Major、Minor
if(scanRecord.length > 30){
//iBeacon の場合 6 byte 目から、 9 byte 目はこの値に固定されている。
if((scanRecord[5] == (byte)0x4c) && (scanRecord[6] == (byte)0x00)
&& (scanRecord[7] == (byte)0x02) && (scanRecord[8] == (byte)0x15))
{
String uuid = IntToHex2(scanRecord[9] & 0xff)
+ IntToHex2(scanRecord[10] & 0xff) + IntToHex2(scanRecord[11] & 0xff)
+ IntToHex2(scanRecord[12] & 0xff) + "-"
+ IntToHex2(scanRecord[13] & 0xff) + IntToHex2(scanRecord[14] & 0xff)
+ "-” + IntToHex2(scanRecord[15] & 0xff) + IntToHex2(scanRecord[16] & 0xff)
+ "-” + IntToHex2(scanRecord[17] & 0xff) + IntToHex2(scanRecord[18] & 0xff)
+ "-” + IntToHex2(scanRecord[19] & 0xff) + IntToHex2(scanRecord[20] & 0xff)
+ IntToHex2(scanRecord[21] & 0xff) + IntToHex2(scanRecord[22] & 0xff)
+ IntToHex2(scanRecord[23] & 0xff) + IntToHex2(scanRecord[24] & 0xff);
String major = IntToHex2(scanRecord[25] & 0xff) + IntToHex2(scanRecord[26] & 0xff);
String minor = IntToHex2(scanRecord[27] & 0xff) + IntToHex2(scanRecord[28] & 0xff);
}
}
scanRecord
Byte 数 説明
1 1 ブロック目のバイト数
2,3 flag
4 2 ブロック目のバイト数
5 メーカー固有の AD type データ
6,7 会社コード(0x004C が Apple の会社コード)
8 データのタイプ(0×02 が iBeacon)
9 連なる iBeacon データのバイト数
10~25 UUID
26,27 major
28,29 minor
30
校正された電波強度(距離を求めるときの基
準値、2 の補数)
Androidのポイント
• 自分で書かないといけない部分が多い。
1.リージョン監視のタイムアウト制御
2.scanRecordの中身解析
(とくにレンジングは自分でRSSIで
距離のあたりをつける)
めんどくささ or 柔軟性?
アビダルマ
• Aplix社推奨のライブラリ。
• 2次的著作物に無料で利用可能。
• iOSに近い処理をラッパーして実現。
アビダルマの利点 その1
省電力実装
アプリ画面がフォアグラウンドにない、
またはディスプレイが 消灯している。
⇒15秒周期で 5秒間ずつリージョン観測実行。
対象UUIDの絞込み
⇒不要な通信を発生させない。
デフォルトでは0.1秒ごとにスキャンを実行し続けるので
非常に電池を食いやすい。
アビダルマの利点 その2
デバイス不具合対応
• AQUOS Xx 304SH、Nexus4、 Nexus7 不具合
⇒内部的にカバーしている。
• GALAXY S5 にて通知される受信 RSSI が他機
種と比較して低い。
他のライブラリ
Android Beacon Library
https://github.com/AltBeacon/android-beacon-library
iOS Android
利用者 ver.7以上
90%強
ver.4.3以上
20%弱
OS設定・
パーミッション
Bluetooth
位置情報
バックグラウンド
Bluetooth
観測対象 UUID指定必須 UUID指定自由
リージョン観測 頻度OS依存
UUID指定必須
頻度実装可能
UUID指定自由
レンジング観測 バックグラウンド
タスクMax180秒
実装者に依存
サービス開発のキモ
• アプリが起動していない状態でも
ビーコンは検知されるか?
⇒なんとかバックグラウンドで���れそう
• Bluetoothでバッテリーは食わないか?
• 不正は防げるか?
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
消費電力
iBeacon端末本体
⇒ これはそもそも
低電力になっているので問題ない
消費電力
・AisleLabsによる調査
・Android, iOSのBLE消費電力比較実験
http://www.aislelabs.com/reports/ibeacon-battery-phones/
http://www.aislelabs.com/reports/ibeacon-battery-drain-iphones/
バッテリーに与える影響
・周囲のビーコン個数
・スキャン回数
(リージョン観測回数)
周囲のビーコン個数
・0個
・7個
・10個
個数が多いほどスマホ電池消費が増える。
スキャンのインターバル
・0.1秒スキャン+0.1秒休む
・1秒スキャン+1秒休む
・2秒スキャン+2秒休む
頻度が狭いとスマホバッテリーを消費する。
スキャンのインターバル
・1秒スキャン+9秒休む
・5秒スキャン+5秒休む
スキャン時間が長いとバッテリーを消費する。
バッテリーに与える影響
• ビーコン個数 : 少ないほうがいい
• スキャン回数 : 少ないほうがいい
ある意味当たり前の結果!
Android側の実装の現実解
アビダルマの実装
⇒5秒スキャン + 15秒インターバル
※デフォルト1秒10回スキャンより
はこちらのほうがよい
いままでAndroid実装の
めんどくささが
目立っていたが。。。
iBeacon を利用したサービス開発のポイント
iOS7はなぜAndroidに劣るのか?
iOS側が自動的にリージョン監視
⇒Android側は頻度を実装できるので、
消費電力を意識して頻度を抑えることができる。
iOS7.1以降は改善された?!?
ビーコン端末の性能に左右?!?
iOS Android
利用者 ver.7以上
90%強
ver.4.3以上
20%弱
OS設定・
パーミッション
Bluetooth
位置情報
バックグラウンド
Bluetooth
観測対象 UUID指定必須 UUID指定自由
リージョン観測 頻度OS依存
UUID指定必須
頻度実装可能
UUID指定自由
レンジング観測 バックグラウンド
タスクMax180秒
実装者に依存
消費電力 良 新デバイス:優
サービス開発のキモ
• アプリが起動していない状態でも
ビーコンは検知されるか?
⇒なんとかバックグラウンドでやれそう
• Bluetoothでバッテリーは食わないか?
⇒実装上の工夫(+新機種)で大丈夫
• 不正は防げるか?
アジェンダ
[iBeaconのキホン]
1.iBeaconとは
2.基本機能
3.利用可能端末
4.NFCとの比較
5.サービス事例
[技術的なポイント]
1.iOS, Android アプリ実装の違い
2.消費電力
3.セキュリティ
セキュリティ
• 偽ビーコンを作成できる問題
本物であることを検証し保証する仕組みが必要
偽ビーコンの例
UUID、Major、Minorが
バレてしまうと
自宅のMacから出社可能
(Macでビーコン発信可能)
偽ビーコンの例
店舗に行かなくても
ポイントが自在に取得できる 店舗
「本物のビーコンとの通信ですよ」
を保証する仕組みが必要!!!
セキュリティ GPSを利用して
Aplix社サーバ
セキュリティ 乱数を利用
ビーコンを2個仕込むためデバイスの電池の消費が少し早い。
Aplix社の認証サーバを利用するコストが発生する。
Aplix社サーバ
まとめ
• アプリが起動していない状態でも
ビーコンは検知されるか?
⇒なんとかバックグラウンドでやれそう
• Bluetoothでバッテリーは食わないか?
⇒実装上の工夫(+新機種)で大丈夫
• 不正は防げるか?
⇒Aplix社の認証機構を利用する(or 自力��実装)
ご清聴ありがとうございました。

More Related Content

iBeacon を利用したサービス開発のポイント