QLowEnergyController 类

QLowEnergyController 类提供对蓝牙低能耗设备的访问。 更多信息...

头文件 #include <QLowEnergyController>
qmakeQT += bluetooth
继承 QObject

公共类型

枚举ControllerState { UnconnectedState, ConnectingState, ConnectedState, DiscoveringState, DiscoveredState, …, AdvertisingState }
枚举Error { NoError, UnknownError, UnknownRemoteDeviceError, NetworkError, InvalidBluetoothAdapterError, …, RssiReadError }
枚举RemoteAddressType { PublicAddress, RandomAddress }
枚举Role { CentralRole, PeripheralRole }

公共函数

virtual~QLowEnergyController()
QLowEnergyService *addService(const QLowEnergyServiceData &service, QObject *parent = nullptr)
voidconnectToDevice()
QLowEnergyService *createServiceObject(const QBluetoothUuid &serviceUuid, QObject *parent = nullptr)
voiddisconnectFromDevice()
voiddiscoverServices()
QLowEnergyController::Errorerror() const
QStringerrorString() const
QBluetoothAddresslocalAddress() const
(since 6.2) intmtu() const
(since 6.5) voidreadRssi()
QBluetoothAddressremoteAddress() const
QLowEnergyController::RemoteAddressTyperemoteAddressType() const
QBluetoothUuidremoteDeviceUuid() const
QStringremoteName() const
voidrequestConnectionUpdate(const QLowEnergyConnectionParameters &parameters)
QLowEnergyController::Rolerole() const
QList<QBluetoothUuid>services() const
voidsetRemoteAddressType(QLowEnergyController::RemoteAddressType type)
voidstartAdvertising(const QLowEnergyAdvertisingParameters &parameters, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData = QLowEnergyAdvertisingData())
QLowEnergyController::ControllerStatestate() const
voidstopAdvertising()

信号

void连接()
voidconnectionUpdated(const QLowEnergyConnectionParameters &newParameters)
void断开连接()
void发现完成()
(自6.2起) void错误发生(QLowEnergyController::Error newError)
voidmtuChanged(int mtu)
(since 6.5) void读取rssi(qint16 rssi)
void发现服务(const QBluetoothUuid &newService)
void状态改变(QLowEnergyController::ControllerState state)

静态公共成员

QLowEnergyController *创建中心(const QBluetoothDeviceInfo &remoteDevice, QObject *parent = nullptr)
QLowEnergyController *创建中心(const QBluetoothDeviceInfo &remoteDevice, const QBluetoothAddress &localDevice, QObject *parent = nullptr)
(自6.2起) QLowEnergyController *创建外围(const QBluetoothAddress &localDevice, QObject *parent = nullptr)
QLowEnergyController *创建外围(QObject *parent = nullptr)

详细描述

QLowEnergyController是蓝牙低功耗开发的入口点。

蓝牙低功耗定义了两种类型的设备:外围设备和中心设备。每种角色执行不同的任务。外围设备提供数据,这些数据被中心设备使用。一个例子可能是一个湿度传感器,它测量冬季花园中的湿度。一部手机等设备可能读取传感器的值,并在整个相同环境中的所有传感器的大环境中显示给用户。在这种情况下,传感器是外围设备,而手机充当中心设备。

通过createCentral()工厂方法创建中心角色的控制器。此类对象实质上作为对远程低功耗外围设备的占位符,提供了服务发现和状态跟踪等功能。

创建中心角色的控制器对象后,第一步是通过connectToDevice()建立连接。一旦连接建立,控制器的state() 变为QLowEnergyController::ConnectedState,并发出connected() 信号。值得提及的是,某些平台(如基于BlueZ的Linux)无法保持在同远程设备上两个QLowEnergyController的连接实例。在 这种情况下,第二次调用connectToDevice()可能会失败。这种限制可能在未来的某个阶段消失。《disconnectFromDevice ()》函数用于断开现有的连接。

