Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

今回は前回の記事をもとに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の屋内測位システムを作っていきたいです

cdsl
東京工科大学コンピュータサイエンス学部クラウド・分散システム研究室
https://www.tak-cslab.org/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away