実現したいこと
・ESP-wroom-32のマイコンにあるbluetoothの機能を使って、bluetoothが搭載されているデバイスを検知する。また携帯と周辺機器を区別できるようにしたい。UUIDやManufacturer Dataから区別するプログラムにしたがすべて周辺機器にカウントするプログラムになってしまいどこが悪いのかわかりません。UUIDやManufacturer Data以外から携帯と周辺機器を区別する方法や自分のやり方にどこが間違えているのかわかる方がいらっしゃいましたらご教授お願いします。
前提
携帯と周辺機器を区別するために以下のことをした
・Manufacturer Dataからメーカー情報やサービス情報によって携帯デバイスかどうか判断できるようにした。
・特定のサービスUUIDを持っていれば、携帯デバイスと判断する。
発生している問題・エラーメッセージ
前提に書いてある方法で携帯と周辺機器を区別したのだが、すべて周辺機器にカウントしてしまい、携帯と周辺機器を区別できていません。前提のやり方が間違えているのか、プログラムが間違えているのか全く分かりません。もしbluetoothに詳しい方がいらっしゃいましたらご教授お願いします。
該当のソースコード
#include "BLEServer.h" #include "BLEClient.h" #include "BLEUtils.h" #include "BLEScan.h" #include "BLEAddress.h" #include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif BluetoothSerial SerialBT; String device_name = "ESP32-BT-Slave"; class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { int mobileDeviceCount; // 携帯デバイスのカウント int otherDeviceCount; // その他のデバイスのカウント std::vector<std::string> macAddresses; // 検知したMACアドレスのリスト public: MyAdvertisedDeviceCallbacks() : mobileDeviceCount(0), otherDeviceCount(0) {} void onResult(BLEAdvertisedDevice advertisedDevice) { Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); Serial.printf("Address: %s \n", advertisedDevice.getAddress().toString().c_str()); Serial.printf("Manufacturer Data: %s \n", advertisedDevice.getManufacturerData().c_str()); Serial.printf("Service Data: %s \n", advertisedDevice.getServiceData().c_str()); Serial.printf("RSSI: %d dBm \n", advertisedDevice.getRSSI()); // デバイス名を取得 std::string deviceName = advertisedDevice.getName(); // メーカー情報を取得 std::string manufacturerData = advertisedDevice.getManufacturerData(); // サービス情報を取得 std::string serviceData = advertisedDevice.getServiceData(); // 携帯デバイスかどうか判定するフラグ bool isMobileDevice = false; // メーカー情報やサービス情報によって携帯デバイスかどうか判定する if (manufacturerData.find("4c00") != std::string::npos || // Apple社のメーカー情報 manufacturerData.find("e002") != std::string::npos || // Samsung社のメーカー情報 serviceData.find("fe9f") != std::string::npos || // Google社のNearbyサービス serviceData.find("fd6f") != std::string::npos) { // Apple社のExposure Notificationサービス isMobileDevice = true; } // 特定のサービスUUIDを持っていれば、携帯デバイスと判断する if (advertisedDevice.haveServiceUUID() && (advertisedDevice.getServiceUUID().equals(BLEUUID("0000180a-0000-1000-8000-00805f9b34fb")) || // Device Information Service advertisedDevice.getServiceUUID().equals(BLEUUID("0000180f-0000-1000-8000-00805f9b34fb")) || // Battery Service advertisedDevice.getServiceUUID().equals(BLEUUID("00001812-0000-1000-8000-00805f9b34fb")))) { // Human Interface Device Service isMobileDevice = true; } // MACアドレスを取得 std::string macAddress = advertisedDevice.getAddress().toString(); // 新しいMACアドレスを検知した場合のみ表示する if (std::find(macAddresses.begin(), macAddresses.end(), macAddress) == macAddresses.end()) { Serial.printf("New MAC Address: %s\n", macAddress.c_str()); macAddresses.push_back(macAddress); if (isMobileDevice) { mobileDeviceCount++; // 携帯デバイスの場合、カウントを増やす } else { otherDeviceCount++; // それ以外のデバイスの場合、カウントを増やす } } Serial.printf("Mobile Device Count: %d\n", mobileDeviceCount); Serial.printf("Other Device Count: %d\n", otherDeviceCount); } }; void setup() { Serial.begin(115200); SerialBT.begin("ESP32test"); //Bluetooth device name Serial.println("The device started, now you can pair it with bluetooth!"); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Open Port"); delay(1500); BLEDevice::init(""); BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->start(5); // スキャンを開始 Serial.begin(115200); SerialBT.begin(device_name); } void loop() { if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) { Serial.write(SerialBT.read()); } delay(20); }
試したこと
前提に書いてある通りのことをした。
補足情報(FW/ツールのバージョンなど)
特になし。