建立连接后的第二步是发现远程外围设备提供的服务。该过程通过discoverServices() 启动,并完成discoveryFinished()信号已发出。可以通过services()枚举发现的服务。

最后一步是创建服务对象。名为createServiceObject () 的函数为每个服务对象充当工厂,并将服务UUID作为参数。调用上下文应拥有返回的QLowEnergyService 实例的所有权。

任何从该控制器的连接中创建的 QLowEnergyServiceQLowEnergyCharacteristicQLowEnergyDescriptor 实例在控制器与远程低功耗蓝牙设备断开连接后都将变得无效。

通过 createPeripheral() 工厂方法创建的外设角色控制器。这样的对象本身就是一个外围设备,它支持广告服务和允许客户端接收有关特性值更改的通知。

在外设角色中创建控制器对象后,第一步是通过调用 addService() 来填充客户端设备提供的 GATT 服务集。之后,可以调用 startAdvertising() 来让设备广播一些数据,并且根据广告的类型,也监听来自 GATT 客户端的传入连接。

另请参阅 QLowEnergyServiceQLowEnergyCharacteristicQLowEnergyDescriptorQLowEnergyAdvertisingParametersQLowEnergyAdvertisingData

成员类型文档

枚举 QLowEnergyController::ControllerState

表示控制器对象的状态。

常量描述
QLowEnergyController::UnconnectedState0控制器未连接到远程设备。
QLowEnergyController::ConnectingState1控制器正在尝试连接到远程设备。
QLowEnergyController::ConnectedState2控制器已连接到远程设备。
QLowEnergyController::DiscoveringState3控制器正在检索远程设备提供的服务列表。
QLowEnergyController::DiscoveredState4控制器已发现远程设备提供的所有服务。
QLowEnergyController::ClosingState5控制器即将从远程设备断开连接。
QLowEnergyController::AdvertisingState (自 Qt 5.7 起使用)6控制器正在广播数据。

枚举 QLowEnergyController::Error

表示控制器存在过程中发现的所有可能错误条件。

常量描述
QLowEnergyController::NoError0未发生任何错误。
QLowEnergyController::UnknownError1发生了未知错误。
QLowEnergyController::UnknownRemoteDeviceError2在网络中找不到传递给该类构造函数的地址的远程蓝牙低功耗设备。
QLowEnergyController::NetworkError3读取或写入远程设备的尝试失败。
QLowEnergyController::InvalidBluetoothAdapterError4找不到传递给该类构造函数的地址的本地蓝牙设备,或者没有本地蓝牙设备。
QLowEnergyController::ConnectionError (自 Qt 5.5 起使用)5连接到远程设备的尝试失败。
QLowEnergyController::AdvertisingError (自 Qt 5.7 起使用)6开始广播的尝试失败。
QLowEnergyController::RemoteHostClosedError (自 Qt 5.10 起使用)7远程设备关闭了连接。
QLowEnergyController::AuthorizationError (自 Qt 5.14 起使用)8本地蓝牙设备由于授权不足而关闭了连接。
QLowEnergyController::MissingPermissionsError (自 Qt 6.4 起使用)9操作系统请求权限,但是未获得用户的允许。
QLowEnergyController::RssiReadError (自 Qt 6.5 起使用)10读取远程设备 RSSI(接收信号强度指示器)的尝试以错误结束。

枚举 QLowEnergyController::RemoteAddressType

表示远程设备使用的蓝牙地址类型。

常量描述
QLowEnergyController::PublicAddress0远程设备使用公共蓝牙地址。
QLowEnergyController::RandomAddress1随机地址是低功耗蓝牙(BLE)的一项安全特性。使用这些地址的外设可能会频繁更改其蓝牙地址。当尝试连接到外设时需要此信息。

枚举 QLowEnergyController::Role

指代控制器对象的职能。

常量描述
QLowEnergyController::CentralRole0控制器以客户端身份与处于外设角色的远程设备交互。控制器可以发起连接、发现服务和读取/写入特性。
QLowEnergyController::PeripheralRole1控制器可以用来广告服务和处理传入的连接和客户端请求,作为GATT服务器。连接到控制器的远程设备处于中心角色。

