文章目录
前言
本文简单介绍了蓝牙技术
一、核心技术原理
蓝牙模块基于 **2.4GHz ISM频段(2402-2480MHz)**工作,采用 FHSS跳频技术(1600次/秒)和 GFSK调制 实现抗干扰通信,主要包含三大核心阶段:
蓝牙工作流程
设备发现阶段
- 通过广播信道(37/38/39)发送 ADV_IND 数据包
- 包含设备MAC地址、名称、服务UUID等信息
- 扫描设备使用 SCAN_REQ 请求详细数据
配对连接阶段
- 采用 ECDH椭圆曲线加密 生成临时密钥
- 经典蓝牙使用PIN码配对(如0000)
- BLE采用 LE Secure Connections 安全协议
数据传输阶段
- 经典蓝牙:通过 ACL链路 传输大数据(音频/文件)
- BLE:基于 ATT协议 的 GATT数据框架
- 典型数据包结构:
| Preamble | Access Address | PDU | CRC |
|----------|----------------|-----|-----|
| 1字节 | 4字节 | 2-257B | 3B |
二、协议栈架构(以BLE为例)
±----------------------+
| Application Layer |
±----------------------+
| GATT | GAP | SMP |
±----------------------+
| ATT | L2CAP |
±----------------------+
| HCI |
±----------------------+
| Link Layer |
±----------------------+
| Physical Layer |
±----------------------+
1.物理层
物理层:负责射频信号调制解调
2.链路层
链路层:管理连接状态(Advertising/Connected)
3.HCI层
HCI层:硬件与协议栈的通信接口
4.GATT
GATT:定义服务/特征值的数据结构
三、典型应用场景扩展
1. 室内定位系统(蓝牙5.1+)
使用 AoA/AoD 到达角检测技术
精度可达10cm级别
应用案例:博物馆展品定位导览
2. 运动健康监测
智能跳绳:BLE实时传输计数数据
运动手环:步频/卡路里消耗同步
示例数据结构:
struct SportData {
uint16_t heart_rate; // 心率值
uint32_t step_count; // 步数
uint8_t calories; // 千卡数
};
3. 工业控制
- 无线PLC控制器
- 设备状态监控(温度/振动数据)
- 采用 Bluetooth Mesh 实现车间组网
四、ESP32开发示例(BLE+经典蓝牙)
1.环境配置
#PlatformIO配置
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
esp32-ble-arduino
2.BLE服务端代码
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHAR_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLECharacteristic *pCharacteristic;
void setup() {
BLEDevice::init("MyBLE");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHAR_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->start();
}
void loop() {
// 每2秒发送传感器数据
int sensorValue = analogRead(A0);
uint8_t data[2] = {sensorValue >> 8, sensorValue & 0xFF};
pCharacteristic->setValue(data, 2);
pCharacteristic->notify();
delay(2000);
}
3.经典蓝牙串口通信
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32_Classic");
}
void loop() {
if (SerialBT.available()) {
String command = SerialBT.readStringUntil('\n');
if(command == "GET_TEMP"){
float temp = readTemperature();
SerialBT.println(temp);
}
}
}
float readTemperature(){
// 模拟温度传感器读取
return random(200, 300)/10.0;
}
五、关键技术参数对比
参数 经典蓝牙 BLE
峰值电流 30mA 15μA(广播模式)
最大数据速率 3Mbps(EDR) 2Mbps(BLE5.0)
连接建立时间 100-300ms <3ms
典型应用 音频传输 传感器网络
六、开发调试技巧
空中抓包分析
- 使用Nordic的nRF Sniffer工具
Wireshark解码蓝牙协议:
nrf_sniffer_ble -c 37 -d COM5 | wireshark -k -i -
- 功耗优化实践
调整连接间隔(Connection Interval)
// ESP32设置连接参数
BLEServer *pServer = BLEDevice::createServer();
pServer->updateConnParams(deviceAddress, 60, 120, 0, 400);
- 抗干扰设计
采用自适应跳频(AFH)
在代码中添加信道质量监测:
esp_ble_gap_read_rssi(remote_bda);
七、最新技术演进(蓝牙5.4)
1.PAwR广播(Periodic Advertising with Responses)
- 支持双向通信的广播模式
- 适用于电子价签等应用
2.加密广播数据
- 增强ADV_DATA的加密强度
- 使用AES-CCM链式加密
3.LE Audio
- 支持LC3音频编码\
- 实现多设备音频同步传输
通过深入理解蓝牙协议栈各层工作原理,开发者可以更好地优化连接稳定性、降低功耗并实现复杂应用场景需求。实际开发中建议结合具体芯片的SDK(如Nordic nRF5 SDK、TI CC2640 SDK)进行深度定制开发。