BluetoothLowEnergyの受信電波強度によってジオフェンシングができる、という記事はよく見るのですが、いざ自分でそのようなアプリを作ろうとした時に「どの値を境界にして近くにいるか、いないかを判定するか?」というのは問題になってくると思います。
今回はその基準を決めるための電波強度計測を行ってみました。これらの情報が上記問題の解決の糸口になってくれれば幸いです。
今回の実験で使ったもの
デバイス・端末
受信側は以下のとおり
・Nexus7(2013) Android6.0
・Sharp Aquas Phone SHV32 Android5.0
送信側は以下のとおり
・Sharp Aquas Phone SHV32 Android5.0
・EddyStone Beacon(正式なデバイスの名称がわからなくてすみません。。2015年8月末に行われた勉強会で買ったBeaconなんですが…写真はこんな感じ。)
使用するプログラム
受信側
https://github.com/LyricalMaestro/BLECentralBenchmarkApp
Android5.0以上の端末に対応したものになっています。(自慢ではないですがAndroid6.0のM Permissionにも少し対応しています)
送信側
GoogleのEddystoneサンプルアプリ(TxEddystone-UI)
https://github.com/google/eddystone/tree/master/eddystone-uid/tools/txeddystone-uid
測定条件
今回は以下の条件で測定を行う。(受信側はLow-Latencyだけ)
送信側 | 受信側 |
---|---|
AQUOS PHONE(TxEddyStone-UIDのLowPower) | Nexus7(2013) |
AQUOS PHONE(TxEddyStone-UIDのBalanced) | Nexus7(2013) |
AQUOS PHONE(TxEddyStone-UIDのLowLatency) | Nexus7(2013) |
EddyStoneのBeacon | Nexus7(2013) |
EddyStoneのBeacon | AQUOS PHONE |
測定場所
私の部屋でやりました。
・発信源から数十cmのところ
・発信源から2メートル程度離れているところ(発信源のある部屋からでました)
でやりました。(写真や見取り図は…ごめんなさい、秘密でお願いします)
測定結果
各項目の最後の方に測定時のグラフがあります。
TxEddyStone-UIDのLowPower x Nexus7(2013)
数十秒に一度Scanされるのがわかります。発信源からの距離の変化に対応するにかなり時間がかかります。実装によっては「射程範囲外」とちょくちょく判定されるかもしれません。
ちなみに以下の2パターンだと平均電波強度に差があるといえそうです。(数十センチぐらいのところだと-65前後が平均値なのに対して、後者は-90前後の値を示しています)
TxEddyStone-UIDのBalanced x Nexus7(2013)
5秒に一度Scanされるのがわかります。ほどよい頻度でScanしていると思います。
以下の2パターンだと平均電波強度に差があるのでややゆるめのジオフェンシングには使えるかもしれません。
TxEddyStone-UIDのLowLatency x Nexus7(2013)
Balancedの時と比べてさほどさはないように思えます。強いて言うなら電波強度のブレがこちらのほうが少ないです。
EddyStoneBeacon + Nexus7(2013)
Balancedの時と比べてさほどさはないように思えます。電波強度のブレがこちらのほうがかなり少ないです。
EddyStoneBeacon + AQUOS PHONE SHV32
電波受信間隔がかなり短いです。ブレがありますが、最大2-3秒の間隔しか開かないのはすごいです。
しかも、距離によって値の幅も差が出ているのでジオフェンシングにはまさにうってつけの状態だと言えます。
考察
送信側のLatency・受信側の機器によって受信間隔・電波強度のブレに差が出てきていることがわかりました。
しかし、発信源からの距離によって電波強度の差が出てきていることはどの条件下でも出てきることもわかりました。
なので、ここから境界値みたいなのを割り出せると思います。
(P.S. ここで「差が出ている」というのは時系列グラフを見た感じで結論付けています。本当ならt検定とかやって差があることを示してみてもいいかもしれません。。。)