LoginSignup
3
3

More than 3 years have passed since last update.

ESP32で重複したBLEアドバタイズパケットを表示する方法

Posted at

はじめに

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ライブラリのインストール

「スケッチ」→「ライブラリをインクルード」→「ライブラリ管理」を選択します。

「ArduinoBLE」を検索してインストールします。

ESP32 BLE Arduinoサンプルコードの実行

「ファイル」→「スケッチ例」→「ESP32 BLE Arduino」→「BLE_scan」を選択します。
BLE_scanサンプルコードの一部を修正すれば重複したアドバタイズパケットを表示することが可能です。

修正箇所

ライブラリのソースコード(ヘッダーファイル)BLEScan.hを見ると、BLEScanクラスのsetAdvertisedDeviceCallbacksオプションにwantDuplicatesフラグ(デフォルトはfalse)を立てれば良いことが分かります。

BLEScan.h
class BLEScan {
public:
        void           setAdvertisedDeviceCallbacks(
                                      BLEAdvertisedDeviceCallbacks* pAdvertisedDeviceCallbacks,
                                                                                bool wantDuplicates = false);

BLE_scan.inoサンプルコードではフラグの指定が省略されていますので、明示的にtrueを設定します。

BLE_scan.ino
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());

pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(), true);

結果

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3