試して分かりましたが、これは一筋縄ではいかないやつですね。
これに関しては、私にBeaconの知識がないのも原因でしょう。
ということで、早速本題へ。
今回、参考にさせていただいたサイトはこちらです。
RSSI と TxPower からビーコンとの距離および近接度(Proximity)を推定する – Qiita
https://qiita.com/shu223/items/7c4e87c47eca65724305
まず、ビーコンの信号から TxPower と RSSI という値を取得します。
ちなみに、それぞれの値は下記のようなものです。
- TxPower:ビーコンが発する信号の強さ
- RSSI:デバイス(AndroidやiOS端末)が受信した電波の強度
で、これらの値と距離との関係は、下記のような式で表すことができるとのこと。
なお、d は距離を表しています。
RSSI = TxPower - 20 * lg(d)
で、こちらの式から、距離 d の計算式は下記のとおりです。
d = 10 ^ ((TxPower - RSSI) / 20)
こちらの式をJavaScriptで書くとこうなります。
var d = Math.pow(10.0, (TxPower - RSSI) / 20.0
これで一応は、距離が取得できました。
こちらを実際に cordova-plugin-ibeacon に導入すると、下記のようになります。
delegate.didRangeBeaconsInRegion = function(pluginResult) { var beaconData = pluginResult.beacons[0]; console.log("d = "+((Math.pow(10.0, (beaconData.tx - beaconData.rssi) / 20.0)))); }
ビーコンの信号が取得されている間、定期的に呼ばれる関数内で使用しています。
ちなみに、実際に取得できるデータはこちら。
{ "eventType":"didRangeBeaconsInRegion", "region":{ "identifier":"[ビーコンの名前]", "uuid":[ビーコンのUUID], "major":"1", "minor":"3", "typeName":"BeaconRegion" }, "beacons":[ { "uuid":[ビーコンのUUID], "major":"1", "minor":"3", "proximity":"ProximityNear", "rssi":-67, "tx":-58, "accuracy":1.7 } ] }
こちらを実行すると、ビーコンの信号を受信している間ずっと定期的に計算したビーコンとの距離が出力されていました。
が、参考にした記事によると、この値は「自由空間」という「障害物がない空間」での測定を前提とした計算方法らしいです。
障害物などの有無によって、電波の受信強度が変わるので、実際にはそのあたりも考慮する必要があるとのこと。
…はい、だんだん分からなくなってまいりました!
ということで、本日はいったんここまでとしたいと思います。
実際に取れた値も、やけに振れ幅が多いし…実際に使うにはまだまだでしょう。
もう少し、Beaconについての学習も進めていきたいと思います。
以上、Beaconとの距離を計算する方法でした。