はじめに
EnOcean BLE 環境センサー(STM550B) と スイッチ(PTM215B) は BLE ブロードキャストモードでアドバタイズパケットにデータを含めて送信する仕様です。
環境センサー(STM550B)はデフォルトで1分毎にデータを送信(1回の送信毎に同じデータを3回送信)し、スイッチ(PTM215B)は押す/離す度に同じデータを2回(押す→離すの時間間隔が短い場合、押す操作のデータ送信が2回になる)、または、3回送信します。
セントラル側はアドバタイズパケットをスキャンすればデータを取得できますが、スキャン中に同じアドレスから受信したアドバタイズパケットを無視するケースがあるので、回避策を考える必要があります。
NGのケース
コネクトモードを前提としたツールは最初に受信したアドバタイズパケットしか表示されないため、基本的に使用することは難しいです。
OKのケース
- Bluefruit LE Snifferを使用してBLEパケットデータをキャプチャー
- Node-REDフロー (node-red-contrib-blebeacon-scannerノード)
ESP32でBLEアドバタイズパケットの重複を表示する方法
ArduinoBLEライブラリのインストール
「スケッチ」→「ライブラリをインクルード」→「ライブラリ管理」を選択します。
ESP32 BLE Arduinoサンプルコードの実行
「ファイル」→「スケッチ例」→「ESP32 BLE Arduino」→「BLE_scan」を選択します。
BLE_scanサンプルコードの一部を修正すれば重複したアドバタイズパケットを表示することが可能です。
修正箇所
ライブラリのソースコード(ヘッダーファイル)BLEScan.hを見ると、BLEScanクラスのsetAdvertisedDeviceCallbacksオプションにwantDuplicatesフラグ(デフォルトはfalse)を立てれば良いことが分かります。
class BLEScan {
public:
void setAdvertisedDeviceCallbacks(
BLEAdvertisedDeviceCallbacks* pAdvertisedDeviceCallbacks,
bool wantDuplicates = false);
BLE_scan.inoサンプルコードではフラグの指定が省略されていますので、明示的にtrueを設定します。
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
↓
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(), true);