ESP32 集成了双模蓝牙,既支持经典蓝牙(Bluetooth Classic),也支持低功耗蓝牙(BLE, Bluetooth Low Energy)。
经典蓝牙(SPP串口通信):适合大数据量传输、蓝牙串口助手通信(对 Android 非常友好)。
BLE 低功耗蓝牙:适合低功耗设备、智能穿戴、微信小程序连接或 iOS 设备通信。
下面为你提供在 Arduino IDE 环境下快速上手这两种模式的详细步骤。
准备工作
搭建好ESP32的ArduinoIDE编程环境
手机端下载一个蓝牙调试工具:
Android:可在应用商店下载“蓝牙串口”或“Serial Bluetooth Terminal”。
iOS / Android:下载“nRF Connect”(非常适合测试 BLE)。
经典蓝牙的串口协议(SPP)使用起来和传统的 UART 串口通信几乎一模一样,非常适合初学者。
#include "BluetoothSerial.h"
// 检查蓝牙配置
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to enable it
#endif
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
// 初始化蓝牙,设置蓝牙广播名称
SerialBT.begin("ESP32_Bluetooth_Test");
Serial.println("蓝牙已启动!现在可以使用手机连接 'ESP32_Bluetooth_Test'");
}
void loop() {
// 如果收到手机通过蓝牙发来的数据,转发到串口监视器
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
// 如果串口监视器有输入,发送给手机
if (Serial.available()) {
SerialBT.write(Serial.read());
}
delay(20);
}在手机上下载 蓝牙串口助手 APP(如“蓝牙串口”、“Serial Bluetooth Terminal”等等)。
打开手机蓝牙,搜索并配对名称为 ESP32_Classic_BT 的设备。
打开 APP 连接该设备,在串口与手机之间发送文本进行双向测试。
BLE 采用 GATT(通用属性配置文件) 架构。设备作为 BLE Server(服务端) 提供一个 Service(服务),服务内部包含一个或多个 Characteristic(特征),特征具有读(Read)、写(Write)、通知(Notify)等属性。
所有 iOS 和 Android 设备均支持 BLE 连接。
下面展示如何将 ESP32 设置为 BLE 服务器,并向手机定期推送传感器数据(广播 + Notify):
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// 定义唯一的 UUID(可用在线 UUID 生成器自定义)
#define SERVICE_UUID "4fa86f1a-66b3-4323-82b6-07d926c4f2c1"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint32_t value = 0;
// 连接状态回调类
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("设备已连接");
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("设备已断开");
// 断开后重新开始广播,允许再次连接
pServer->getAdvertising()->start();
}
};
void setup() {
Serial.begin(115200);
// 1. 初始化 BLE 设备
BLEDevice::init("ESP32_BLE_Demo");
// 2. 创建 BLE 服务端
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// 3. 创建 BLE 服务
BLEService *pService = pServer->createService(SERVICE_UUID);
// 4. 创建 BLE 特征(具备 READ、WRITE 和 NOTIFY 属性)
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
// 5. 启动服务并开启广播
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
BLEDevice::startAdvertising();
Serial.println("BLE 服务已就绪,正在广播中...");
}
void loop() {
// 当有设备连接时,每隔 2 秒推送递增的数值数据
if (deviceConnected) {
String strData = "Sensor Data: " + String(value++);
pCharacteristic->setValue(strData.c_str());
pCharacteristic->notify(); // 发送通知给已订阅的客户端
Serial.print("已推送: ");
Serial.println(strData);
delay(2000);
}
}手机端下载推荐调测工具:nRF Connect for Mobile(iOS / Android 均可用)。
在 APP 中下拉扫描,找到 ESP32_BLE_Demo 并点击 Connect。
展开 UUID 为 4fa86f1a-... 的 Service。
点击 Characteristic 旁边的 向下双箭头(订阅 Notify 功能),即可看到 ESP32 实时推送到手机的传感器数值。