BLEアドバタイズチャンネルの破壊者
やりたいこと
BLEのアドバタイズが多すぎる(= その場にいるBLEデバイスが多すぎる)環境を再現するための装置をESP32で実装する
実現方法
以下のようなHTTPサーバを用意する
以下のようなJSONを / で配信する
code:json
{
"adv_interval": 1000
}
この内容はなんらかの方法で設定可能
このサーバは docker compose up 一発で起動できる状態になっていてほしい
OpenWRTで動かす前提だとdockerべつになくてもいいかも
WiFi APを吹いていて、上記のHTTPサーバが起動している箱を用意する
OpenWRTとかで用意するのが簡単かも
以下のような動作をするESP32のファームウェアを実装する
電源投入されたら1〜30秒の範囲でランダム秒待ってからWiFi APに接続しにいく
APにつなぎにいくタイミングずらしたほうがAPにやさしいから
設定された間隔(ミリ秒)でアドバタイズを開始する
アドバタイズのペイロードはランダム値とかでよい
状態がわかるようにLEDを点灯/点滅させる
少なくとも「設定取得完了、アドバタイズ開始済み」かどうかわかるようにしたい
使用する予定のESP32ボードはLEDが5個くらい実装済
ESP32を20個程度用意して、まとめて電源をいれられるようにする
ESP32の開発ボードがUSB A to microBケーブルで給電するので、これを複数個まとめて電源on/offしたい
凝ったことしなくても、一括スイッチ付きテーブルタップとかでも可
用途に対して十分な信頼性を確保しつつ、なるべく安くコンパクトにしたい
調べなきゃいけないこと
開発環境の作り方
手元にESP32の開発ボードが必要?それともどこかにエミュレータがある?
CPU(xtensa)のエミュはあるけどBLE通信のエミュレーションまでできるやつはなさそうmiminashi.icon Hello, WorldとかLチカくらいを試せるシミュレータだとこれが有名かもmiminashi.icon
ファームウェアはなにで書くか
Arduino IDE
MicroPythonを使ってる記事もよく出てくる
スキャナー側はどうする
開発のテストのためにも用意したい
こういうのをスマホにいれて試せば良さそう
ESP32がファームウェアをHTTP鯖から取ってくる方法
これは「ESP32 WiFi」とかでぐぐるとそれっぽいQiitaの記事が出てきそうmiminashi.icon
ESP32でのBLEの扱い方
今回の目的を達成するにはどこまでアドバタイジングの手順をしっかりすれば良いのか?
BLE通信をはじめるには、アドバタイジングで目的のサービスを持つペリフェラルを見つけ、キャラクタリスティックを取得する必要がありました。よってペリフェラルのサービスUUIDとキャラクタリスティックUUIDの2つ以上が必要になります。
ただアドバタイズができればいいので、GATTのことまではあんまり知らなくてもいいかもmiminashi.icon 実装内容としてはiBeaconデバイスを実装するのに相当するmiminashi.icon 良い電源のいれかた
参考
アドバタイジングチャネル(3ch)を時間分割して使ってる
分割っていっても衝突検知、再送制御の方法は賢くないっぽい?
アドバタイズに関してはなぜ無いかというと、小電力無線では受信機のほうが消費電力がでかいから(送信機は送信が完了したらCPU寝たらいいけど、受信はそうもいかないため)miminashi.icon
受信機が常にスキャンして送信機のアドバタイズを待つより、送信機が常に喋ってて受信機は好きなタイミングでスキャンかける方が効率がいいってことかRRM.icon
アドバタイジングパケットのペイロード情報
過去にESP32でBLE使ってみた例
アドバタイズの細かい制御はしてないので、フレームワークの使い方の参考くらいにしかならんかも
miminashi.iconがやるなら2日くらいの内容
だが、ESP32とBLEはじめて触る人だったら1ヶ月くらいかかってもおかしくない内容