Arduino-ESP32蓝牙开发大全:经典蓝牙与BLE低功耗

Arduino-ESP32蓝牙开发大全:经典蓝牙与BLE低功耗

【免费下载链接】arduino-esp32 Arduino core for the ESP32 【免费下载链接】arduino-esp32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32

还在为ESP32蓝牙开发而头疼?面对经典蓝牙和BLE的选择困难症?本文将为你提供最完整的Arduino-ESP32蓝牙开发指南,从基础概念到实战应用,一文解决所有蓝牙开发难题!

读完本文你将掌握:

  • ✅ 经典蓝牙SPP与BLE的核心差异和适用场景
  • ✅ ESP32蓝牙库的完整API使用方法
  • ✅ 实战案例:设备发现、配对、数据传输
  • ✅ 安全连接和加密通信的实现
  • ✅ 性能优化和常见问题排查技巧

1. 蓝牙技术选型指南

1.1 经典蓝牙 vs BLE:如何选择?

特性经典蓝牙 (Bluetooth Classic)BLE低功耗蓝牙
功耗高(10-50mA)极低(0.01-0.5mA)
数据传输速率高(2-3Mbps)低(1Mbps)
连接距离10-100米10-100米
连接时间100ms级别3-6ms
适用场景音频传输、文件传输传感器数据、IoT设备
ESP32库BluetoothSerialBLE

1.2 技术架构对比

mermaid

2. 经典蓝牙开发实战

2.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

// 检查SPP串口配置文件
#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Port Profile for Bluetooth is not available
#endif

BluetoothSerial SerialBT;
String device_name = "ESP32-BT-Device";

2.2 基础通信示例

void setup() {
  Serial.begin(115200);
  SerialBT.begin(device_name);  // 设置设备名称
  
  Serial.printf("设备 \"%s\" 已启动,等待蓝牙配对!\n", device_name.c_str());
}

void loop() {
  // 串口到蓝牙双向转发
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

2.3 设备发现与连接管理

#include "BluetoothSerial.h"
#include "BTScan.h"

BluetoothSerial SerialBT;
BTScan* pBTScan;

void discoverDevices() {
  pBTScan = SerialBT.getScanResults();
  int count = pBTScan->getCount();
  
  Serial.println("发现蓝牙设备:");
  for(int i = 0; i < count; i++) {
    BTAdvertisedDevice* device = pBTScan->getDevice(i);
    Serial.printf("设备 %d: %s [%s]\n", 
                 i, 
                 device->getName().c_str(),
                 device->getAddress().toString().c_str());
  }
}

void removePairedDevices() {
  SerialBT.deleteAllBondedDevices();
  Serial.println("已删除所有配对设备");
}

2.4 安全连接配置

void setupSecureConnection() {
  SerialBT.enableSSP();  // 启用安全简单配对
  
  // 设置配对回调
  SerialBT.onConfirmRequest([](uint32_t numVal){
    Serial.printf("确认配对请求,验证码: %06d\n", numVal);
    // 用户确认后调用 confirmReply(true)
  });
  
  SerialBT.onKeyRequest([](){
    Serial.println("请输入配对密钥");
    // 获取用户输入后调用 respondPasskey(passkey)
  });
  
  SerialBT.begin(device_name);
}

3. BLE低功耗蓝牙开发

3.1 BLE基础架构

mermaid

3.2 BLE服务器示例

#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"

BLEServer *pServer;
BLEService *pService;
BLECharacteristic *pCharacteristic;

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
        Serial.println("设备已连接");
    }
    
    void onDisconnect(BLEServer* pServer) {
        Serial.println("设备已断开");
        BLEDevice::startAdvertising(); // 重新开始广播
    }
};

void setup() {
    Serial.begin(115200);
    
    BLEDevice::init("ESP32-BLE-Server");
    pServer = BLEDevice::createServer();
    pServer->setCallbacks(new MyServerCallbacks());
    
    pService = pServer->createService(SERVICE_UUID);
    pCharacteristic = pService->createCharacteristic(
        CHARACTERISTIC_UUID,
        BLECharacteristic::PROPERTY_READ |
        BLECharacteristic::PROPERTY_WRITE |
        BLECharacteristic::PROPERTY_NOTIFY
    );
    
    pCharacteristic->setValue("Hello BLE World");
    pService->start();
    
    BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
    pAdvertising->addServiceUUID(SERVICE_UUID);
    pAdvertising->setScanResponse(true);
    pAdvertising->setMinPreferred(0x06);
    BLEDevice::startAdvertising();
    
    Serial.println("BLE服务器已启动,等待连接...");
}

3.3 BLE客户端示例

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

static BLEAddress serverAddress("xx:xx:xx:xx:xx:xx");
static boolean doConnect = false;
static boolean connected = false;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
        if (advertisedDevice.getName() == "ESP32-BLE-Server") {
            advertisedDevice.getScan()->stop();
            serverAddress = advertisedDevice.getAddress();
            doConnect = true;
            Serial.println("发现目标设备");
        }
    }
};

void setup() {
    Serial.begin(115200);
    BLEDevice::init("");
    
    BLEScan* pBLEScan = BLEDevice::getScan();
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(true);
    pBLEScan->start(30);
}

void loop() {
    if (doConnect == true) {
        if (connectToServer()) {
            Serial.println("成功连接到服务器");
        } else {
            Serial.println("连接失败");
        }
        doConnect = false;
    }
    delay(1000);
}

