ESP32でESP-IDFを利用してBLE のアドバタイジング・パケットの送受信を行う

別記事の ESP32 で Arduino を利用して BLE のアドバタイジング・パケットの送受信を行う ではフレームワークに Arduino を用いたが、今回は、ESP-IDFをフレームワークとして、BLE のアドバタイジング・パケットの送受信および、WiFi のアクセスポイントとしてのビーコンの送信と周囲に存在する WiFi のアクセスポイントの(ビーコン)情報収集を行う。

ESP32をBLEおよびWiFiのビーコン送信機および受信機として利用するためのテストプログラムを開発することが目的なので、BLEでGATTを調べたり、WiFiに接続する部分は意図的に取り除いている。

Espressif の ESP-IDFの Example が参考になった。また、WiFiのスキャンについては ESP32 (5) – Wifi scanner が参考になった。

ハードウェア

利用したボードに特有の機能などは使っていないので、他のESP32開発ボードなどでもプログラムの修正は不要と思う。

開発環境

PlatformIO IDE for Visual Studio Code を利用した ESP32 用開発については、PlatformIO IDE for VSCode でESP32のプログラム開発 の設定を参照のこと。

フレームワークにArduinoを利用した場合には、BLE の送受信を利用する際にパーティションテーブルの設定をデフォルトから変更する必要があった(パーティションテーブルの設定は PlatformIO IDE for VSCode におけるESP32 Partition Tableの指定方法 を参照)。フレームワークに ESP-IDFを利用した今回は、デフォルトのままで動作した。このために、platformio.ini の board_build.partitions の設定をコメントアウトしてある。

プログラム

次のGitHubに、備忘録としてPlatform IDE for VSCodeでの開発用ファイルを置いてある。

https://github.com/kunsen-an/espidf-ble-adv-scan-wifi.git

ESP32 で Arduino を利用して BLE のアドバタイジング・パケットの送受信を行う で示したプログラムでは得られた情報のAWS IoTへの送信部分があったが、今回のプログラムは得られた情報をコンソールに表示するだけである。

主な機能

  • BLE  central として、(定期的に)アドバタイジングパケットとRSSIを収集する
  • BLE  peripheral として、アドバタイジングパケットを送信する
  • WiFi のアクセスポイントとしてビーコンを送信する
  • WiFi の 他のアクセスポイントのビーコン情報(SSID,RSSI など)を(定期的に)収集する

ble_adv_scan.c

BLE peripheral (client)として、アドバタイジングパケットを送信するようにしている。最初に設定した後は、ESP-IDFに送信を任している。

また、BLE central (server)として、アドバタイジングパケットを受信している。受信した際に、その情報を表示するようにしている。プログラムでは、一定時間ごとに受信を休止する部分を加えている(休止してからアドバタイジングパケットのスキャンをするようにしている)。

休止をしないで常にアドバタイジングパケットを監視したい場合には、SCAN_DEBUGマクロを次のようにする。

#define SCAN_DEBUG 0

このコードは、以下のサンプルプログラムを基にしている。

https://github.com/espressif/esp-idf/blob/master/examples/bluetooth/gatt_client/main/gattc_demo.c

https://github.com/espressif/esp-idf/blob/master/examples/bluetooth/gatt_server/main/gatts_demo.c

wifi_scan.c

WiFiアクセスポイントとしてビーコンを発するようにしている。接続要求を受けて処理する部分を意図的に実装していないので、接続することはできない。最初に設定した後は、ビーコン送信はESP-IDFに任している。

WiFiクライアントとして周囲のWiFi のアクセスポイントからのビーコンを定期的にスキャンし、RSSI などの情報を収集する。WiFiには複数のチャンネルがあるが、それらのチャンネルを同時にスキャンすることはESP32(というか普通のWiFiのクライアント)ではできない。チャンネルを順次走査することになるので、すべてのチャンネルのスキャンを終了するまでに時間がかかる。WiFiに関してはスキャン終了後、すぐに新たなスキャンをするようにしている。

このコードは、以下のサンプルプログラムを基にしている。

https://github.com/espressif/esp-idf/blob/master/examples/wifi/scan/main/scan.c

ESP-IDFを利用したWiFiのスキャンのプログラムについては ESP32 (5) – Wifi scanner が参考になる。

main.c

メインプログラム。