この記事の目的
ESP32やM5Stack系のデバイスで、一度ペアリングしたBluetoothデバイスの一覧を取得する。またそのデバイスのペアリングを解除する。
ペアリングしたデバイスの一覧取得
事前にBluetoothの初期化が必要です。例えばBluetoothSerial
を使用する場合はBluetoothSerial
内のBegin()
を呼び出した段階で初期化が完了しています。
#include "esp_gap_bt_api.h"
#include "esp_bt_main.h"
int paired_count = esp_bt_gap_get_bond_device_num(); //ペアリングしたデバイス数を取得
esp_bd_addr_t dev_list[100];
esp_err_t result = esp_bt_gap_get_bond_device_list(&paired_count, dev_list); //ペアリングしたデバイスのアドレス一覧を取得
Serial.printf("BT paired count=%d\n", paired_count);
if (result == ESP_OK)
{
for (int i = 0 ; i < paired_count; i++) {
Serial.printf("[Device%d]%d\n", i, dev_list[i]); //アドレスを表示
}
} else {
Serial.println("esp_bt_gap_get_bond_device_list failed");
return;
}
コードの中ではdev_listの配列要素数を100
としていますが、実際にはそのデバイスで同時にペアリングできる最大数を指定してください。
ペアリングの解除
先に示したコードのアドレス(dev_list[i]
)を指定して、以下のような関数を呼び出すことでペアリングを解除できます。
esp_bt_gap_remove_bond_device(dev_list[i]);
ペアリングしたデバイスの一覧取得を行う全体コード
Serialにペアリングしたアドレス一覧を1秒ごとに出力するコードです。
bluetoothserial.cppを参考に、Bluetoothの初期化を行うコードも含ませています。
M5StickC Plus
で動作することを確認しています。
#include "esp_gap_bt_api.h"
#include "esp_bt_main.h"
#include <esp_log.h>
void setup() {
Serial.begin(115200);
init_BT(); //Bluetooth初期化
}
void init_BT() {
if (!btStarted() && !btStart()) {
log_e("initialize controller failed");
return;
}
esp_bluedroid_status_t bt_state = esp_bluedroid_get_status();
if (bt_state == ESP_BLUEDROID_STATUS_UNINITIALIZED) {
if (esp_bluedroid_init()) {
log_e("initialize bluedroid failed");
return;
}
}
if (bt_state != ESP_BLUEDROID_STATUS_ENABLED) {
if (esp_bluedroid_enable()) {
log_e("enable bluedroid failed");
return;
}
}
}
void loop() {
int paired_count = esp_bt_gap_get_bond_device_num(); //ペアリングしたデバイス数を取得
esp_bd_addr_t dev_list[100];
esp_err_t result = esp_bt_gap_get_bond_device_list(&paired_count, dev_list); //ペアリングしたデバイスのアドレス一覧を取得
Serial.printf("BT paired count=%d\n", paired_count);
if (result == ESP_OK)
{
for (int i = 0 ; i < paired_count; i++) {
Serial.printf("[Device%d]%d\n", i, dev_list[i]); //アドレスを表示
//esp_bt_gap_remove_bond_device(dev_list[i]); //削除
}
} else {
Serial.println("esp_bt_gap_get_bond_device_list failed");
return;
}
delay(1000);
}
参考文献
以下のページを参考にして本記事を執筆しています。
CLASSIC BLUETOOTH GAP API - ESP32 - — ESP-IDF Programming Guide latest documentation
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/bluetooth/esp_gap_bt.html
BluetoothSerial.cpp
https://github.com/espressif/arduino-esp32/blob/master/libraries/BluetoothSerial/src/BluetoothSerial.cpp