QLowEnergyController 类
QLowEnergyController 类提供对蓝牙低能耗设备的访问。 更多信息...
头文件 | #include <QLowEnergyController> |
qmake | QT += 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) |
void | connectToDevice() |
QLowEnergyService * | createServiceObject(const QBluetoothUuid &serviceUuid, QObject *parent = nullptr) |
void | disconnectFromDevice() |
void | discoverServices() |
QLowEnergyController::Error | error() const |
QString | errorString() const |
QBluetoothAddress | localAddress() const |
(since 6.2) int | mtu() const |
(since 6.5) void | readRssi() |
QBluetoothAddress | remoteAddress() const |
QLowEnergyController::RemoteAddressType | remoteAddressType() const |
QBluetoothUuid | remoteDeviceUuid() const |
QString | remoteName() const |
void | requestConnectionUpdate(const QLowEnergyConnectionParameters ¶meters) |
QLowEnergyController::Role | role() const |
QList<QBluetoothUuid> | services() const |
void | setRemoteAddressType(QLowEnergyController::RemoteAddressType type) |
void | startAdvertising(const QLowEnergyAdvertisingParameters ¶meters, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData = QLowEnergyAdvertisingData()) |
QLowEnergyController::ControllerState | state() const |
void | stopAdvertising() |
信号
void | 连接() |
void | connectionUpdated(const QLowEnergyConnectionParameters &newParameters) |
void | 断开连接() |
void | 发现完成() |
(自6.2起) void | 错误发生(QLowEnergyController::Error newError) |
void | mtuChanged(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 实例的所有权。
任何从该控制器的连接中创建的 QLowEnergyService、QLowEnergyCharacteristic 或 QLowEnergyDescriptor 实例在控制器与远程低功耗蓝牙设备断开连接后都将变得无效。
通过 createPeripheral() 工厂方法创建的外设角色控制器。这样的对象本身就是一个外围设备,它支持广告服务和允许客户端接收有关特性值更改的通知。
在外设角色中创建控制器对象后,第一步是通过调用 addService() 来填充客户端设备提供的 GATT 服务集。之后,可以调用 startAdvertising() 来让设备广播一些数据,并且根据广告的类型,也监听来自 GATT 客户端的传入连接。
另请参阅 QLowEnergyService、QLowEnergyCharacteristic、QLowEnergyDescriptor、QLowEnergyAdvertisingParameters 和 QLowEnergyAdvertisingData。
成员类型文档
枚举 QLowEnergyController::ControllerState
表示控制器对象的状态。
常量 | 值 | 描述 |
---|---|---|
QLowEnergyController::UnconnectedState | 0 | 控制器未连接到远程设备。 |
QLowEnergyController::ConnectingState | 1 | 控制器正在尝试连接到远程设备。 |
QLowEnergyController::ConnectedState | 2 | 控制器已连接到远程设备。 |
QLowEnergyController::DiscoveringState | 3 | 控制器正在检索远程设备提供的服务列表。 |
QLowEnergyController::DiscoveredState | 4 | 控制器已发现远程设备提供的所有服务。 |
QLowEnergyController::ClosingState | 5 | 控制器即将从远程设备断开连接。 |
QLowEnergyController::AdvertisingState (自 Qt 5.7 起使用) | 6 | 控制器正在广播数据。 |
枚举 QLowEnergyController::Error
表示控制器存在过程中发现的所有可能错误条件。
常量 | 值 | 描述 |
---|---|---|
QLowEnergyController::NoError | 0 | 未发生任何错误。 |
QLowEnergyController::UnknownError | 1 | 发生了未知错误。 |
QLowEnergyController::UnknownRemoteDeviceError | 2 | 在网络中找不到传递给该类构造函数的地址的远程蓝牙低功耗设备。 |
QLowEnergyController::NetworkError | 3 | 读取或写入远程设备的尝试失败。 |
QLowEnergyController::InvalidBluetoothAdapterError | 4 | 找不到传递给该类构造函数的地址的本地蓝牙设备,或者没有本地蓝牙设备。 |
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::PublicAddress | 0 | 远程设备使用公共蓝牙地址。 |
QLowEnergyController::RandomAddress | 1 | 随机地址是低功耗蓝牙(BLE)的一项安全特性。使用这些地址的外设可能会频繁更改其蓝牙地址。当尝试连接到外设时需要此信息。 |
枚举 QLowEnergyController::Role
指代控制器对象的职能。
常量 | 值 | 描述 |
---|---|---|
QLowEnergyController::CentralRole | 0 | 控制器以客户端身份与处于外设角色的远程设备交互。控制器可以发起连接、发现服务和读取/写入特性。 |
QLowEnergyController::PeripheralRole | 1 | 控制器可以用来广告服务和处理传入的连接和客户端请求,作为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 构建并返回一个具有 parent 的 QLowEnergyService 对象。控制器必须在 PeripheralRole 和 UnconnectedState。指定的 service 对象必须是有效的。
注意:一旦外设实例从远程中心设备断开连接或手动调用 disconnectFromDevice(),通过此函数先前添加的每个服务定义都将从外设中移除。因此,在重新广告此外设控制器实例之前必须再次调用此函数。所述行为是针对特定连接的,因此不依赖于是否调用了 stopAdvertising
另请参阅:stopAdvertising,disconnectFromDevice和QLowEnergyServiceData::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并且具有父对象parent。remoteDevice指的是稍后将要建立连接的设备。
控制器使用本地默认蓝牙适配器进行连接管理。
另请参阅 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()
断开与远程设备的连接。
由当前连接产生的任何 QLowEnergyService、QLowEnergyCharacteristic 或 QLowEnergyDescriptor 实例都将自动无效。一旦这些对象变得无效,即使此控制器对象重新连接,它们也保持无效。
如果控制器处于 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中引入的。
另请参阅 rssiRead,connectToDevice,state,createCentral,和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 ¶meters)
请求控制器根据parameters更新连接。如果请求成功,则connectionUpdated() 信号将被发出,并带实际新参数。有关连接参数的更多信息,请参阅QLowEnergyConnectionParameters类。
Android 仅间接允许调整此参数集。连接参数分为三个类别(高、低 & 平衡优先级)。每个类别都意味着一组预配置的值,用于QLowEnergyConnectionParameters::minimumInterval、QLowEnergyConnectionParameters::maximumInterval和QLowEnergyConnectionParameters::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 ¶meters, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData = QLowEnergyAdvertisingData())
使用参数parameters设置的数据在advertisingData和scanResponseData中开始广告,控制器必须处于外围角色。如果parameters指示广告应该是可连接的,则此函数也会开始监听传入的客户端连接。
提供scanResponseData不是必须的,因为对于某些parameters
配置来说它不适用。 advertisingData和scanResponseData限制为最多31字节的用户数据。例如,如果在advertisingData中添加了多个128bit uuid,则广告包可能不会包含所有uuid。现有的限制可能已导致uuid的截断。在这种情况下,可以使用scanResponseData提供更多信息。
在BlueZ DBus后端,BlueZ决定是否以及使用哪些数据作为扫描响应。因此,建议将所有广告数据设置在主形容词
如果此对象当前不在形容词状态未连接状态,则不会发生任何操作。
QLowEnergyController::ControllerState形容词state () const
返回控制器的当前状态。
[信号] void形容词stateChanged (形容词QLowEnergyController::ControllerState形容词state )
当控制器的状态改变时,会发出此信号。也可以通过形容词()获取新的形容词
void形容词stopAdvertising ()
如果此对象当前处于广告状态,则停止广告。
© 2024 Qt公司。本文档中的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会出版并由其公布的形容词GNU自由文档许可(Version 1.3)的条款许可的。Qt和相应的徽标是芬兰和/或其他国家的形容词 компания Ltd.的商标。所有其他商标均为各自所有者的财产。