注意:在Windows上不支持外设角色。此外,在Linux上,服务器端处理“签名写入”ATT命令需要BlueZ 5和内核版本3.7或更高。

另请参阅QLowEnergyController::createCentral()和QLowEnergyController::createPeripheral

成员函数文档

[virtual noexcept] QLowEnergyController::~QLowEnergyController()

销毁一个 QLowEnergyController 实例。

QLowEnergyService *QLowEnergyController::addService(const QLowEnergyServiceData &service, QObject *parent = nullptr)

service 构建并返回一个具有 parentQLowEnergyService 对象。控制器必须在 PeripheralRoleUnconnectedState。指定的 service 对象必须是有效的。

注意:一旦外设实例从远程中心设备断开连接或手动调用 disconnectFromDevice(),通过此函数先前添加的每个服务定义都将从外设中移除。因此,在重新广告此外设控制器实例之前必须再次调用此函数。所述行为是针对特定连接的,因此不依赖于是否调用了 stopAdvertising

另请参阅:stopAdvertisingdisconnectFromDeviceQLowEnergyServiceData::addIncludedService

void QLowEnergyController::connectToDevice()

连接到远程蓝牙低功耗设备。

如果控制器的 state() 不等于 UnconnectedState,则此函数不会执行任何操作。一旦成功建立连接,将发出 connected() 信号。

在Linux/BlueZ系统上,无法使用此类的两个实例连接到同一远程设备。第二次调用此函数可能失败并返回错误。此限制可能在未来的版本中取消。

另请参阅:disconnectFromDevice

[signal] void QLowEnergyController::connected()

当控制器成功连接到远程低功耗设备(如果控制器处于CentralRole状态)或与控制器连接的远程低功耗设备连接时(如果控制器处于PeripheralRole状态),会发出此信号。在iOS、macOS和Android上,如果控制器处于PeripheralRole状态,则此信号不可靠。在iOS和macOS上,控制器只能猜测连接到我们外围设备的中枢已经尝试写入/读取特征/描述符。在Android上,控制器监视所有连接的GATT设备。在Linux BlueZ DBus外围后端,远程设备在第一次读取/写入特征或描述符时被认为已连接。

[信号] void QLowEnergyController::connectionUpdated(const QLowEnergyConnectionParameters &newParameters)

此信号在连接参数更改时发出。这可能是因为调用requestConnectionUpdate()或其他原因,例如,因为连接的另一端请求了新的参数。可以从newParameters获取新值。

另请参阅 requestConnectionUpdate

[静态] QLowEnergyController *QLowEnergyController::createCentral(const QBluetoothDeviceInfo &remoteDevice, QObject *parent = nullptr)

返回一个新对象,该对象具有CentralRole并且具有父对象parentremoteDevice指的是稍后将要建立连接的设备。

控制器使用本地默认蓝牙适配器进行连接管理。

另请参阅 QLowEnergyController::CentralRole

[静态] QLowEnergyController *QLowEnergyController::createCentral(const QBluetoothDeviceInfo &remoteDevice, const QBluetoothAddress &localDevice, QObject *parent = nullptr)

返回具有parent的新实例。

remoteDevice必须包含要将对象稍后试图连接的远程蓝牙低功耗设备的地址。

通过localDevice建立连接。如果localDevice无效,则自动选择本地默认设备。如果localDevice指定了不是本地蓝牙适配器的本地设备,一旦调用connectToDevice(),error()将被设置为InvalidBluetoothAdapterError

请注意,指定用于连接的本地设备仅在使用BlueZ时才可行。其他平台不支持此功能。

[静态,自6.2以来] QLowEnergyController *QLowEnergyController::createPeripheral(const QBluetoothAddress &localDevice, QObject *parent = nullptr)

返回一个新的对象,该对象属于 PeripheralRole,并具有父对象 parent 和使用 localDevice。通常,后续步骤是添加一些服务,最后在返回的对象上调用 startAdvertising()。

