QLowEnergyService Class
QLowEnergyService 类表示蓝牙低功耗设备上的单个服务。更多内容...
| 头文件: | #include <QLowEnergyService> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Bluetooth) target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake: | QT += bluetooth |
| 继承自: | QObject |
公共类型
(since 6.2) enum | DiscoveryMode { FullDiscovery, SkipValueDiscovery } |
| enum | ServiceError { NoError, OperationError, CharacteristicReadError, CharacteristicWriteError, DescriptorReadError, …, UnknownError } |
| enum | ServiceState { InvalidService, RemoteService, RemoteServiceDiscovering, RemoteServiceDiscovered, LocalService, …, ServiceDiscovered } |
| enum | ServiceType { PrimaryService, IncludedService } |
| flags | ServiceTypes |
| enum | WriteMode { WriteWithResponse, WriteWithoutResponse, WriteSigned } |
公共函数
| virtual | ~QLowEnergyService() |
| QLowEnergyCharacteristic | characteristic(const QBluetoothUuid &uuid) const |
| QList<QLowEnergyCharacteristic> | characteristics() const |
| bool | contains(const QLowEnergyCharacteristic &characteristic) const |
| bool | contains(const QLowEnergyDescriptor &descriptor) const |
| void | discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery) |
| QLowEnergyService::ServiceError | error() const |
| QList<QBluetoothUuid> | includedServices() const |
| void | readCharacteristic(const QLowEnergyCharacteristic &characteristic) |
| void | readDescriptor(const QLowEnergyDescriptor &descriptor) |
| QString | serviceName() const |
| QBluetoothUuid | serviceUuid() const |
| QLowEnergyService::ServiceState | state() const |
| QLowEnergyService::ServiceTypes | type() const |
| void | writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse) |
| void | writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
信号
| void | characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) |
| void | characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) |
| void | descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
(since 6.2) void | errorOccurred(QLowEnergyService::ServiceError newError) |
| void | stateChanged(QLowEnergyService::ServiceState newState) |
详细说明
QLowEnergyService 提供了访问蓝牙低功耗服务详细信息的接口。该类支持服务详细信息的发现和发布,允许读写其中包含的数据,并会在数据发生变化时发出通知。
服务结构
一个蓝牙低功耗外设设备可以包含多个服务。而每个服务又可能包含其他服务。本类表示外设设备中的单个服务,并通过 `QLowEnergyController::createServiceObject()` 创建。`type()` 参数用于指定该服务是主服务(顶级服务),还是属于另一个服务的一部分。 每个服务可能包含一个或多个特征,每个特征可能包含描述符。最终的结构可能如下图所示:

