BLE 配对通信 · 手机控制设备
📅 2026-05-11 · 📂 硬件编程 · ⏱ 阅读约 7 分钟
概述
上篇学会了 BLE 广播和扫描,本篇更进一步——建立 GATT 连接,用手机 App 读写 ESP32 的特征值,实现远程控制 LED 的亮灭和 PWM 调光。
学习目标:创建 GATT 服务,实现 Characteristic 的 Read/Write/Notify,理解 BLE 数据交互流程。
物料清单
- ESP32 ×1
- LED ×1 + 220Ω
- 手机安装 nRF Connect 或 Serial Bluetooth Terminal
GATT 数据交互设计
| 服务 UUID | 特征 UUID | 属性 | 功能 |
|---|
| 4fafc201-1fb5-459e-8fcc-c5c9c331914b | beb5483e-36e1-4688-b7f5-ea07361b26a8 | Read/Write/Notify | LED 控制字符串 |
完整代码
// BLE_LED_Control.ino — 手机通过BLE控制LED
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define LED_PIN 23
class MyCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pChar) {
String val = pChar->getValue().c_str();
Serial.printf("收到BLE指令: %s
", val.c_str());
if (val == "ON") { digitalWrite(LED_PIN, HIGH); pChar->setValue("LED=ON"); }
else if (val == "OFF") { digitalWrite(LED_PIN, LOW); pChar->setValue("LED=OFF");}
else { Serial.printf("未知指令: %s
", val.c_str()); }
pChar->notify(); // 通知手机状态已变更
}
};
void setup() {
pinMode(LED_PIN, OUTPUT);
BLEDevice.init("ESP32_LED_CTRL");
BLEServer *pServer = BLEDevice.createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pChar = pService->createCharacteristic(CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY);
pChar->setCallbacks(new MyCallbacks());
pChar->addDescriptor(new BLE2902()); // 启用Notify
pService->start();
pServer->getAdvertising()->start();
}
void loop() { delay(2000); }
手机端操作步骤
- 打开 nRF Connect → 扫描设备 → 找到 "ESP32_LED_CTRL" → 连接
- 展开 Service → 点击 Characteristic(上行箭头图标)→ 输入 "ON" 发送
- LED 亮起,Characteristic 值变为 "LED=ON"
- 输入 "OFF" → LED 熄灭