BLE 配对通信 · 手机控制设备

📅 2026-05-11 · 📂 硬件编程 · ⏱ 阅读约 7 分钟

📺 B站推荐视频:ESP32 入门教程

概述

上篇学会了 BLE 广播和扫描,本篇更进一步——建立 GATT 连接,用手机 App 读写 ESP32 的特征值,实现远程控制 LED 的亮灭和 PWM 调光。

学习目标:创建 GATT 服务,实现 Characteristic 的 Read/Write/Notify,理解 BLE 数据交互流程。

物料清单

GATT 数据交互设计

服务 UUID特征 UUID属性功能
4fafc201-1fb5-459e-8fcc-c5c9c331914bbeb5483e-36e1-4688-b7f5-ea07361b26a8Read/Write/NotifyLED 控制字符串

完整代码

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

手机端操作步骤

  1. 打开 nRF Connect → 扫描设备 → 找到 "ESP32_LED_CTRL" → 连接
  2. 展开 Service → 点击 Characteristic(上行箭头图标)→ 输入 "ON" 发送
  3. LED 亮起,Characteristic 值变为 "LED=ON"
  4. 输入 "OFF" → LED 熄灭