ESP32 扫描蓝牙设备【PlatformIO+Arduino】

最近更新于 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);
}

file

扫描经典蓝牙(异步)

#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);
}

可以扫描到我的手机和电脑
file

电脑上也能看到 ESP32
file

扫描经典蓝牙(同步)

#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);
}

file

ESP32 扫描蓝牙设备【PlatformIO+Arduino】
Scroll to top
打开目录