特征是主要的信息载体。它具有value()和properties(),用于描述对该值的访问权限。所包含的描述符通常用于进一步定义特征的性质。例如,它可能指定应如何解释该值,或者该值是否能向值消费者通知值的变化。
服务交互
服务对象首次创建后,其详细信息尚待发现。这通过其当前的state()为DiscoveryRequired 来表示。此时仅能检索serviceUuid()和serviceName()。
调用discoverDetails() 时,将触发对其包含的服务、特征和描述符的发现过程。在发现过程中,state() 状态会从DiscoveryRequired 经由DiscoveringService 过渡到最终的ServiceDiscovered 状态。此过渡通过stateChanged() 信号进行广播。一旦详细信息被获取,其中包含的所有特征、描述符和包含的服务均已知晓,并可进行读写操作。
特征和描述符的值可分别通过QLowEnergyCharacteristic 和QLowEnergyDescriptor 获取。但是,要直接读取或写入这些属性,则需要服务对象。readCharacteristic() 函数试图重新读取特征的值。尽管初始服务发现可能已经获取了该值,但在特征值持续变化且未提供任何通知的情况下,可能需要调用此函数。 例如,一个提供连续值的时间特征。如果读取尝试成功,则发出characteristicRead() 信号。读取值失败会触发CharacteristicReadError 。writeCharacteristic() 函数尝试将新值写入给定的特征。如果写入尝试成功,则发出characteristicWritten() 信号。 写入失败将触发CharacteristicWriteError 。描述符的读写操作遵循相同的模式。
每次都会尝试读取或写入硬件上描述符或特征的值。这意味着在读写过程中,通常会忽略诸如QLowEnergyCharacteristic::properties()之类的元信息。例如,即使根据元数据描述该特征为只读,仍可调用writeCharacteristic()。 生成的写入请求将转发至连接的设备,而如何响应该潜在无效请求则由设备自行决定。在此情况下,系统会针对返回的设备错误触发CharacteristicWriteError 。这种行为简化了与报告错误元数据的设备之间的交互。如果无法将请求转发至远程设备,则会设置OperationError 。 可能的原因之一是待写的特征对象甚至不属于当前服务。总而言之,这两种错误类型使得能够快速区分本地错误和远程错误情况。
所有请求均基于“先入先出”原则进行序列化。例如,如果在之前的写入请求尚未完成之前发出第二个写入请求,则该请求将被延迟,直至第一个写入请求完成后才执行。
注意:目前 无法发送带签名的写入请求或可靠写入请求。
在某些情况下,外设会生成值更新,而主控端希望接收这些更新。为了使某个特性支持此类通知,该特性必须具有QLowEnergyCharacteristic::Notify 或QLowEnergyCharacteristic::Indicate 属性,以及类型为QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration 的描述符。只要满足这些条件,即可按照以下代码片段所示启用通知:
//PreCondition: service details already discovered
QLowEnergyCharacteristic batteryLevel = service->characteristic(
QBluetoothUuid::CharacteristicType::BatteryLevel);
if (!batteryLevel.isValid())
return;
QLowEnergyDescriptor notification = batteryLevel.descriptor(
QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
if (!notification.isValid())
return;
// establish hook into notifications
connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)),
this, SLOT(characteristicChanged(QLowEnergyCharacteristic,QByteArray)));
// enable notification
service->writeDescriptor(notification, QByteArray::fromHex("0100"));
// disable notification
//service->writeDescriptor(notification, QByteArray::fromHex("0000"));
// wait until descriptorWritten() signal is emitted
// to confirm successful write该示例展示了一个电池电量特征,该特征会在每次值发生变化时向中心设备发送更新。通知通过characteristicChanged() 信号提供。有关此机制的更多详细信息,请参阅《蓝牙规范》。
服务数据共享
每个 QLowEnergyService 实例都会与其所属服务的其他 QLowEnergyService 实例共享其内部状态和信息。如果一个实例启动了服务详情的发现,其余所有实例都会自动跟进。因此,以下代码片段始终有效:
QLowEnergyService *first, *second;
QLowEnergyController control(remoteDevice);
control.connectToDevice();
// waiting for connection
first = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
second = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
Q_ASSERT(first->state() == QLowEnergyService::RemoteService);
Q_ASSERT(first->state() == second->state());
first->discoverDetails();
Q_ASSERT(first->state() == QLowEnergyService::RemoteServiceDiscovering);
Q_ASSERT(first->state() == second->state());其他操作,例如调用 `readCharacteristic()`、`readDescriptor()`、`writeCharacteristic()`、`writeDescriptor()`,或者因相关的 `QLowEnergyController ` 与设备断开连接而导致的服务失效,均以相同的方式进行共享。
另请参阅 QLowEnergyController 、QLowEnergyCharacteristic 以及QLowEnergyDescriptor 。
成员类型文档
[since 6.2] enum QLowEnergyService::DiscoveryMode
此枚举列出了服务发现模式。所有模式都会发现服务的特征及其特征描述符。这些模式的区别在于是否读取特征值和描述符。
| 常量 | 值 | 描述 |
|---|---|---|
QLowEnergyService::FullDiscovery | 0 | 在完全发现过程中,将发现所有特征。所有特征值和描述符均会被读取。 |
QLowEnergyService::SkipValueDiscovery | 1 | 在最小发现过程中,将发现所有特性。不会读取特性值和描述符。 |
该枚举类型在 Qt 6.2 中引入。
另请参阅 discoverDetails()。
enum QLowEnergyService::ServiceError
该枚举描述了服务运行期间可能出现的全部错误情况。error() 函数返回最近发生的错误。
| 常量 | 值 | 描述 |
|---|---|---|
QLowEnergyService::NoError | 0 | 未发生错误。 |
QLowEnergyService::OperationError | 1 | 在服务尚未就绪时尝试执行操作。例如,在服务尚未处于ServiceDiscovered state ()状态时尝试向其写入数据,或者由于与外围设备断开连接导致服务无效。 |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | 读取特征值的尝试失败。例如,这可能是调用readCharacteristic() 时触发的。 |
QLowEnergyService::CharacteristicWriteError | 2 | 向特征写入新值的尝试失败。例如,当尝试向只读特征写入数据时,可能会触发此错误。 |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | 读取描述符值失败。例如,这可能是对调用readDescriptor() 的响应而触发的。 |
QLowEnergyService::DescriptorWriteError | 3 | 向描述符写入新值的操作失败。例如,当尝试向只读描述符写入数据时,可能会触发此错误。 |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | 与服务交互时发生未知错误。 |
enum QLowEnergyService::ServiceState
此枚举描述了服务对象的state()。
| 常量 | 值 | 描述 |
|---|---|---|
QLowEnergyService::InvalidService | 0 | 当服务与底层设备失去连接时,该服务可能会变为无效。即使连接已中断,它仍会保留其最新信息。无效的服务即使与设备重新建立了连接,也无法恢复为有效状态。 |
QLowEnergyService::RemoteService | 1 | 服务详情尚需通过调用discoverDetails() 来发现。唯一可靠的信息是其serviceUuid() 和serviceName()。 |
QLowEnergyService::RemoteServiceDiscovering | 2 | 正在发现服务详情。 |
QLowEnergyService::RemoteServiceDiscovered | 3 | 已发现服务详细信息。 |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | 该服务与peripheral role 中的一个控制器对象相关联。此类服务对象不会改变其状态。 |
QLowEnergyService::DiscoveryRequired | RemoteService | 已弃用。已重命名为 RemoteService。 |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | 已弃用。已重命名为 RemoteServiceDiscovering。 |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | 已弃用。已重命名为 RemoteServiceDiscovered。 |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
此枚举描述了服务的类型。
| 常量 | 值 | 描述 |
|---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | 该服务是顶级/主服务。如果未设置此类型标志,则该服务被视为次级服务。每个服务都可能被另一个服务包含,这由 IncludedService 指示。 |
QLowEnergyService::IncludedService | 0x0002 | 该服务被另一个服务所包含。在某些平台上,必须先发现包含当前服务的那个服务,才能确定此标志。 |
ServiceTypes 类型是QFlags<ServiceType> 的 typedef 定义。它存储 ServiceType 值的“或”组合。
enum QLowEnergyService::WriteMode
此枚举描述了写入特性值时应使用的模式。该特性通过其properties 声明其支持的写入模式。
| 常量 | 值 | 描述 |
|---|---|---|
QLowEnergyService::WriteWithResponse | 0 | 如果使用此模式写入特征,外设应发送写入确认。如果操作成功,则通过characteristicWritten()信号发出确认;否则,将发出CharacteristicWriteError 信号。特征必须将QLowEnergyCharacteristic::Write 属性设置为“enable”才能支持此写入模式。 |
QLowEnergyService::WriteWithoutResponse | 1 | 如果使用此模式对特征进行写入,远程外设不得发送写入确认。无法确定操作是否成功,且有效载荷长度不得超过20字节。特征必须已设置QLowEnergyCharacteristic::WriteNoResponse 属性才能支持此写入模式。其优点是写入操作更快,因为它可以在其他设备交互之间进行。 |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | 如果使用此模式对特征进行写入,远程外设不应发送写入确认。无法确定操作是否成功,且有效载荷长度不得超过 8 字节。 两台设备之间必须已建立连接,且该连接不得加密。特征必须已设置QLowEnergyCharacteristic::WriteSigned 属性才能支持此写入模式。目前,该值仅在搭载BlueZ 5且内核版本为3.7或更高版本的Android和Linux系统上受支持。 |
成员函数文档
[virtual noexcept] QLowEnergyService::~QLowEnergyService()
销毁该QLowEnergyService 实例。
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
返回与uuid 匹配的特征;否则返回一个无效的特征。
如果该服务实例尚未调用discoverDetails() 方法,或者不存在具有匹配uuid 的特征,则返回的特征无效。
另请参阅 characteristics()。
[signal] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
如果关联的控制器对象处于“central ”角色,当外设/设备侧的某个事件导致characteristic 的值发生变化时,将发出此信号。在这种情况下,信号的发出意味着在外设发生变化事件之前,必须已通过该特性的ClientCharacteristicConfiguration 描述符启用了变化通知。 有关如何实现此功能的更多详细信息,请参阅above 。
如果控制器处于“peripheral ”角色,即服务对象是通过QLowEnergyController::addService 创建的,则当 GATT 客户端使用写入请求或命令写入特征值时,将发出该信号。
newValue 参数包含characteristic 的更新值。
[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
当对characteristic 的读取请求成功返回其value 时,将发出此信号。该信号可能由调用characteristicRead()触发。如果读取操作未成功,则会通过CharacteristicReadError 标志发出errorOccurred()信号。
注意:此 信号仅在与“中央角色”相关的使用场景中发出。
另请参阅 readCharacteristic()。
[signal] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
当characteristic 的值成功更改为newValue 时,将发出此信号。该更改必须是由调用writeCharacteristic()触发的。如果写入操作未成功,则将使用CharacteristicWriteError 标志发出errorOccurred()信号。
接收到该写入信号可视为目标设备已接收待写入值,并回报了写入请求的状态。
注意:如果 使用“WriteWithoutResponse ”模式调用writeCharacteristic(),则该信号和errorOccurred() 永远不会被发出。
注意:此 信号仅在与中央角色相关的用例中发出。
另请参阅 writeCharacteristic()。
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
返回与该QLowEnergyService 实例关联的所有特征。
如果该服务实例的discoverDetails() 方法尚未被调用,或者不存在已知的特征,则返回的列表为空。
另请参阅 characteristic()、state() 和discoverDetails()。
bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const
如果characteristic 属于该服务,则返回true ;否则返回false 。
若characteristics() 包含characteristic ,则该特征属于该服务。
bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const
如果descriptor 属于此服务,则返回true ;否则返回false 。
[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
当对descriptor 的读取请求成功返回其value 时,将发出此信号。该信号可能由调用descriptorRead()触发。如果读取操作未成功,则会通过DescriptorReadError 标志发出errorOccurred()信号。
注意:此 信号仅在与中央角色相关的用例中发出。
另请参阅 readDescriptor()。
[signal] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
当descriptor 的值成功更改为newValue 时,将发出此信号。如果关联的控制器对象处于central 角色,则该更改必须是由调用writeDescriptor()引起的。否则,该信号是由GATT客户端对相应描述符发出的写入请求或命令所导致的。
另请参阅 writeDescriptor()。
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
启动对该服务所包含的服务、特征及其相关描述符的发现。
发现过程通过stateChanged()信号指示。创建后,服务处于DiscoveryRequired 状态。调用discoverDetails()时,状态将转换为DiscoveringService 。详细信息发现完成后,状态将转换为ServiceDiscovered 。每次状态转换时,都会发出stateChanged()信号。根据参数mode 的不同,将执行FullDiscovery 或SkipValueDiscovery 。无论哪种情况,都会发现所有服务和特征。FullDiscovery 会继续执行并读取所有特征值和描述符。SkipValueDiscovery 则不读取特征值和描述符。SkipValueDiscovery 具有两个优势。首先,它速度更快。 其次,它能规避某些设备中的错误:这些设备错误地将特性或描述符标记为可读,却实际上不允许对其进行读取。这可能会引发不可预测的行为。在执行SkipValueDiscovery 后,必须调用readCharacteristic() /readDescriptor(),并等待它们成功完成,才能访问特性或描述符的值。
参数mode 于 Qt 6.2 中引入。
另请参阅 state()。
QLowEnergyService::ServiceError QLowEnergyService::error() const
返回最近发生的错误,或返回NoError 。
[signal, since 6.2] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
当发生错误时,会发出此信号。newError 参数描述了发生的错误。
该函数于 Qt 6.2 中引入。
QList<QBluetoothUuid> QLowEnergyService::includedServices() const
返回当前服务所包含的所有服务的 UUID。
如果该服务实例的discoverDetails()方法尚未被调用,或者不存在已知的特征,则返回的列表为空。
被包含的服务可能还包含另一个服务。此类二级包含必须通过其相关的一级QLowEnergyService 实例获取。从技术上讲,这可能会导致循环依赖。
QLowEnergyController::createServiceObject应使用 () 方法为每个 UUID 获取服务实例。
另请参阅 createServiceObject()。
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
读取characteristic 的值。如果操作成功,则发出characteristicRead()信号;否则,将设置CharacteristicReadError 。通常,如果characteristic 的QLowEnergyCharacteristic::Read 属性已设置,则该 可被读取。
针对同一远程设备的所有描述符和特征请求均会被序列化。当同时发出多个请求时,会使用队列。该队列不会消除针对同一特征的重复读取请求。
只有当服务处于ServiceDiscovered 状态且该特征属于该服务时,才能读取该特征。如果上述条件之一不成立,则会设置QLowEnergyService::OperationError 。
注意: 即使QLowEnergyCharacteristic::properties()报告属性不可读,调用 此函数仍会尝试从硬件读取该属性的值。如果硬件返回错误,则会设置CharacteristicReadError 。
另请参阅 characteristicRead() 和writeCharacteristic()。
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
读取descriptor 的值。如果操作成功,则发出descriptorRead()信号;否则,将设置DescriptorReadError 。
针对同一远程设备的所有描述符和特征请求均按顺序处理。当同时发出多个请求时,会使用队列。该队列不会消除针对同一描述符的重复读取请求。
只有当服务处于ServiceDiscovered 状态且描述符属于该服务时,才能读取该描述符。如果这两个条件中有任何一个不成立,则会设置QLowEnergyService::OperationError 标志。
另请参阅 descriptorRead() 和writeDescriptor()。
QString QLowEnergyService::serviceName() const
返回服务名称;否则返回空字符串。
只有当 `serviceUuid()` 是已知的 UUID 时,才能获取该名称。
QBluetoothUuid QLowEnergyService::serviceUuid() const
返回该服务的 UUID;否则返回空 UUID。
QLowEnergyService::ServiceState QLowEnergyService::state() const
返回服务的当前状态。
如果设备的服务是首次实例化,则该对象的状态为DiscoveryRequired 。所有指向外设设备上同一服务的服务对象的状态始终相同。这是由于内部对象数据的共享特性所致。因此,在第一个实例之后创建的任何服务对象实例,其状态都与已存在的实例相同。
如果QLowEnergyController 与远程设备断开连接,则该服务将失效。 无效的服务会保留断开连接事件发生时的内部状态。这意味着,一旦服务详细信息被发现,即使从无效的服务中也能检索到这些信息。这允许以下场景:设备建立连接后,检索服务详细信息,随后立即断开连接,以便下一台设备连接到外围设备。
不过,在正常情况下应保持连接,以避免重复发现服务及其详细信息。发现过程可能需要一段时间,客户端可以订阅持续的变更通知。
另请参阅 stateChanged()。
[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
当服务状态发生变化时,会发出此信号。还可以通过state() 获取newState 。
另请参阅 state()。
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
返回服务的类型。
注意: 在服务达到“ServiceDiscovered ”状态之前,不能依赖“type”属性 。该字段初始化值为PrimaryService 。
注意:在 Android平台上 ,无法判断服务是主服务还是次要服务。因此,所有服务均设置了PrimaryService 标志。
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
将newValue 写入characteristic 的值中。其确切语义取决于关联的控制器对象所处的角色。
中心角色
该调用将向远程外设发出写入请求或命令。若操作成功,则触发characteristicWritten()信号;否则将设置CharacteristicWriteError 。调用此函数不会触发characteristicChanged()信号,除非在当前写入请求之后,外设本身再次更改了该值。
mode 参数决定远程设备是否应发送写入确认。待写入的characteristic 必须支持相应的写入模式。该特征支持的写入模式由其QLowEnergyCharacteristic::Write 和QLowEnergyCharacteristic::WriteNoResponse 属性指定。
针对同一远程设备的所有描述符和特征写入请求均按顺序处理。当同时发出多个写入请求时,系统会使用队列机制。该队列并不会消除针对同一特征的重复写入请求。例如,如果将同一描述符先设置为值 A,紧接着又设置为 B,则这两个写入请求将按给定的顺序执行。
注意:目前 无法使用蓝牙规范中定义的带签名或可靠写入操作。
只有当该服务处于ServiceDiscovered 状态且该特征属于该服务时,才能对该特征进行写入。如果上述任一条件不成立,则将设置QLowEnergyService::OperationError 。
注意: 即使QLowEnergyCharacteristic::properties()报告属性不可写,调用 此函数仍会尝试向硬件写入。同样,即使该特性仅支持WriteWithResponse ,也会向硬件发送WriteWithoutResponse 。如果硬件返回错误,则设置CharacteristicWriteError 。
外设角色
该调用将导致特征值在本地数据库中得到更新。
如果当前有客户端已连接,并且该客户端已为该特性启用了通知或指示功能,则将发送相应的信息。如果某设备已为该特性启用了通知或指示功能,且该设备当前未连接,但其与本地设备之间存在绑定关系,则通知或指示将在下次重新连接时发送。
如果特征值的长度存在限制,而newValue 未遵守该限制,则行为未定义。
注意: 在外设模式下,mode 参数将被忽略。
另请参阅 QLowEnergyService::characteristicWritten() 和QLowEnergyService::readCharacteristic()。
void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
将newValue 写入作为descriptor 的值。其确切语义取决于相关联的控制器对象所处的角色。
中心角色
调用此函数将向远程设备发出写请求。如果操作成功,则发出descriptorWritten() 信号;否则发出DescriptorWriteError 信号。
针对同一远程设备的所有描述符和特征请求均被串行化。当同时发出多个写入请求时,会使用队列进行处理。该队列不会消除针对同一描述符的重复写入请求。例如,如果将同一描述符先设置为值 A,紧接着又设置为值 B,则这两个写入请求将按给定的顺序执行。
只有当该服务处于ServiceDiscovered 状态且属于该服务时,才能对描述符进行写入。如果上述条件之一不成立,则设置QLowEnergyService::OperationError 。
外设角色
该值将写入本地服务数据库。如果newValue 中的内容对descriptor 无效,则行为未定义。
另请参见 descriptorWritten() 和readDescriptor()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.