LoginSignup
3

More than 3 years have passed since last update.

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

Posted at

今回は前回の記事をもとに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デバイスをスキャンするソースコードです.

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で動作確認
インストールが完了したら以下のソースコードで送信します.

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]  # ビーコン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の屋内測位システムを作っていきたいです

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3