4. 高级功能与性能优化

4.1 蓝牙连接状态管理

enum BluetoothState {
    STATE_DISCONNECTED,
    STATE_CONNECTING,
    STATE_CONNECTED,
    STATE_TRANSFERRING
};

class BluetoothManager {
private:
    BluetoothState currentState;
    unsigned long lastStateChange;
    
public:
    BluetoothManager() : currentState(STATE_DISCONNECTED), lastStateChange(0) {}
    
    void setState(BluetoothState newState) {
        currentState = newState;
        lastStateChange = millis();
        logStateChange();
    }
    
    void logStateChange() {
        const char* stateNames[] = {
            "断开连接", "连接中", "已连接", "传输中"
        };
        Serial.printf("蓝牙状态变更: %s\n", stateNames[currentState]);
    }
    
    bool isStableState() {
        return (millis() - lastStateChange) > 5000;
    }
};

4.2 数据传输优化策略

class DataTransmitter {
private:
    QueueHandle_t dataQueue;
    const size_t MAX_PACKET_SIZE = 512;
    
public:
    DataTransmitter() {
        dataQueue = xQueueCreate(10, sizeof(char[MAX_PACKET_SIZE]));
    }
    
    bool sendData(const char* data, size_t length) {
        if (length > MAX_PACKET_SIZE) {
            Serial.println("数据包过大");
            return false;
        }
        
        char packet[MAX_PACKET_SIZE];
        memcpy(packet, data, length);
        
        if (xQueueSend(dataQueue, &packet, pdMS_TO_TICKS(100)) != pdTRUE) {
            Serial.println("发送队列已满");
            return false;
        }
        
        return true;
    }
    
    void transmissionTask(void* parameter) {
        char packet[MAX_PACKET_SIZE];
        while(true) {
            if (xQueueReceive(dataQueue, &packet, portMAX_DELAY) == pdTRUE) {
                // 实际发送逻辑
                SerialBT.write((uint8_t*)packet, strlen(packet));
            }
        }
    }
};

5. 安全最佳实践

5.1 加密通信实现

#include <mbedtls/aes.h>

class SecureBluetooth {
private:
    mbedtls_aes_context aes;
    unsigned char key[32];
    unsigned char iv[16];
    
public:
    SecureBluetooth() {
        mbedtls_aes_init(&aes);
        // 生成或加载加密密钥
        generateKey();
    }
    
    void generateKey() {
        // 实际应用中应从安全存储获取密钥
        for(int i = 0; i < 32; i++) key[i] = i;
        for(int i = 0; i < 16; i++) iv[i] = 16 - i;
        
        mbedtls_aes_setkey_enc(&aes, key, 256);
    }
    
    size_t encryptData(const unsigned char* input, size_t length, 
                      unsigned char* output) {
        size_t encryptedLength = 0;
        mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, 
                             length, iv, input, output);
        return length; // CBC模式输出长度与输入相同
    }
    
    size_t decryptData(const unsigned char* input, size_t length,
                      unsigned char* output) {
        mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT,
                             length, iv, input, output);
        return length;
    }
};

6. 实战项目:智能家居蓝牙网关

6.1 项目架构设计

mermaid

6.2 网关核心代码

#include <BluetoothSerial.h>
#include <BLEDevice.h>
#include <WiFi.h>

BluetoothSerial SerialBT;
BLEScan* pBLEScan;

// WiFi配置
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// 云服务配置
const char* serverURL = "http://api.iot-platform.com/data";

void setup() {
    Serial.begin(115200);
    
    // 初始化经典蓝牙
    SerialBT.begin("SmartHome-Gateway");
    
    // 初始化BLE
    BLEDevice::init("");
    pBLEScan = BLEDevice::getScan();
    pBLEScan->setActiveScan(true);
    
    // 连接WiFi
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("WiFi连接成功");
}

void loop() {
    // BLE设备扫描
    BLEScanResults foundDevices = pBLEScan->start(5, false);
    
    for (int i = 0; i < foundDevices.getCount(); i++) {
        BLEAdvertisedDevice device = foundDevices.getDevice(i);
        processBLEDevice(device);
    }
    
    pBLEScan->clearResults();
    
    // 处理经典蓝牙连接
    handleBluetoothSerial();
    
    delay(10000); // 每10秒扫描一次
}

void processBLEDevice(BLEAdvertisedDevice device) {
    String name = device.getName().c_str();
    if (name.startsWith("Sensor-")) {
        String data = readSensorData(device);
        sendToCloud(data);
        sendToBluetooth(data);
    }
}

void handleBluetoothSerial() {
    if (SerialBT.available()) {
        String command = SerialBT.readString();
        processCommand(command);
    }
}

7. 性能测试与优化

7.1 传输性能基准测试

测试项目经典蓝牙SPPBLE
最大传输速率2.1 Mbps1.0 Mbps
最小功耗15 mA0.1 mA
连接建立时间120 ms6 ms
数据传输延迟20 ms30 ms
最大同时连接7 devices20+ devices

7.2 内存使用优化

class MemoryOptimizer {
private:
    const size_t MAX_BLE_DEVICES = 20;
    const size_t MAX_CLASSIC_CONNECTIONS = 3;
    
public:
    void optimizeMemoryUsage() {
        // 调整BLE扫描参数

【免费下载链接】arduino-esp32 Arduino core for the ESP32 【免费下载链接】arduino-esp32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值