今回は前回の記事をもとに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 インストールする
今回はデータベースを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デバイスをスキャンするソースコードです.
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で動作確認
インストールが完了したら以下のソースコードで送信します.
#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] # ビーコン1の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の屋内測位システムを作っていきたいです