前回 Macから無事Beaconを発射できるようになった。
Beaconの仕様を知らないまま、BeaconからAndroid端末の距離って測れるよね?と軽い気持ちで試してみようとした記録とメモを兼ねて。。。。
結論から言うと
色々調べてみると、どうやら電波強度や建物の干渉などで正確な距離は測れないみたい。
一応 BeaconManager#addRangeNotifier
で受け取れるbeaconに生えてるdistance(メートル単位)があるけど
本当にメートル???ってなるくらい誤差がひどかった。
どうやったか
ググラーエンジニアなのでこのQiitaを発見。
RSSI と TxPower からビーコンとの距離および近接度(Proximity)を推定する
この記事によると
RSSI と TxPower から推定距離を計算する
自由空間では受信信号強度は距離の二乗に反比例して減衰していく(フリスの伝達公式)ので、RSSI と TxPower と距離(d)の関係は次のようになります。
RSSI = TxPower - 20 * lg(d)
(lg は底を 10 とする常用対数)
というわけで、距離 d の計算式は以下のようになります。
d = 10 ^ ((TxPower - RSSI) / 20)
なんかすごい物理法則的なアレを加味して計算しないといけないっぽかった。(語彙力)
先人の知恵を頂戴して、Kotlinで便利そうな関数を作る。
fun beaconDistance(txPower: Int, rssi: Int): Double = 10.0.pow((txPower - rssi) / 20.0)
実際に観測してログに出すだけのコードはこちら
override fun onBeaconServiceConnect() {
~ 略 ~
beaconManager?.addRangeNotifier { beacons, region ->
beacons
.map {
"Distance:"+beaconDistance(it.txPower, it.rssi)
// it.distanceもあったけど誤差がやばい(私的見解)
}
.forEach { Log.d(TAG, it) }
}
~ 略 ~
}
測ってみてどうだった?
端末持ってウロウロしてみたけど外の交通量やノイズ?や建物の作りでまあまあ誤差がでるみたい。
beacon.distance
使えないな〜、もうちょっと正確なのがいいな。
くらいの時に目安に使うのならいいかもね。