BLE GATT 服务器特性定义

Posted

技术标签:

【中文标题】BLE GATT 服务器特性定义【英文标题】:BLE GATT server characteristics definitions 【发布时间】:2016-08-02 16:36:37 【问题描述】:

从官方 Qt5 示例开始,我编写了一段非常短的代码,它定义了 GATT 服务器特性:

QLowEnergyCharacteristicData chrCommand;
chrCommand.setUuid(UUID_CHR_COMMAND);
chrCommand.setValue(QByteArray(2, 0));
chrCommand.setProperties(QLowEnergyCharacteristic::Write);
const QLowEnergyDescriptorData clientConfigCommand(QBluetoothUuid::ClientCharacteristicConfiguration, QByteArray(2, 0));
chrCommand.addDescriptor(clientConfigCommand);

然后我自己设置服务器: adsData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral); adsData.setIncludePowerLevel(false); adsData.setLocalName("test"); adsData.setServices(QList()

QLowEnergyServiceData srvService;
srvService.setType(QLowEnergyServiceData::ServiceTypePrimary);
srvService.setUuid(UUID_SRV_SERVICE);
srvService.addCharacteristic(chrCommand);

leController = QLowEnergyController::createPeripheral();
service = leController->addService(srvService);
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData, advertisingData);

所有 UUID 常量都是我自己的随机 UUID。 它有效,我可以发现、绑定并将 2 字节写入我的特征。

我正在阅读 Qt5 和 BLE 文档,但仍有一些我无法自己回答的问题:

如何定义具有更长有效载荷的特征?说一个 16 字节长的“字符串”数组?

单个特征的最大长度是多少?

所有特征的最大长度是多少?

localName 应该和之前的 size 相加吗?

【问题讨论】:

经过一些试验,我似乎可以发送任意长度的数据——我尝试了最多 31 个字节。在一些文档中,我读到 GATT 特性的最大有效负载是 22 个字节。因此,混乱和问题仍然有效! 【参考方案1】:

我不熟悉 Qt BLE 库,但通常你有这些规则:

特征的最大长度为 512 字节。

没有所有特征的最大总长度。

但是,通过无线方式发送值时存在限制:

广告数据分为两部分,每部分最多 31 个字节。第一部分称为广告数据,另一部分称为扫描响应数据。默认情况下,只有第一部分以频繁的时间间隔通过空中发送,但中心可能会通过发送扫描请求来请求扫描响应数据。

Qt 似乎有一些库函数来构建 adv 数据,但您仍然必须注意最大长度。广告数据的内部成分没有限制。

在连接状态下,您可以在标准写入请求中写入最多 20 个字节,如果您执行读取请求,则最多可以获得 22 个字节作为响应。但是协议消息也能够读取和写入“长值”,但它们需要多次往返。

【讨论】:

感谢您的回答,非常有用。无论如何,我尝试写 31 个字节并且它成功了!如果标准读/写方法的最大长度限制为 20/22,我不明白为什么这些特征的值可能高达 512 字节!他们已经考虑过这样的协议来允许更长的有效载荷?

以上是关于BLE GATT 服务器特性定义的主要内容,如果未能解决你的问题,请参考以下文章

BLE入门 19 ATT MTU 提升BLE数据传输率

BLE GATT 介绍

蓝牙BLE GATT完全分析和运用

ESP32学习笔记(31)——BLE带有属性表的GATT服务

GATT特性BLE读取速度慢

我在 Android 应用程序(Java)和 ESP32 BLE 服务器之间的 Gatt 连接有问题