BLE协议栈入门一(基本概念)
BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,广泛应用于物联网、智能家居、健康监测等领域。BLE协议栈是指在BLE设备中实现BLE协议的软件栈,包括物理层、链路层、协议层和应用层。本攻略将介绍BLE协议栈的基本概,包括BLE协议栈的组成、BLE协议栈的层次结构、BLE协议栈的工作原理等。
BLE协议栈的组成
BLE协议栈由四个层次组成,分别是物理层、链路层、协议层和应用层。下面是各层次的详细说明:
-
物理层:BLE协议栈的最底层,负责处理物理层面的通信,包括射频、调制解调、频率合成等。物理层的主要任务是将数字信号转换为模拟信号,并将模拟信号发送到BLE设备的天线。
-
链路层:位于物理层之上,负责处理链路层面的通信,包括数据包的传输、错误检测和纠错等。链路层的主要任务是将数据包从一个BLE设备传输到另一个BLE设备,并确保数据包的可靠性。
-
协议层:位于链路层之上,负责处理协议层面的通信,包括连接管理、安全性、数据传输等。协议层的主要任务是管理BLE设备之间的连接,并确保数据传输的安全性和可靠性。
-
应用层:位于协议层之上,负责处理应用层面的通信,包括数据的处理、存储和显示等。应用层的主要任务是处理BLE设备收到的数据,并将数据显示给用户或存储到设备中。
BLE协议栈的层次结构
BLE协议栈的四个层次之间存在着明确的层次结构,每个层次都提供了一组API(应用程序接口),上层调用。下面是BLE协议栈的层次结构:
-
应用层API:提供了一组API,供应用程序调用,包括数据的处理、存储和显示等。
-
协议层API:提供了一组API,供应用程序调用,包括连接管理、安全性、数据传输等。
-
链路层API:提供了一组API,供协议层调用,包括数据包的传输、错误检和纠错等。
-
物理层API:提供了一组API,供链路层调用,包括射频、调制解调、频率合成等。
BLE协议栈的工作原理
BLE协议栈的工作原理可以分为两个阶段,分别是连接阶段和数据传输阶段。下面是各阶段的详细说明:
-
连接阶段:在连接阶段,BLE设备之间进行连接,包括广播、扫描、建立连接等。连接阶段的主要任务是建立BLE设备之间的连接,并进行身份验证和加密。
-
数据传输阶段:在数据传输阶段,BLE设备之间进行数据传输,包括数据包的传输、错误检测和纠错等。数据传输阶段的主要任务是将数据包从一个BLE设备传输到另一个BLE设备,并确保数据包的可靠性。
示例一:BLE设备之间的连接
假设我们有两个BLE设备,一个是中央设备(Central),另一个是外围设备(Peripheral)。我们想要在这两个设备之间建立连接。我们可以使用以下代码:
// 中央设备
BLEDevice central;
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
BLEScanResults scanResults = pBLEScan->start(5);
for (int i = 0; i < scanResults.getCount(); i++) {
BLEAdvertisedDevice advertisedDevice = scanResults.getDevice(i);
if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(BLEUUID((uint16_t)0x180D))) {
central.connect(advertisedDevice);
}
}
// 外围设备
BLEDevice peripheral;
BLEServer* pServer = BLEDevice::createServer();
BLEService* pService = pServer->createService(BLEUUID((uint16_t)0x180D));
BLECharacteristic* pCharacteristic = pService->createCharacteristic(
BLEUUID((uint16_t)0x2A37),
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising* pAdvertising = pServer->getAdvertising();
pAdvertising->addServiceUUID(pService->getUUID());
pAdvertising->start();
执行代码后,中央设备会扫描周围的BLE设备,找到外围设备后,会建立连接并进行身份验证和加密。
示例二:BLE设备之间的数据传输
假设我们已经在两个BLE设备之间建立了连接,现在我们想要在这两个设备之间传输数据。我们可以使用以下代码:
// 中央设备
BLEDevice central;
BLEClient* pClient = central.createClient();
BLERemoteService* pRemoteService = pClient->connect(remoteAddress);
BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic(BLEUUID((uint16_t)0x2A37));
std::string value = pRemoteCharacteristic->readValue();
// 外围设备
BLEDevice peripheral;
BLEServer* pServer = BLEDevice::createServer();
BLEService* pService = pServer->createService(BLEUUID((uint16_t)0x180D));
BLECharacteristic* pCharacteristic = pService->createCharacteristic(
BLEUUID((uint16_t)0x2A37),
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising* pAdvertising = pServer->getAdvertising();
pAdvertising->addServiceUUID(pService->getUUID());
pAdvertising->start();
执行代码后,中央设备会从外围设备的特征值中读取数据,并将数据存储在变量“中。
总结
BLE协议栈是指在BLE设备中实现BLE协议的软件栈,包括物理层、链路层、协议层和应用层。BLE协议栈的工作原理可以分为连接阶段和数据传输阶段。在实际使用中,可以根据需要灵活运用这些API,实现BLE设备之间的连接和数据传输。