外围设备在 localDevice 上创建。如果 localDevice 无效,将自动选择本地默认设备。如果 localDevice 指定了不是本地蓝牙适配器的本地设备,则错误 () 将设置为 InvalidBluetoothAdapterError

在 Linux 上才支持选择 localDevice。在其他平台,该参数将被忽略。

此功能是在 Qt 6.2 中引入的。

另请参阅 QLowEnergyController::PeripheralRole

[static] QLowEnergyController *QLowEnergyController::createPeripheral(QObject *parent = nullptr)

返回一个新的对象,该对象属于 PeripheralRole 并具有父对象 parent。通常,后续步骤是添加一些服务,最后在返回的对象上调用 startAdvertising()。

控制器使用本地默认蓝牙适配器进行连接管理。

另请参阅 QLowEnergyController::PeripheralRole

QLowEnergyService *QLowEnergyController::createServiceObject(const QBluetoothUuid &serviceUuid, QObject *parent = nullptr)

创建代表 serviceUuid 的服务的实例。必须通过 services() 获取 serviceUuid 参数。

调用者拥有返回的指针,并且可以传递一个 parent 参数作为默认所有者。

如果没有在远程设备上找到具有 serviceUuid 的服务或控制器已断开连接,则此函数返回空指针。

此函数还可以返回辅助服务的实例。服务之间的关系可以通过 QLowEnergyService::includedServices() 表达。

如果多次使用相同的服务 UUID 调用此函数,则返回的 QLowEnergyService 实例将共享其内部数据。因此,如果其中一个实例启动了服务详细信息的发现,其他实例也会自动进入发现状态。

另请参阅 services

void QLowEnergyController::disconnectFromDevice()

断开与远程设备的连接。

由当前连接产生的任何 QLowEnergyServiceQLowEnergyCharacteristicQLowEnergyDescriptor 实例都将自动无效。一旦这些对象变得无效,即使此控制器对象重新连接,它们也保持无效。

如果控制器处于 UnconnectedState,则此函数不执行任何操作。

如果控制器处于外围角色,它将停止广播并移除之前通过addService()添加的所有服务。为了重复使用QLowEnergyController实例,应用程序必须重新添加服务并通过调用startAdvertising()重新启动广播模式。

也请参见connectToDevice

[信号] void QLowEnergyController::disconnected()

此信号在控制器从远程低功耗设备或反之断开连接时发出。在iOS和macOS上,如果控制器处于PeripheralRole,则该信号不可靠。在Android上,最后一个已连接的设备断开连接时发出信号。在BlueZ DBus后端,当最后一个访问属性的客户端断开连接时,认为控制器已断开连接。

void QLowEnergyController::discoverServices()

开始服务发现过程。

通过serviceDiscovered()信号指示发现进度。当过程完成时发出discoveryFinished()信号。

如果控制器实例未连接或控制器已执行过服务发现,则此函数不执行任何操作。

注意:某些平台在内部缓存的设备过去发现的服务列表。如果远程设备更改了其服务列表或其包含树,这可能会导致问题。如果此行为是问题,最好的解决办法是暂时关闭蓝牙。这会导致缓存的 个人信息还原数据。目前Android表现出了这样的缓存行为。

[信号] void QLowEnergyController::discoveryFinished()

此信号在运行的服务发现完成后发出。如果发现过程因错误而完成,则不会发出此信号。

此信号只能在控制器处于CentralRole时发出。

也请参见discoverServices()和error

QLowEnergyController::Error QLowEnergyController::error() const

返回最后发生的错误或NoError

[信号,自6.2以来] void QLowEnergyController::errorOccurred(QLowEnergyController::Error newError)

当发生错误时发出此信号。参数newError描述了发生的错误。

此功能是在 Qt 6.2 中引入的。

也请参见error()和errorString

QString QLowEnergyController::errorString() const

返回最后发生的错误的文本表示形式。字符串已被翻译。

