ビーコンを使った開発をした感想・ナレッジの共有

# はじめに
ビーコンを使ってみての感想や気づきを中心に書いています。
本記事の対象想定は、技術選定でビーコンを検討している人や、これからビーコンを利用した開発をする人です。ビーコンでできることや開発で気をつけるナレッジの共有になれるように意識しました。

# 開発環境

### ハードウェア
* [BLEAD-B](https://houwa-js.co.jp/exe/service/product/blead-b/)
* iPhone6 iOS14.3
* MacBookPro BigSur ver11.2.3

### ソフトウェア
* Xcode ver12.4 + swift 5.3.2

### ソースコード
以下のサイトに大いに助けてもらいました
[自宅Wi-Fiお知らせアプリ開発【第三回】 Beacon 探索機能編 その２](https://houwa-js.co.jp/exe/2018/11/20181115/)


# ビーコンの基本的な仕様

ビーコンは[BLEAD-B](https://houwa-js.co.jp/exe/service/product/blead-b/)を利用しました。通信規格はBLE（BluetoothLowEnergy）です。手のひらサイズのビーコンで、電池は3ヶ月~数年持ちます。

ビーコンがブロードキャストする情報のうちswiftでは下記表の情報を利用できます。[また、プログラム上ではすでにで準備されているCLBeaconクラスを利用します。](https://developer.apple.com/documentation/corelocation/clbeacon)

| 名前 | 役割 | 特徴 | 
|:-:|:-:|:-:|
| UUID | 受信するグループを指定  |  受信するビーコンのグループを指定します<br>UUIDが異なるビーコンは基本的には拾えません|
| major | ビーコンの識別子その①  | 0〜65535のNSNumberを設定できます |
| minor | ビーコンの識別子その②  | 0〜65535のNSNumberを設定できます |
| proximity |　相対距離 | ビーコンとスマホの相対距離です。immediate、near、far、unknownの4段階で評価します |
| accuracy | proximityの確からしさ  | proximityの誤差をメートル単位で評価します  |
| rssi |  電波強度 | 距離推定に利用します。-30〜-99程で推移し、距離が離れるほど-99に近づきます。-99を超えると0（計測不可）になります。 |

※よくある勘違いですが、accuracyは推定誤差であり、推定距離ではありません。accuracyの和訳は「確からしさ」です。

### スマホとビーコンの距離を推定する

距離推定には以下の式を使います。

``` swift:swift
let distance = pow(10.0, (TxPower - RSSI) / 20.0)
```

各数字の説明です。

| 名前 | 説明 |
|:-:|:-:|
| TxPower | ビーコンが発するrssiです。ビーコンから1m離れた地点でのrssiの平均値を定数として利用しました。[ビーコンの種類によっては計測方法が異なります] (https://qiita.com/shu223/items/7c4e87c47eca65724305)|
| rssi | 受信時の電波強度です。プログラムではCLBeacon.rssiを利用しました  |
| 20.0  |  障害物のない理想空間での減衰定数です |

上の式からわかるように、距離の推定には指数を使います。そのため誤差も指数で変化します。
スマホの向きや持ち方を変えるだけでrssiの値が±5db変わるため、pow(10.0, ±5 / 20.0) = 0.56~1.78倍程度の距離推定の誤差が環境の影響で出ます。

# 画面への出力
画面は開発途中のものですが、受信したビーコンの情報をiPhone上に描画しました。
表示内容は上から、受信したビーコンのUUIDと、スマホが持っている緯度経度と現在時刻の情報です。表示していないですが、ビーコンのmajor、minor、rssiやaccuracyなどのデータも取れておりコンソールに出力しています。
CLLocationManagerDelegateを利用し、毎秒間隔でビーコンの情報を受け取りながら画面を更新します。CLLocationManagerDelegateを使うので、スマホから緯度経度のデータも取得しています。

実際のプログラムでは、画面の更新に合わせてhttp通信するなどの処理を書きました。

![IMG_0093.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/94d49300-ee26-af3c-5694-617524a8dba3.png)


# やってみた感想

## good :+1:

### 開発環境は整っている

ビーコンを活用するためのモジュールがすでにあったりと、（初のswiftに苦戦しましたが）ビーコン周りの開発しやすかったです。

### ビーコンの電波強度を設定することができ、シチュエーションに沿う活用がやりやすい
BLEAD-Bの場合はビーコンの設定をするアプリから、ビーコンの電波届く範囲を設定し5m~100mの距離でシチュエーションを選べます。
BLEAD-Bの取扱説明書に書いてある出力LVLと電波の届く範囲の差もありましたが、テストしつつ開発すれば大丈夫でした。

### proximityの精度はよかった
proximityを使った体感での距離の範囲ですが、相当に使いやすかったです。ビーコンに期待する主な役割はここになると思います。


## not good :-1:

### 距離推定の誤差が想定通り大きかった
心の準備はしていましたが、実際のデータをみて愕然としました。同条件で計測しているのに、1m距離で測定した計測結果が0.4m~1.7mの範囲でブレたり、同様に8mで測定したときに3.55m~11.22mまでブレました。
当初は統計学を使い前処理をすればなんとかなると思っていましたが、実際には丸めるのは難しそうです。

### 環境の影響による誤差が大きい
スマホの向きや、スマホの持ち方、障害物の有無でrssiが10~20変わり、推定距離が3~10倍変わります。

## reference :ok_hand:

### ビーコンの電波強度に若干の個体差があった
ビーコンの電波強度に個体差があり、特定の個体はrssiの数字が大きいといった影響がありました。今回は個体差を吸収するために平均取ることを選びましたが、リッチに作る場合は個体差を考慮する検討もありですが、電池の残量の影響受けそうです。

### proximityを使う要件に抑えておく方が吉
記憶ベースですが、もともとのビーコンの利用想定がproximityの利用である文献を読んだ記憶があります。距離推定のブレが大きいため、+αの機能として捉えておく程度に抑えることをおすすめします。

### ビーコンには表面裏面があり、若干の指向性があった。
これは意外でした。ビーコンの表面から電波が出ており、ビーコンの真横に置いたスマホは電波を受信しづらかったです。最初はビーコンとスマホを地面に置いて計測をしていたのですが、途中からスマホを手に持って開発をしていました。

### ブロードキャストしているデータに暗号化等の技術は入っていないので、傍受されて良いものと認識しておく
UUIDが一致しているビーコンの通信は傍受できます。そのため傍受されて問題ないような場合での利用になると思います。

# ビーコンを活用するサービスの例
ビーコンに任せる仕事の基本思想としては、ビーコンがブロードキャストした電波をスマホ側がキャッチして、スマホ側でハンドリングすることです。
一般的な活用例としては、現実の地理的に近づいたことを判定する利用方法を想定されます。例えば、実店舗にビーコンを配置し、店舗でのみ使える優待サービスのトリガーや、博物館・水族館の展示物にビーコンを配置しどの展示に近いか判別することで音声読み上げのサポートでの活用が想定されます。
またビーコンは小型のため、動いているものに取り付けることで動くものの判別に活用する例もあります。[阿波おどりの連にビーコンをつけて、リアルタイムでの連の場所を地図上にヒートマップでプロットした活用例もあります。](https://www.tel.co.jp/museum/magazine/communication/160129_interview/04.html)

# まとめ
ビーコンを実際に使う開発をした感想は、すでに開発環境の準備が整っていました。ビーコンがすることは電波のブロードキャストだけと単純なため、この素材を活かすためのサービスの開発のみに注力できます。
ビーコンの仕組みもシンプルで、初めてビーコンに触りましてが、システム構築をしやすかったです。
また、ビーコンの使い道は観測領域のin/outに絞る方が安全なシステム設計になると思います。距離推定として使うにはまだ環境の影響が大きかったです。

# 参考

* [iBeacon Handbook](https://www.amazon.com/iBeacon-Handbook-Japanese-uehara-akihiro-ebook/dp/B00J9MHG66/ref=sr_1_4?dchild=1&keywords=%E3%83%93%E3%83%BC%E3%82%B3%E3%83%B3&qid=1621236612&sr=8-4)
* [統計・防災・位置情報がひと目でわかるビーコンアプリの作り方](https://www.amazon.com/iBeacon-Eddystone-%E7%B5%B1%E8%A8%88%E3%83%BB%E9%98%B2%E7%81%BD%E3%83%BB%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1%E3%81%8C%E3%81%B2%E3%81%A8%E7%9B%AE%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%93%E3%83%BC%E3%82%B3%E3%83%B3%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/dp/4774180378/ref=sr_1_2?dchild=1&keywords=%E3%83%93%E3%83%BC%E3%82%B3%E3%83%B3&qid=1621236560&sr=8-2)
* [RSSI と TxPower からビーコンとの距離および近接度（Proximity）を推定する](https://qiita.com/shu223/items/7c4e87c47eca65724305)
* [自宅Wi-Fiお知らせアプリ開発【第三回】 Beacon 探索機能編 その２](https://houwa-js.co.jp/exe/2018/11/20181115/)