Bootstrap

第三章:ESP32零基础教学 - 3.4 蓝牙通信

ESP32蓝牙通信:经典蓝牙与低功耗蓝牙(BLE)详解

目录

  1. 经典蓝牙(蓝牙串口通信)
    • 环境搭建
    • 代码实现
    • 代码解析
  2. 蓝牙低功耗(BLE)
    • BLE基础概念
    • 代码实现
    • 代码解析
  3. BLE应用(手机与ESP32通信)
    • 手机App选择
    • 代码实现
    • 代码解析
  4. 总结

1. 经典蓝牙(蓝牙串口通信)

环境搭建

首先,确保你已经安装了Arduino IDE,并添加了ESP32开发板支持。如果没有,请参考官方指南进行安装。

代码实现

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32_BT"); // Bluetooth设备名称
  Serial.println("蓝牙设备已启动,等待连接...");
}

void loop() {
  if (SerialBT.available()) {
    char receivedChar = SerialBT.read();
    Serial.print("接收到数据: ");
    Serial.println(receivedChar);
    SerialBT.println(receivedChar); // 回传数据
  }

  if (Serial.available()) {
    char sendChar = Serial.read();
    SerialBT.println(sendChar); // 发送数据到蓝牙
  }
}

代码解析

  • #include "BluetoothSerial.h":包含ESP32的蓝牙串口库。
  • BluetoothSerial SerialBT;:创建BluetoothSerial对象,用于进行蓝牙通信。
  • Serial.begin(115200);:初始化串口通信,波特率设置为115200。
  • SerialBT.begin("ESP32_BT");:启动蓝牙设备,并设置设备名称为“ESP32_BT”。
  • SerialBT.available():检查是否有数据从蓝牙设备接收。
  • SerialBT.read():读取蓝牙设备发送的数据。
  • SerialBT.println(receivedChar);:将接收到的数据回传到蓝牙设备。
  • Serial.available():检查是否有数据从串口发送。
  • SerialBT.println(sendChar);:将串口数据发送到蓝牙设备。

2. 蓝牙低功耗(BLE)

BLE基础概念

BLE是一种低功耗的蓝牙技术,适用于需要长时间运行的设备。BLE通信基于服务和特征值(Characteristics)的概念。

代码实现

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

BLECharacteristic *pCharacteristic;

void setup() {
  Serial.begin(115200);
  
  BLEDevice::init("ESP32_BLE");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ |
                      BLECharacteristic::PROPERTY_WRITE
                    );

  pCharacteristic->setValue("Hello BLE");
  pService->start();
  
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("BLE服务已启动,等待连接...");
}

void loop() {
  // 在这里可以添加其他逻辑
}

代码解析

  • #include <BLEDevice.h>#include <BLEUtils.h>#include <BLEServer.h>:包含BLE相关的库。
  • #define SERVICE_UUID 和 #define CHARACTERISTIC_UUID:定义服务和特征值的UUID。
  • BLEDevice::init("ESP32_BLE");:初始化BLE设备,并设置设备名称为“ESP32_BLE”。
  • BLEServer *pServer = BLEDevice::createServer();:创建BLE服务器。
  • BLEService *pService = pServer->createService(SERVICE_UUID);:创建BLE服务。
  • pCharacteristic = pService->createCharacteristic(...):创建特征值,并设置其属性为可读可写。
  • pCharacteristic->setValue("Hello BLE");:设置特征值的初始值。
  • pService->start();:启动服务。
  • BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();:获取BLE广告对象。
  • pAdvertising->addServiceUUID(SERVICE_UUID);:将服务UUID添加到广告中。
  • BLEDevice::startAdvertising();:开始广告,等待设备连接。

3. BLE应用(手机与ESP32通信)

手机App选择

可以使用nRF ConnectLightBlue等BLE调试App与ESP32进行通信。

代码实现

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

BLECharacteristic *pCharacteristic;

void setup() {
  Serial.begin(115200);
  
  BLEDevice::init("ESP32_BLE");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ |
                      BLECharacteristic::PROPERTY_WRITE
                    );

  pCharacteristic->setValue("Hello BLE");
  pService->start();
  
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("BLE服务已启动,等待连接...");
}

void loop() {
  if (pCharacteristic->getValue() != "Hello BLE") {
    Serial.println("接收到新数据: " + pCharacteristic->getValue());
    pCharacteristic->setValue("Hello BLE"); // 重置值
  }
}

代码解析

  • 本段代码与之前的BLE代码基本相同,只是在loop()中添加了读取特征值的逻辑。
  • pCharacteristic->getValue():获取特征值的当前值。
  • 如果接收到新数据,通过串口打印出来,并重置特征值为“Hello BLE”。

4. 总结

本文详细介绍了如何在ESP32上实现经典蓝牙和BLE通信,并提供了代码解释和示例。通过这些示例,你可以轻松地将蓝牙功能集成到你的物联网项目中。无论是经典蓝牙的简单串口通信,还是BLE的灵活服务架构,ESP32都能满足你的需求。

;