QBluetoothAddress QLowEnergyController::localAddress() const

返回使用的本地蓝牙适配器的地址。

如果请求使用默认适配器创建了此类实例,但创建实例时没有默认适配器,返回的QBluetoothAddress将为null。

另请参阅 QBluetoothAddress::isNull().

[since 6.2] int QLowEnergyController::mtu() const

返回MTU大小。

在连接设置期间,会协商ATT MTU大小。此方法提供了协商的结果。在某些情况下,可以使用它来优化数据包大小。单个数据包中可传输的数据量最大为mtu-3字节。需要3个字节用于ATT协议头部。

在设置连接和MTU协商之前,将返回默认值23

并非所有平台都公开MTU值。在这些平台(例如Linux)上,该函数始终返回-1

如果控制器处于PeripheralRole,则可能有多个中央设备连接到它。在这些情况下,此函数返回最后一个协商的连接的MTU。

此功能是在 Qt 6.2 中引入的。

[signal] void QLowEnergyController::mtuChanged(int mtu)

此信号会在MTU成功改变后发出。mtu表示新值。

注意: 如果控制器处于PeripheralRole,则每个客户端/中央设备的MTU值都是单独协商的。因此,对于一台或多台设备,此信号可能会连续发出几次。

另请参阅 mtu

[since 6.5] void QLowEnergyController::readRssi()

readRssi()读取已连接远程设备的RSSI(接收信号强度指示器)。如果读取成功,则通过rssiRead()信号报告RSSI。

注意: 在调用readRssi()之前,此控制器必须连接到一个外围设备。此控制器必须使用createCentral()创建。

注意: 如果您使用的蓝牙后端不支持读取RSSI,则会通过errorOccurred()信号发出错误代码QLowEnergyController::RssiReadError。目前支持读取RSSI的平台包括Android、iOS和macOS。

此函数是在Qt 6.5中引入的。

另请参阅 rssiReadconnectToDevicestatecreateCentral,和errorOccurred

QBluetoothAddress QLowEnergyController::remoteAddress() const

返回远程蓝牙低功耗设备的地址。

对于处于CentralRole的控制器,此值将始终是在创建控制器对象时传入的值。对于处于PeripheralRole的控制器,此值是当前连接的客户端设备地址之一。如果控制器目前不在ConnectedState,则此地址无效。

QLowEnergyController::RemoteAddressType QLowEnergyController::remoteAddressType() const

返回remoteAddress的类型。默认情况下,该值初始化为PublicAddress

另请参阅setRemoteAddressType

QBluetoothUuid QLowEnergyController::remoteDeviceUuid() const

返回远程低功耗蓝牙设备的唯一标识符。

在 macOS/iOS/tvOS 上,CoreBluetooth 不公开/接受 LE 设备的硬件地址;相反,开发者应使用 CoreBluetooth 生成的唯一 128 位 UUID,这些 UUID 将对同一中心 <-> 外围对保持不变。我们在连接到远程设备时使用它们。对于处于CentralRole的控制器,此值将始终是创建控制器对象时传入的值。对于处于PeripheralRole的控制器,此值无效。

QString QLowEnergyController::remoteName() const

若控制器处于CentralRole,则返回远程低功耗蓝牙设备的名称。否则,结果未指定。

void QLowEnergyController::requestConnectionUpdate(const QLowEnergyConnectionParameters &parameters)

请求控制器根据parameters更新连接。如果请求成功,则connectionUpdated() 信号将被发出,并带实际新参数。有关连接参数的更多信息,请参阅QLowEnergyConnectionParameters类。

Android 仅间接允许调整此参数集。连接参数分为三个类别(高、低 & 平衡优先级)。每个类别都意味着一组预配置的值,用于QLowEnergyConnectionParameters::minimumIntervalQLowEnergyConnectionParameters::maximumIntervalQLowEnergyConnectionParameters::latency。虽然连接请求是一个异步操作,但 Android 不提供表示请求结果的回调。这是一个已知的 Android 错误。由于此错误,Android 不发出connectionUpdated() 信号。

