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はよくわからん…
# 作業ディレクトリ作成
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
関数メイン処理。
処理の流れはこんな感じ。
int.from_bytes()
で数値に変換するBLE_HR.write()
で変換しているのでここではそのまま。BLE_HR.waitForNotifications()
(Peripheral.waitForNotifications()
のラッパ)をコールし続ける必要がある。