两种蓝牙模式通信
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的蓝牙功能。
安装配置步骤可参考:
经典蓝牙模式
选择文件→示例→BluetoothSerial→SerialToSerialBT
用法同串口,需要先初始化蓝牙设备:
SerialBT.begin("ESP32test"); //Bluetooth device name
接收蓝牙数据并串口打印:
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
接收串口数据并蓝牙发送::
if (Serial.available()) {
SerialBT.write(Serial.read());
}
彼此之间形成了回环。
低功耗蓝牙模式
选择文件→示例→ESP32 BLE Arduino→BLE_uart
工作流程
这个DEMO程序是将ESP32作为蓝牙服务器,按照以下流程工作:
创建蓝牙服务器
// Create the BLE Device
BLEDevice::init("UART Service");//搜索到的蓝牙名称,可自定义
// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
在类MyServerCallbacks()定义了蓝牙服务器的连接和断开:
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
创建蓝牙服务
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);
其中,SERVICE_UUID是定义的服务ID,用于标识蓝牙设备提供的服务。
创建蓝牙服务对应的特征
// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);
创建特征对应的描述符
pTxCharacteristic->addDescriptor(new BLE2902());
BLE2902是Bluetooth Low Energy (BLE)中的一个描述符,用于定义BLE特征(Characteristic)的某些属性。
pRxCharacteristic->setCallbacks(new MyCallbacks());
回调函数,当接收到蓝牙数据后执行。
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("*********");
}
}
};
开始蓝牙服务
// Start the service
pService->start();
开始广播
// Start advertising
pServer->getAdvertising()->start();