ESP32蓝牙通信:经典蓝牙与低功耗蓝牙(BLE)详解
目录
- 经典蓝牙(蓝牙串口通信)
- 环境搭建
- 代码实现
- 代码解析
- 蓝牙低功耗(BLE)
- BLE基础概念
- 代码实现
- 代码解析
- BLE应用(手机与ESP32通信)
- 手机App选择
- 代码实现
- 代码解析
- 总结
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 Connect
或LightBlue
等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都能满足你的需求。