注意:目前,此功能仅在 Linux 内核后端和 Android 上实现。

另请参阅connectionUpdated

QLowEnergyController::Role QLowEnergyController::role() const

返回此控制器对象的角色。

角色在构造使用createCentral()或createPeripheral()创建的QLowEnergyController实例时确定。

[信号,自6.5以来] void QLowEnergyController::rssiRead(qint16 rssi)

此信号在成功读取连接的远程设备的 RSSI(接收信号强度指示器)之后发出。rssi 参数代表新的值。

此函数是在Qt 6.5中引入的。

另请参阅readRssi

[信号] void QLowEnergyController::serviceDiscovered(const QBluetoothUuid &newService)

每当找到新的服务时,都会发出此信号。参数newService包含了所查找到的服务的UUID。

只有当控制器处于中心角色时,该信号才能被发出。

另请参阅discoverServices() 和 discoveryFinished

QList<QBluetoothUuid> QLowEnergyController::services() const

返回远程设备提供的服务列表,如果控制器处于中心角色。否则,结果未定义。

列表包含所有主服务及其相关服务。

另请参阅createServiceObject

void QLowEnergyController::setRemoteAddressType(QLowEnergyController::RemoteAddressType type)

设置远程地址类型。连接到远程蓝牙低功耗设备需要此类型。

此属性仅在Linux/BlueZ系统和较老的Linux内核(v3.3或更低)上或者如果可执行文件未设置CAP_NET_ADMIN时需要设置。默认值为RandomAddress

注意:所有其他平台都会透明地处理此标志,因此应用程序可以完全忽略它。在Linux上,尽管某些用例确实需要此信息,但BlueZ不会直接暴露地址类型标志。检测此标志的唯一方法是通过Linux内核的蓝牙管理API(需要内核版本3.4+)。此API需要CAP_NET_ADMIN能力。如果本地的QtBluetooth进程设置了此能力,QtBluetooth将使用API。这假设在调用QLowEnergyController::connectToDevice之前使用了QBluetoothDeviceDiscoveryAgent

另请参阅remoteAddressType

void QLowEnergyController::startAdvertising(const QLowEnergyAdvertisingParameters &parameters, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData = QLowEnergyAdvertisingData())

使用参数parameters设置的数据在advertisingDatascanResponseData中开始广告,控制器必须处于外围角色。如果parameters指示广告应该是可连接的,则此函数也会开始监听传入的客户端连接。

提供scanResponseData不是必须的,因为对于某些parameters配置来说它不适用。 advertisingDatascanResponseData限制为最多31字节的用户数据。例如,如果在advertisingData中添加了多个128bit uuid,则广告包可能不会包含所有uuid。现有的限制可能已导致uuid的截断。在这种情况下,可以使用scanResponseData提供更多信息。

在BlueZ DBus后端,BlueZ决定是否以及使用哪些数据作为扫描响应。因此,建议将所有广告数据设置在主形容词参数中。如果同时设置了广告和扫描响应数据,则扫描响应数据具有优先级。

如果此对象当前不在形容词状态未连接状态,则不会发生任何操作。

另请参阅形容词()。

QLowEnergyController::ControllerState形容词state() const

返回控制器的当前状态。

另请参阅形容词()。

[信号] void形容词stateChanged(形容词QLowEnergyController::ControllerState形容词state)

当控制器的状态改变时,会发出此信号。也可以通过形容词()获取新的形容词state

另请参阅形容词()。

void形容词stopAdvertising()

如果此对象当前处于广告状态,则停止广告。

控制器必须处于形容词状态外围设备状态才能执行此功能。它不会使通过形容词()先前添加的服务失效。

另请参阅形容词()。

© 2024 Qt公司。本文档中的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会出版并由其公布的形容词GNU自由文档许可(Version 1.3)的条款许可的。Qt和相应的徽标是芬兰和/或其他国家的形容词 компания Ltd.的商标。所有其他商标均为各自所有者的财产。