pythonでBLE

ESP32 BLEのデモにRaspberry Piからアクセスしてみる

概要

ESP32でBLEのデモを動かす ESP32でBLEのデモを動かす 補足 で作ったESP32のBLE peripheral に pythonスクリプトでアクセスしてみる方法についてのメモ。

[!NOTE] 使用したESP32側のソースはこちら

前提

ESP側の設定は以下の通り。

pythonスクリプトはRaspberryPiで動作している(実際に試したのはPi4だが、Pi3/Pi0wでも同様)。
ubuntu-PCでも同様にできるはずだが、うちのマシンは内蔵Bluetoothのバージョンが古くてBLE非対応だったので試してない。
windows-PCはよくわからん…

準備

python仮想環境の準備

# 作業ディレクトリ作成
mkdir -p /work/ble/test1
cd /work/ble/test1

# 仮想環境構築
pyenv virtualenv 3.9.10 bluepy
pyenv local bluepy
pip install --upgrade pip setuptools wheel

# 必要なライブラリのインストール
pip install bluepy

プログラム

実行

ESP32側はAdvertising 開始状態にしておく。

sudo python ble_hr.py

デバイスのスキャンを行うのでsudoが必要。

[!NOTE] もし、scanせずにアドレスを指定して実行するだけの処理に書き換えればsudoは不要になる。

説明

BLE_HR_Delegateクラス

Notifyを受け取っての処理はbluepy.btle.DefaultDelegateクラスを継承したクラスを作成して登録する必要がある。
処理自体はhandleNotificationメソッドをオーバーライドして定義する。
受け取るデータdataはbytes型なので、数値として使用する場合はint.from_bytes()で数値に変換してやる必要があるが、
この時のエンディアンは接続しているデバイスのFW仕様によるので、どちらを使うかはあらかじめ確認しておく必要がある。
(大抵はFWを動かしているCPUのエンディアンなのかな?)

BLE_HRクラス

peripheralを操作するための処理をクラス化してある。
クラス化は必須ではないけど、処理をまとめておいた方が分かりやすいかな?と思ったので。

コンストラクタ、接続、Characteristicのリード/ライト、Notifyの有効化/無効化/ポーリング、切断などの処理がある。

main関数

メイン処理。
処理の流れはこんな感じ。