ビーコンを用いて入退室をチェックする簡単なプログラム

#はじめに

ビーコンの一種であるEddyStonまたはiBeaconの入退室を検出する処理をPythonで実現します。ビーコンの作り方は[小型 Bluetooth LE モジュール AE-TYBLE16とボタン電池でビーコンを作る](https://qiita.com/MypaceEngine/private/cc7ccbd799801735112b)を参照してください。

#Pythonのセットアップ
pip install setuptools
pip install beacontools
apt-get install libbluetooth-dev
pip install pybluez

#ソースコード
下記をチェックアウトしてください。
https://github.com/MypaceEngine/beacontools

#動作方法
exampleフォルダに移動し、下記を実行してください。

| Beaconのタイプ      |       ファイル |
|:-----------------|:-----------------|
| Eddystone(指定Namespaceのみ)            |  sudo python3          scanner_eddystone_inout_example.py|
| iBeacon(指定UUIDのみ)             |  sudo python3           scanner_ibeacon_inout_example.py|
| iBeaconとEddystoneの両方(全Beaconを検出)             |sudo python3 scanner_eddystone_ibeacon_inout_example.py


#検出するBeaconの設定
検出するBeaconを指定する必要があります。Filterを除去すれば、EddyStone/iBeaconの両方とも受信できるようになります。

##Eddstoneの場合
```python:scanner_eddystone_inout_example.py
# scan for all TLM frames of beacons in the namespace "12345678901234678901"
scanner = BeaconScanner(callback, 
    device_filter=EddystoneFilter(namespace="12345678901234678901"),
    packet_filter=[EddystoneTLMFrame, EddystoneUIDFrame]
)
```
##iBeaconの場合
```python:scanner_ibeacon_inout_example.py
# scan for all iBeacon advertisements from beacons with the specified uuid 
scanner = BeaconScanner(callback, 
    device_filter=IBeaconFilter(uuid="e5b9e3a6-27e2-4c36-a257-7698da5fc140")
)
```

#退室から検出までの時間を変更する方法
現在は30秒で実装されています。変更の際には下記を変更してください。

```python:
            #Wait 30s for detecting to exit beacon.
            if(time.perf_counter()-bt_list[i]>30):
```

#動作結果
##iBeaconの場合 （scanner_ibeacon_inout_example.py）
| イベント       |       出力ログ |
|:-----------------|------------------|
| 入室             |＜IN＞ UUID:beac0712-3456-789a-bcde-f12345678907 Major:0 Minor:0 |
| 検出中             |＜Listing＞ UUID:beac0712-3456-789a-bcde-f12345678907 Major:0 Minor:0 Timeout:30 |
| 退室             |＜OUT＞ UUID:beac0712-3456-789a-bcde-f12345678907 Major:0 Minor:0 |

##Eddtstonの場合 （scanner_eddystone_inout_example.py）
| イベント       |       出力ログ |
|:-----------------|------------------|
| 入室             |＜IN＞ namespace:01020304050607080910 Instance:aabbccddeef |
| 検出中             |＜Listing＞ namespace:01020304050607080910 Instance:aabbccddeef Timeout:30 |
| 退室             |＜OUT＞ namespace:01020304050607080910 Instance:aabbccddeef | 

##Eddystone/iBeaconの両方の場合（scanner_eddystone_ibeacon_inout_example.py）

| イベント       |       出力ログ |
|:-----------------|------------------|
| 入室             |＜IN＞ Type:Eddystone Adress: cc:39:f7:20:b1:62 Namespace:01020304050607080910 Instance:aabbccddeeff<BR>＜IN＞ Type:iBeacon Adress: f2:0d:7e:2f:ac:21 UUID:beac0712-3456-789a-bcde-f12345678902 Major:0 Minor:0|
| 検出中             |＜Listing＞ Type:Eddystone Adress: cc:39:f7:20:b1:62 Namespace:01020304050607080910 Instance:aabbccddeeff<BR>＜Listing＞  Type:iBeacon Adress: f2:0d:7e:2f:ac:21 UUID:beac0712-3456-789a-bcde-f12345678902 Major:0 Minor:0 |
| 退室             |＜OUT＞ Type:Eddystone Adress: cc:39:f7:20:b1:62 Namespace:01020304050607080910 Instance:aabbccddeeff<BR>＜OUT＞  Type:iBeacon Adress: f2:0d:7e:2f:ac:21 UUID:beac0712-3456-789a-bcde-f12345678902 Major:0 Minor:0 |