首页 动态 版块 商城 我的
 退出
游客  
等级:
金币:
经验值:

ESP32的蓝牙配置功能 经典蓝牙与低功耗双模蓝牙BLE,Bluetooth

  57 
 0
 4
RASPI   ydxhuo.com 
文章主图

一:功能介绍

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 串口通信几乎一模一样,非常适合初学者。

1.示例代码

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

2.测试方法

在手机上下载 蓝牙串口助手 APP(如“蓝牙串口”、“Serial Bluetooth Terminal”等等)。


打开手机蓝牙,搜索并配对名称为 ESP32_Classic_BT 的设备。


打开 APP 连接该设备,在串口与手机之间发送文本进行双向测试。


三:BLE低功耗蓝牙

BLE 采用 GATT(通用属性配置文件) 架构。设备作为 BLE Server(服务端) 提供一个 Service(服务),服务内部包含一个或多个 Characteristic(特征),特征具有读(Read)、写(Write)、通知(Notify)等属性。

所有 iOS 和 Android 设备均支持 BLE 连接。

1.示例代码

下面展示如何将 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);
  }
}

2.测试方法

手机端下载推荐调测工具:nRF Connect for Mobile(iOS / Android 均可用)。

在 APP 中下拉扫描,找到 ESP32_BLE_Demo 并点击 Connect。

展开 UUID 为 4fa86f1a-... 的 Service。

点击 Characteristic 旁边的 向下双箭头(订阅 Notify 功能),即可看到 ESP32 实时推送到手机的传感器数值。



作者签名: www.ydxhuo.com   楼主  2026-08-04 16:21:17
回复列表
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
您的IP: 216.73.216.31 , 2026-08-12 19:48:24
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
(4) 分享
分享

请保存二维码或复制链接进行分享

取消
免责声明
1、本站资源,均来自网络与个人作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !

侵权删除请致信 E-Mail:ydxho@qq.com
已有0次打赏