pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


接触確認アプリを周囲の方がどの程度使っているかを調べるためにAndroidにBeaconScopeをインストールする

AndroidアプリのBeaconScopeが、接触確認アプリから発せられるBluetooth Beacon情報の受信に対応しているらしいので、インストールしてみました。

アプリは Google Play からダウンロードできます。

play.google.com

また、このアプリの作者が接触感染アプリで使用する"Contact Tracing Beacons"について書いているページがこちらにあります。

www.davidgyoungtech.com

このアプリについて、考察したことをちょっと書いてみます。

BeaconScope が接触確認アプリの電波を受信する仕組み

接触確認アプリはAppleGoogleAPIを用いてBluetooth LEの仕様で定期的に非常に弱い電波を発信しています。これ自体はiBeaconやEddystoneなどのBluetooth LEビーコンと同様の挙動です。しかし、iBeaconやEddystoneが送信する情報とは異なる情報を送信しています。iBeaconやEddystoneの情報を受信できるスマホアプリは色々ありますが、既存の実装では接触確認アプリの情報を正しく扱えないため、それを処理するコードが必要です。

BeaconScopeは接触確認アプリで用いられる形式のデータに対応しているので、このアプリで周囲をスキャンすると、接触確認アプリをインストールしたデバイスがどの程度の距離にあるかを表示できます。

ただし、このアプリは接触確認アプリ以外のBeaconも拾うので、リストされたデバイスがすべて接触確認アプリをインストールしたスマートフォンというわけではありません。

距離計算のしくみ

バイスで受信した電波の強度は RSSI という数値で表示されます。電波を発信したときの電波強度が分かっていれば、それらの数値からの計算で距離がわかります。

iBeaconの場合はビーコン自身が送信する情報の中に TxPower という項目があり、ここには「ビーコンの電波を1m離れた場所で受信したときの RSSI の値」が渡されます。(Eddystoneの場合は0m地点の強度です)

そして、TxPowerとRSSIの値を用いて次のように計算すると、ビーコンまでの距離を計算できます。n は理想的な空間では 2 とします。

d = 10 ^ ((TxPower - RSSI) / 10n )

計算された距離が必ずしも安定しない理由

Beaconの電波は2.4GHzの周波数を使っていますが、この周波数は人体などに吸収されやすいので、障害物があると受信時の電波強度が減衰します。また、他の物体に当たって反射した電波を受信するケースもありますので、この場合も減衰した電波を受信しています。

このように減衰した電波を受信することで距離計算の結果が変わります。

接触確認アプリでは1m以内に15分以上という方法で検知しますが、電波の減衰による誤差の影響を除外するためには、数秒程度の受信データでは補正ができないので、それなりに長時間計測したデータの中で1m以内の距離計算結果が一定数以上存在した場合に接触とみなす、などの確率的な処理を組み込む必要があるわけです。