質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

1回答

757閲覧

esp-wroom-32でbluetoothデバイスを検知

TENSHI

総合スコア0

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2023/12/19 17:49

編集2023/12/20 03:37

実現したいこと

・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/ツールのバージョンなど)

特になし。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/12/19 20:52

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
tmp

2023/12/21 08:35

Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); で表示されているManufacturer Dataと Serial.printf("Manufacturer Data: %s \n", advertisedDevice.getManufacturerData().c_str()); で表示されるManufacturer Dataデータが、異なっていませんか? (iPhone等が Lって表示されたりとか) もし、Lって表示されていれば、当然"4c00"はみつからないですので、あとは自己解決してください。 実行できないので確認できません、違ってたらごめん。
guest

回答1

0

一度実行してみてシリアルモニタに出てきたserviceUUIDをそのまま"特定のサービスUUID..."の条件式に入れて再度実行してみたら
きちんとMobileとしてカウントされたので、ただ単に条件を満たすデバイスが無いだけな気もします。


UUIDを大文字にしてどうにかなったりしません?

ESP32_BLE_Arduino/src/BLEUUID.cpp at master · nkolban/ESP32_BLE_Arduinoをよく読んで流石にそんなことはなかった。

投稿2023/12/21 01:43

編集2023/12/21 02:35
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TENSHI

2023/12/22 17:13

回答ありがとうございます。ozwkさんはどんなデバイスで試されたのでしょうか?私は周りにiPhone12,エアポッツ、bluetoothマウスを使ったのですが全部、周辺機器としてカウントしました。またプログラムを下記の通りに修正したのですが、それでもうまくいきません。何が足りていないのかご教授いただけないでしょうか?          #include "BLEDevice.h" #define SPP_UUID "00001101-0000-1000-8000-00805F9B34FB" // Serial Port Profile (SPP) #define HFP_UUID "0000111E-0000-1000-8000-00805F9B34FB" // Hands-Free Profile (HFP) #define A2DP_UUID "0000110A-0000-1000-8000-00805F9B34FB" // Advanced Audio Distribution Profile (A2DP) #define MAP_UUID "00001132-0000-1000-8000-00805F9B34FB" // Message Access Profile (MAP) int phoneCount = 0; int peripheralCount = 0; class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { public: void onResult(BLEAdvertisedDevice advertisedDevice) { BLEUUID uuid = advertisedDevice.getServiceUUID(); if (uuid.equals(BLEUUID(SPP_UUID)) || uuid.equals(BLEUUID(HFP_UUID)) || uuid.equals(BLEUUID(A2DP_UUID)) || uuid.equals(BLEUUID(MAP_UUID))) { Serial.println("Found a phone!"); phoneCount++; } else { Serial.println("Found a peripheral device."); peripheralCount++; } // You can also print other information about the device Serial.printf("Device Name: %s\n", advertisedDevice.getName().c_str()); Serial.printf("Address: %s\n", advertisedDevice.getAddress().toString().c_str()); Serial.printf("Service UUID: %s\n", uuid.toString().c_str()); Serial.println("--------------------"); } }; void setup() { Serial.begin(115200); Serial.println("Scanning..."); BLEDevice::init(""); BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->start(5, false); delay(5000); // Scanning for 5 seconds Serial.printf("Phone count: %d\n", phoneCount); Serial.printf("Peripheral count: %d\n", peripheralCount); } void loop() { // Empty loop }
ozwk

2023/12/23 11:31 編集

周りに何があったかは正直わかりません そのプログラムを実行したときに、 シリアルで送られてくる Service UUIDに出てくるものをまず確認しましょう
TENSHI

2023/12/25 02:53

Service UUIDが全部NULLと出てくるのですが、この場合どうすればよろしいでしょうか?
ozwk

2023/12/25 04:03

ということは周囲にServiceUUIDを送ってくる機器はいないのでしょう。 (アドバタイズで何を送ってくるかは完全に機器の自由です。)
ozwk

2023/12/25 04:16 編集

私が試した限りiphoneらしきものはservice uuid なしでmanufacture idしか送信してこなかったので BLEのスキャンで携帯電話とそれ以外の区別は難しいのではないのかなと (airpodsと見分けがつかない)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問