pymongoを使用してRaspberry PiからBLEデバイスの情報をMongo DBに送信する

今回は[前回の記事](https://qiita.com/Konpeitou/items/20fd8398a5ba4a724f90)をもとにBLEデバイスのRSSI値をMongo DBに送信したいと思います．

# 開発環境
#### サーバ
・Ubuntu 18.04
・Apache2
・Mongo DB 

#### Raspberry Pi Zero WH
・Python 3.7
・bluepy
・pymongo

#### ESP32
・micro python

#サーバ側の設定
### Mongo DBのセットアップ
Mongo DBのセットアップは以下の記事を参考にしました
[Ubuntu 18.04 に MongoDB の最新版を apt インストールする](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3370)

今回はデータベースを1つ使用し，コレクションはBLEデバイスの数と同じにします．

RSSIというデータベースを作成し選択

```
> use RSSI
```

コレクションの作成

``` 
db.createCollection('baeacon1');
db.createCollection('baeacon2');
db.createCollection('baeacon3');
```


#Raspberry Piの設定
Raspberry PiではBLEデバイスのスキャンとその各デバイスのRSSI値をMongo DBに送信します．

### BLEデバイスのスキャン
Bluetoothのライブラリはbluepyを使用します．
以下BLEデバイスをスキャンするソースコードです．

``` scan.py
import bluepy
import time

def ScanBeacon():
    scanner = bluepy.btle.Scanner(0)
    device = scanner.scan(3, passive=True)

　　#MAC Addressでデバイスを判別
    beacon1 = '' #beacon1のMAC Address
    beacon2 = '' #beacon2のMAC Address
    beacon3 = '' #beacon3のMAC Address

    #beaconのRSSIデータのリスト
    rssi_list = ['b1', 'b2', 'b3']

    #デバイスをスキャン
    for device in device:
        if beacon1 == device.addr:
            rssi_list[0] = device.rssi
        elif beacon2 == device.addr:
            rssi_list[1] = device.rssi
        elif beacon3 == device.addr:
            rssi_list[2] = device.rssi

    #各beaconのRSSIデータの表示
    for i in range(len(rssi_list)):
        print('Beacon' + str(i+1) + ' RSSI:' + str(rssi_list[i]))

    print('==================')

    return rssi_list
```
BLEデバイスはMACアドレスで判別しています．
スキャンは3秒に1度実行し，その時点のRSSI値をリストに格納しています．
BLEデバイスは前回にESP32のビーコンを使用し，beacon1, beacon2, beacon3をそれぞれ判別しています


### Mongo DBへの送信
Mongo DBへの送信はpythonのMongo DBのライブラリのpymongoを使用して送信します．

### pymongoのセットアップ
pymongoのインストールは以下の記事を参考にしました．
[MongoDBのUbuntuへのインストールとシェルとPythonで動作確認](https://qiita.com/FukuharaYohei/items/d109f5c3f5dce0d972e4)
インストールが完了したら以下のソースコードで送信します．

```send.py
#coding: utf-8

from beacon_scan import ScanBeacon
from datetime import datetime
from pymongo import MongoClient

def Send(rssi_list):
　　#送信するMongo DBの設定
    client = MongoClient()

    db = client.RSSI  # ビーコンのRSSIを格納するデータベース

    #BeaconのRSSIを格納するコレクション
    col1 = db.beacon1
    col2 = db.beacon2
    col3 = db.beacon3

    data1 = {
        "datetime": datetime.now(),  # 日時
        "RSSI": rssi_list[0]  # ビーコン１のRSSIデータ
    }

    data2 = {
        "datetime": datetime.now(),  # 日時
        "RSSI": rssi_list[1]  # ビーコン2のRSSIデータ
    }

    data3 = {
        "datetime": datetime.now(),  # 日時
        "RSSI": rssi_list[2]  # ビーコン3のRSSIデータ
    }

    #各コレクションにRSSIデータをインサート
    col1.insert(data1)
    col2.insert(data2)
    col3.insert(data3)

if __name__ == '__main__':                                                       
    import time  
    while True:                                                                      
        rssi_list = ScanBeacon()
        time.sleep(1)
        Send(rssi_list)
        time.sleep(1)
```

データベースの送信とスキャンプログラムの間に1秒間のタイムスリープを入れていますので5秒に1度送信されています．

### サーバ側でコレクションの中身を確認

データベース「RSSI」のコレクション「beacon1」の中身を確認したいと思います．

```
> use RSSI 
> db.beacon1.find()
{ "_id" : ObjectId("5fa4e2d50c4170479dc0fea8"), "datetime" : ISODate("2020-11-06T14:44:53.756Z"), "RSSI" : -47 }
{ "_id" : ObjectId("5fa4e5f70c417047b5f809e5"), "datetime" : ISODate("2020-11-06T14:58:15.554Z"), "RSSI" : -37 }
{ "_id" : ObjectId("5fa4e5fb0c417047ba502220"), "datetime" : ISODate("2020-11-06T14:58:19.394Z"), "RSSI" : -37 }
{ "_id" : ObjectId("5fa4e5ff0c417047be5b6bee"), "datetime" : ISODate("2020-11-06T14:58:23.221Z"), "RSSI" : -37 }
{ "_id" : ObjectId("5fa4e6030c417047c2e49b10"), "datetime" : ISODate("2020-11-06T14:58:27.245Z"), "RSSI" : -35 }
{ "_id" : ObjectId("5fa4e6070c417047c68bef53"), "datetime" : ISODate("2020-11-06T14:58:31.226Z"), "RSSI" : -38 }
{ "_id" : ObjectId("5fa4e60b0c417047cadaa902"), "datetime" : ISODate("2020-11-06T14:58:35.069Z"), "RSSI" : -46 }
{ "_id" : ObjectId("5fa4e60e0c417047cec67718"), "datetime" : ISODate("2020-11-06T14:58:38.909Z"), "RSSI" : -38 }
{ "_id" : ObjectId("5fa4e6120c417047d24b111b"), "datetime" : ISODate("2020-11-06T14:58:42.734Z"), "RSSI" : -24 }
{ "_id" : ObjectId("5fa4e6160c417047d604e5b5"), "datetime" : ISODate("2020-11-06T14:58:46.578Z"), "RSSI" : -36 }
{ "_id" : ObjectId("5fa4e61a0c417047da0a92b0"), "datetime" : ISODate("2020-11-06T14:58:50.577Z"), "RSSI" : -37 }
{ "_id" : ObjectId("5faabfa10c4170048d0f6d71"), "datetime" : ISODate("2020-11-11T01:28:17.258Z"), "RSSI" : -45 }
{ "_id" : ObjectId("5faac54e0c4170045c89acbe"), "datetime" : ISODate("2020-11-11T01:52:30.166Z"), "RSSI" : -41 }
{ "_id" : ObjectId("5faac5560c4170045f100978"), "datetime" : ISODate("2020-11-11T01:52:38.980Z"), "RSSI" : -45 }
{ "_id" : ObjectId("5fab2b470c417008eae38bd0"), "datetime" : ISODate("2020-11-11T09:07:35.077Z"), "RSSI" : -44 }
{ "_id" : ObjectId("5fab2b4c0c417008ee72f00b"), "datetime" : ISODate("2020-11-11T09:07:40.160Z"), "RSSI" : -41 }
{ "_id" : ObjectId("5fab2fc20c417009a9f19cc6"), "datetime" : ISODate("2020-11-11T09:26:42.168Z"), "RSSI" : -41 }
{ "_id" : ObjectId("5fab8d360c41700e062ba950"), "datetime" : ISODate("2020-11-11T16:05:26.129Z"), "RSSI" : -43 }
{ "_id" : ObjectId("5fab8eb70c41700e556f1626"), "datetime" : ISODate("2020-11-11T16:11:51.575Z"), "RSSI" : -45 }
{ "_id" : ObjectId("5fab8ec10c41700e556f1629"), "datetime" : ISODate("2020-11-11T16:12:01.631Z"), "RSSI" : -41 }

```
これで送信されたことが確認できました．

### おわりに
今回の作業をもとにMongo DBの中身を使用してBLEの屋内測位システムを作っていきたいです