Skip to content

两种蓝牙模式通信

ESP32支持两种蓝牙模式:‌经典蓝牙和低功耗蓝牙(‌BLE)‌。‌

ESP32作为一款功能强大的单片机,‌支持蓝牙通信是其重要特性之一。‌它不仅能够与传统的蓝牙设备(‌如耳机、‌键盘、‌鼠标)‌进行通信,‌还支持低功耗蓝牙(‌BLE)‌标准,‌使得与低功耗设备(‌如传感器、‌健康追踪器、‌智能家居设备)‌的通信成为可能。‌这种双重支持使得ESP32在物联网(‌IoT)‌应用中具有广泛的应用潜力。‌

  • 经典蓝牙(‌Classic Bluetooth)‌:‌主要用于与传统的蓝牙设备进行通信。‌
  • 低功耗蓝牙(‌BLE, Bluetooth Low Energy)‌:‌专为与低功耗设备通信设计,‌适用于需要长时间运行且对功耗有严格要求的场景。‌

ESP32的支持这两种蓝牙模式的能力,‌使其能够适应不同的应用需求,‌无论是需要高速数据传输的传统蓝牙设备,‌还是对功耗有严格要求的新型物联网设备,‌都能够通过ESP32进行有效的连接和通信。

注意:微信小程序只能搜索到低功耗蓝牙并与其通信。连接硬件能力 / 蓝牙 / 蓝牙低功耗 (BLE) (qq.com)

在整个通信过程中,有几个最主要的概念:

  • 配置文件 (Profile): Profile 是被蓝牙标准预先定义的一些 Service 的集合,并不真实存在于蓝牙设备中。如果蓝牙设备之间要相互兼容,它们只要支持相同的 Profile 即可。一个蓝牙设备可以支持多个 Profile。
  • 服务 (Service): Service 是蓝牙设备对外提供的服务,一个设备可以提供多个服务,比如电量信息服务、系统信息服务等。每个服务由一个 UUID 唯一标识。
  • 特征 (Characteristic): 每个 Service 包含 0 至多个 Characteristic。比如,电量信息服务就会有个 Characteristic 表示电量数据。Characteristic 包含一个值 (value)和 0 至多个描述符 (Descriptor) 组成。在与蓝牙设备通信时,主要就是通过读写 Characteristic 的 value 完成。 每个 Characteristic 由一个 UUID 唯一标识。
  • 描述符 (Descriptor): Descriptor 是描述特征值的已定义属性。例如,Descriptor 可指定人类可读的描述、特征值的取值范围或特定于特征值的度量单位。每个 Descriptor 由一个 UUID 唯一标识。

安装配置好ARDUINO下ESP32的开发环境后,可以借助自带的例程探索ESP32的蓝牙功能。

安装配置步骤可参考:

ARDUINO安装配置

经典蓝牙模式

选择文件→示例→BluetoothSerial→SerialToSerialBT

两种蓝牙模式通信-1

用法同串口,需要先初始化蓝牙设备:

c
SerialBT.begin("ESP32test"); //Bluetooth device name

接收蓝牙数据并串口打印:

c
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }

接收串口数据并蓝牙发送::

c
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }

彼此之间形成了回环。

低功耗蓝牙模式

选择文件→示例→ESP32 BLE Arduino→BLE_uart

两种蓝牙模式通信-2

工作流程

这个DEMO程序是将ESP32作为蓝牙服务器,按照以下流程工作:

创建蓝牙服务器

c
  // Create the BLE Device
  BLEDevice::init("UART Service");//搜索到的蓝牙名称,可自定义

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

在类MyServerCallbacks()定义了蓝牙服务器的连接和断开:

c
class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

创建蓝牙服务

c
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);

其中,SERVICE_UUID是定义的服务ID,用于标识蓝牙设备提供的服务。‌

创建蓝牙服务对应的特征

c
// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
									CHARACTERISTIC_UUID_TX,
									BLECharacteristic::PROPERTY_NOTIFY
								);


BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
										CHARACTERISTIC_UUID_RX,
										BLECharacteristic::PROPERTY_WRITE
									);

创建特征对应的描述符

c
pTxCharacteristic->addDescriptor(new BLE2902());

BLE2902是Bluetooth Low Energy (BLE)中的一个描述符,‌用于定义BLE特征(‌Characteristic)‌的某些属性。‌

c
pRxCharacteristic->setCallbacks(new MyCallbacks());

回调函数,当接收到蓝牙数据后执行。

c
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.println("*********");
        Serial.print("Received Value: ");
        for (int i = 0; i < rxValue.length(); i++)
          Serial.print(rxValue[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

开始蓝牙服务

c
  // Start the service
pService->start();

开始广播

c
// Start advertising
pServer->getAdvertising()->start();

powered by 天人之际工作室