最近更新于 2025-07-06 20:42
测试环境
VScode: 1.101.2
PlatformIO:Core 6.1.18,Home 3.4.4
Espressif 32:6.11.0(工具链平台)
ESP32-WROOM-32(硬件)
实现
扫描 BLE 低功耗蓝牙
#include "Arduino.h"
#include "BLEDevice.h"
#include "BLEUtils.h"
#include "BLEScan.h"
#include "BLEAdvertisedDevice.h"
int scanTime = 5; // 扫描持续时间,单位为秒
BLEScan *pBLEScan = nullptr;
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice)
{
Serial.printf("发现的设备:%s \n", advertisedDevice.toString().c_str());
}
};
void setup()
{
Serial.begin(115200);
Serial.println("开始扫描...");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); // 创建新的扫描对象
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); // 发现蓝牙设备时执行的操作(回调函数)
pBLEScan->setActiveScan(true); // 设置主动扫描(主动扫描会消耗更多电量,但结果返回更快)
pBLEScan->setInterval(100); // 两次扫描间隔的时间
pBLEScan->setWindow(99); // 每次扫描持续的时间(小于或等于 setInterval 的值)
}
void loop()
{
// 下面代码循环执行
BLEScanResults foundDevices = pBLEScan->start(scanTime);
Serial.printf("\n发现设备数量:%d\n", foundDevices.getCount());
pBLEScan->clearResults(); // 清除扫描结果,释放内存
delay(2000);
}
扫描经典蓝牙(异步)
#include "Arduino.h"
#include "BluetoothSerial.h"
BluetoothSerial serialBT;
// 扫描持续时间,毫秒
#define BT_DISCOVER_TIME 10000
void btAdvertisedDeviceFound(BTAdvertisedDevice* pDevice)
{
Serial.printf("异步扫描到设备:%s\n", pDevice->toString().c_str());
}
void setup()
{
Serial.begin(115200);
serialBT.begin("ESP32测试");
Serial.println("设备已启动,现在可以使用蓝牙配对!");
Serial.println("开始异步扫描...");
if (serialBT.discoverAsync(btAdvertisedDeviceFound))
{
// 异步扫描时,本线程同时继续执行其它任务
delay(BT_DISCOVER_TIME); // 阻塞当前线程,等待扫描结果
Serial.println("停止异步扫描");
serialBT.discoverAsyncStop();
Serial.println("已停止");
}
else
{
Serial.println("异步扫描出错");
}
}
void loop()
{
delay(100);
}
可以扫描到我的手机和电脑
电脑上也能看到 ESP32
扫描经典蓝牙(同步)
#include "Arduino.h"
#include "BluetoothSerial.h"
BluetoothSerial serialBT;
// 扫描持续时间
#define BT_DISCOVER_TIME 10000
void setup()
{
Serial.begin(115200);
serialBT.begin("ESP32测试");
Serial.println("设备已启动,现在可以使用蓝牙配对!");
Serial.println("开始同步扫描...");
BTScanResults *pResults = serialBT.discover(BT_DISCOVER_TIME);
if (pResults)
{
pResults->dump(&Serial); // 将扫描结果传给串口
}
else
{
Serial.println("同步扫描出错,未获取到结果!");
}
}
void loop()
{
delay(100);
}
ESP32 扫描蓝牙设备【PlatformIO+Arduino】