組み込み技術シリーズ
BLEビーコンセンサーを使ったセンシング その2

  1. HOME
  2. エンジニアのつぶやき
  3. 組み込み技術シリーズ
    BLEビーコンセンサーを使ったセンシング その2

こんにちは。レスターエンベデッドソリューションズ テクノロジーデザイン本部 技術部 開発課です。

前回はBLEビーコンの通信について記載しましたが、今回は実際にBLEビーコンセンサーを用いて、データを受信するプログラムについて記載しようと思います。

“組み込み技術シリーズ”の目次

第一回:BLEビーコン通信について
第二回:BLEビーコンセンサーを使ったセンシングについて 
第三回:BLEビーコンセンサーを用いたデモアプリケーション

今回は「第二回:BLEビーコンセンサーを使ったセンシングについて」記載したいと思います。

温湿度センサー

今回使用するセンサーは弊社でも取り扱いをしています、サンワサプライ製のビーコンセンサーを使ってみようと思います。
サンワサプライ製のビーコンセンサーはいくつか種類があるのですが、その中で今回は温湿度センサー(MM-BLEBC7)のデータを受信してみようと思います。

参考元:SANWA SUPPLY「湿度の管理が必要な各分野で使用できるマルチアドバタイズBLEビーコン(3個セット)。
https://www.sanwa.co.jp/product/syohin?code=MM-BLEBC7)2025/01/23」

この温湿度センサーはiBeaconとEddystoneに対応しており、ひとつのビーコンで複数の信号を同時発信可能なのですが、今回は初期設定されている、デバイス情報と温湿度データの受信を行いたいと思います。
以下は取り扱い説明書に記載されているデバイス情報と温湿度データのデータフォーマットで、ともに3つのAD Structureで構成されています。

BLEビーコンセンサー受信プログラム

今回Physonで記述をするのですが、PythonでBLEデバイスを制御するためのBLEライブラリはいくつかあり今回はBluepyを使用いたします。

以下はBluepyを使って、受信したアドバタイズパケットを表示させるソースコードです。

CodeToHTML
from bluepy import btle

class BleBeaconReceive(btle.DefaultDelegate):
    def __init__(self):
        btle.DefaultDelegate.__init__(self)

    def handleDiscovery(selfdevisNewDevisNewData):
        if dev.addr == “c3:00:00:35:6d:43”:
            print(f“isNewDev:{isNewDev})
            print(f“isNewData:{isNewData})
            print(f“RSSI   :{dev.rssi} dB”)
            recive_data = dev.getScanData()
            for data in recive_data:
                print(f“DATA   :{data} )
            print(“”)


scanner = btle.Scanner().withDelegate(BleBeaconReceive())

print(“Scanning for devices…”)
while True:
    scanner.scan(1.0)  # 1秒間スキャンを繰り返す


「BleBeaconReceive」クラスはBluepyのDefaultDelegateクラスを継承させ、デバイスが発見されたときや新しいデータが受信されたときに呼び出されるhandleDiscoveryメソッドをオーバーライド(再定義)させています。今回は受信したデータのデバイスアドレスが温湿度センサーのアドレスを示している時のみ、RSSI値と受信データを表示するように致しました。

作成したクラスでスキャン中に発生するイベントを処理を行う為に、Scannerオブジェクトにデリゲートの設定を行ったあと、1秒間のスキャンを繰り返し行うようにしています。

Dockerイメージの作成

IoTstarterKITはDockerのコンテナ上で動いていますので、先ほどのプログラムもコンテナ上で動かします。

まずはプログラムを動かす為に以下のDockerfileにてDockerイメージを作成します。

CodeToHTML

FROM python:3.8.16slimbuster

RUN aptget update && aptget install y \
    bluez \
    libglib2.0dev \
    buildessential \
    && rm rf /var/lib/apt/lists/*

RUN pip install upgrade pip
RUN pip install \
    bluepy

COPY  ble.py  .
CMD [ “python3”,“ble.py” ]

作成するイメージはPythonのイメージをベースとして、必要なモジュールをインストール後、先ほど作成したソースコードをコピーして、コンテナ起動時にプログラムが動くようにしています。

BLEビーコンセンサーデータ受信

以下のコマンドで作成したイメージを動かします。
ネットワークの設定をhostモードとして、ネットワーク管理とシステム管理の権限を付与した形でコンテナを起動させています。

CodeToHTML
docker run it rm net host capadd=SYS_TIME capadd=NET_ADMIN ble:latest


コンテナを起動し、温湿度センサ―からデータを受信すると以下のように表示がされます。デバイス情報ならびに温湿度データも受信ができています。

デバイス情報ならびに温湿度データの2つ目のAD Structureは16bit長のUUIDのはずですが、表示は128bit長で表示されます。
これはBluepyモジュール側で16bit長から128bit長のUUIDに変換してくれます。

ちなみに16bit長のUUIDから128bit長のUUIDの変換は以下の式で行えます。
128bit UUID = 16bit UUID × 296 + Bluetooth_Base_UUID

【デバイス情報】
受信サービスデータ:e1ffa10864436d350000c34854626561636e

【温湿度データ】
受信サービスデータ:e1ffa10164186e2257436d350000c3

デバイス情報ならびに温湿度データも取り扱い説明書に記載されているデータを受信できました。
ちなみに温度データと湿度データは固定小数点表現となっており、上位8bitが整数部、下位8bitが小数部となります。

さいごに

今回は実際にPythonのプラグラムでBLEビーコンセンサ―からのデータ受信を行いました。
今回は受信するだけのプログラムでしたが、次回はBLEビーコンセンサーを使用した、IoTstarterKITのデモアプリケーションについて記載したいと思います。
サンワサプライ社製品のお問い合わせに関しましては、ページの一番下にございます「お問い合わせフォーム」よりお願いいたします。

参考文献

更新履歴

2025/1/27 新規作成