QBluetoothServiceDiscoveryAgent Class
QBluetoothServiceDiscoveryAgent 类可用于查询蓝牙服务。更多内容...
| 头文件: | #include <QBluetoothServiceDiscoveryAgent> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Bluetooth) target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake: | QT += bluetooth |
| 继承自: | QObject |
公共类型
| enum | DiscoveryMode { MinimalDiscovery, FullDiscovery } |
| enum | Error { NoError, PoweredOffError, InputOutputError, InvalidBluetoothAdapterError, MissingPermissionsError, UnknownError } |
公共函数
| QBluetoothServiceDiscoveryAgent(QObject *parent = nullptr) | |
| QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr) | |
| virtual | ~QBluetoothServiceDiscoveryAgent() |
| QList<QBluetoothServiceInfo> | discoveredServices() const |
| QBluetoothServiceDiscoveryAgent::Error | error() const |
| QString | errorString() const |
| bool | isActive() const |
| QBluetoothAddress | remoteAddress() const |
| bool | setRemoteAddress(const QBluetoothAddress &address) |
| void | setUuidFilter(const QBluetoothUuid &uuid) |
| void | setUuidFilter(const QList<QBluetoothUuid> &uuids) |
| QList<QBluetoothUuid> | uuidFilter() const |
公共槽位
| void | clear() |
| void | start(QBluetoothServiceDiscoveryAgent::DiscoveryMode mode = MinimalDiscovery) |
| void | stop() |
信号
| void | canceled() |
(since 6.2) void | errorOccurred(QBluetoothServiceDiscoveryAgent::Error error) |
| void | finished() |
| void | serviceDiscovered(const QBluetoothServiceInfo &info) |
详细说明
发现过程依赖于蓝牙服务发现协议(SDP)。要查询所有可连接的蓝牙设备所提供的服务,需要执行以下步骤:
- 创建一个 QBluetoothServiceDiscoveryAgent 实例,
- 订阅serviceDiscovered()或finished()信号,
- 并调用start() 方法。
voidMyClass::startServiceDiscovery()
{
// 创建一个发现代理并订阅其信号
QBluetoothServiceDiscoveryAgent*discoveryAgent = newQBluetoothServiceDiscoveryAgent(this);
connect(discoveryAgent,SIGNAL(serviceDiscovered(QBluetoothServiceInfo)),
this,SLOT(serviceDiscovered(QBluetoothServiceInfo)));
// 启动发现
discoveryAgent->start();
//...
}
// 在本地槽中,读取已发现设备的相关信息
voidMyClass::serviceDiscovered(constQBluetoothServiceInfo&service)
{
qDebug() << "Found new service:" << service.serviceName()
<< '(' <<service.device().address().toString()<< ')';
}默认情况下,系统会执行最简服务发现。在此模式下,返回的QBluetoothServiceInfo 对象保证仅包含设备和服务的 UUID 信息。根据平台和设备的能力,可能还会提供其他服务信息。最简服务发现模式依赖于平台的缓存 SDP 数据。 因此,即使设备物理上可用,此发现过程也可能无法找到该设备。 在这种情况下,必须执行完整发现以强制更新平台缓存。不过对于大多数用例而言,最小发现就已足够,因为它速度更快,而且其他需要最新信息的类(如QBluetoothSocket::connectToService())会在必要时执行额外发现。如果需要完整的服务信息,请将FullDiscovery 作为discoveryMode参数传递给start()。
该类可能在内部使用QBluetoothDeviceDiscoveryAgent 来查找未知设备。
如果目标设备同时包含经典蓝牙和低功耗蓝牙设备,服务发现过程也可能检测到蓝牙低功耗服务。 此类设备必须通过 SDP 广播其低功耗服务。如果目标设备仅支持蓝牙低功耗服务,则很可能不会通过 SDP 广播这些服务。应使用QLowEnergyController 类对低功耗设备执行服务发现。
在 iOS 上,由于该平台未提供允许访问 QBluetoothServiceDiscoveryAgent 相关功能的 API,因此无法使用该类。
另请参阅 QBluetoothDeviceDiscoveryAgent 和QLowEnergyController 。
成员类型文档
enum QBluetoothServiceDiscoveryAgent::DiscoveryMode
此枚举描述了服务发现模式。
| 常量 | 值 | 描述 |
|---|---|---|
QBluetoothServiceDiscoveryAgent::MinimalDiscovery | 0 | 执行最小服务发现。返回的QBluetoothServiceInfo 对象可能不完整,且仅保证包含设备和服务的UUID信息。由于最小发现依赖于缓存的SDP数据,因此在执行FullDiscovery 之前,可能无法找到实际存在的设备。 |
QBluetoothServiceDiscoveryAgent::FullDiscovery | 1 | 执行完整的服务发现。 |
enum QBluetoothServiceDiscoveryAgent::Error
此枚举描述了服务发现过程中可能发生的错误。
| 常量 | 值 | 描述 |
|---|---|---|
QBluetoothServiceDiscoveryAgent::NoError | QBluetoothDeviceDiscoveryAgent::NoError | 未发生错误。 |
QBluetoothServiceDiscoveryAgent::PoweredOffError | QBluetoothDeviceDiscoveryAgent::PoweredOffError | 蓝牙适配器已关闭,请在执行发现操作前将其打开。 |
QBluetoothServiceDiscoveryAgent::InputOutputError | QBluetoothDeviceDiscoveryAgent::InputOutputError | 对设备进行写入或读取时发生错误。 |
QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError (since Qt 5.3) | QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError | 传入的本地适配器地址与任何本地蓝牙设备的物理适配器地址都不匹配。 |
QBluetoothServiceDiscoveryAgent::MissingPermissionsError (since Qt 6.4) | QBluetoothDeviceDiscoveryAgent::MissingPermissionsError | 操作系统请求了未被用户授予的权限。 |
QBluetoothServiceDiscoveryAgent::UnknownError | QBluetoothDeviceDiscoveryAgent::UnknownError | 发生了一个未知错误。 |
成员函数文档
[explicit] QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(QObject *parent = nullptr)
使用parent 创建一个新的QBluetoothServiceDiscoveryAgent。搜索通过本地默认的蓝牙适配器进行。
[explicit] QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr)
为deviceAdapter 构建一个新的QBluetoothServiceDiscoveryAgent,并使用parent 。
该对象使用deviceAdapter 进行服务搜索。如果deviceAdapter 采用默认构造,生成的QBluetoothServiceDiscoveryAgent对象将使用本地默认蓝牙适配器。
如果指定的deviceAdapter 不是本地适配器,则error() 将被设置为InvalidBluetoothAdapterError 。因此,建议在使用此构造函数后立即检查错误标志。
注意:在 WinRT平台上, 传入的适配器地址将被忽略。
注意:在 Android平台上, 传递任何deviceAdapter 地址都是没有意义的,因为 Android 6.0 及更高版本不再发布本地蓝牙地址。因此,传递的适配器地址永远无法与本地适配器地址匹配。因此,后续对start() 的调用将始终触发InvalidBluetoothAdapterError 。
另请参阅 error()。
[virtual noexcept] QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent()
的析构函数QBluetoothServiceDiscoveryAgent
[signal] void QBluetoothServiceDiscoveryAgent::canceled()
当通过调用 `stop()` 取消服务发现时,将触发此信号。
[slot] void QBluetoothServiceDiscoveryAgent::clear()
清除先前服务发现的结果,并重置uuidFilter()。在服务发现进行期间,此函数不会执行任何操作(参见isActive())。
另请参阅 discoveredServices()。
QList<QBluetoothServiceInfo> QBluetoothServiceDiscoveryAgent::discoveredServices() const
返回所有已发现服务的列表。
该服务列表会通过多次调用start()累积新发现的服务。除非调用clear(),否则该列表的大小不会减少。这意味着,如果在两次连续调用start()之间,远程蓝牙设备移出了覆盖范围,则该列表中可能会包含过时的条目。
注意: 在更改发现模式之前,应始终清空服务列表。
另请参阅 clear()。
QBluetoothServiceDiscoveryAgent::Error QBluetoothServiceDiscoveryAgent::error() const
返回上次发生的错误类型。如果服务发现是通过单个remoteAddress()方法进行的,则会返回在尝试发现该设备上的服务时发生的错误。如果未设置remoteAddress(),且设备是通过扫描发现的,则在单个设备上进行服务发现时发生的错误不会被保存,也不会触发任何信号。 在这种情况下,出现错误是相当正常的,因为某些设备可能未响应发现请求,或者已超出信号覆盖范围。此类错误会被抑制。如果未返回任何服务,则可以认为无法发现任何服务。
重启发现过程时,任何可能存在的先前错误都会被清除。
[signal, since 6.2] void QBluetoothServiceDiscoveryAgent::errorOccurred(QBluetoothServiceDiscoveryAgent::Error error)
当发生error 时,会发出此信号。error 参数描述了发生的错误。
该函数于 Qt 6.2 版本中引入。
QString QBluetoothServiceDiscoveryAgent::errorString() const
返回服务发现过程中发生的最后一个错误的通俗易懂的描述。
另请参阅 error() 和errorOccurred()。
[signal] void QBluetoothServiceDiscoveryAgent::finished()
当蓝牙服务发现完成时,会发出此信号。
与QBluetoothDeviceDiscoveryAgent::finished()信号不同,即使在服务发现过程中发生错误,该信号仍会触发。因此,建议检查errorOccurred()信号来评估服务发现是否成功。
bool QBluetoothServiceDiscoveryAgent::isActive() const
如果服务发现当前处于活动状态,则返回true ;否则返回false 。可以通过调用stop()来停止正在进行的发现。
QBluetoothAddress QBluetoothServiceDiscoveryAgent::remoteAddress() const
返回远程设备地址。如果未调用setRemoteAddress(),该函数将返回一个通过默认构造函数构造的QBluetoothAddress 对象。
另请参阅 setRemoteAddress()。
[signal] void QBluetoothServiceDiscoveryAgent::serviceDiscovered(const QBluetoothServiceInfo &info)
当发现由info 所描述的蓝牙服务时,将发出此信号。
注意: 如果目标设备通过 SDP 广播该服务,则 传入的 QBluetoothServiceInfo 参数 可能包含蓝牙低功耗服务。对于同时支持经典蓝牙(BaseRate)和低功耗服务的设备,此项是必需的。
另请参阅 QBluetoothDeviceInfo::coreConfigurations()。
bool QBluetoothServiceDiscoveryAgent::setRemoteAddress(const QBluetoothAddress &address)
将远程设备地址设置为address 。如果使用默认构造的address ,则将在所有可连接的蓝牙设备上进行服务发现。只有在没有正在进行的服务发现时,才能设置新的远程地址;否则,该函数将返回 false。
在某些平台上,服务发现可能会触发配对请求。因此,不建议对所有设备进行服务发现。可使用此函数将服务发现限制在特定设备上。
另请参阅 remoteAddress()。
void QBluetoothServiceDiscoveryAgent::setUuidFilter(const QBluetoothUuid &uuid)
这是一个重载的成员函数,仅为方便起见而提供。
将 UUID 过滤器设置为一个包含单个元素uuid 的列表。匹配操作适用于该服务的ServiceId 和ServiceClassIds 属性。
另请参阅 uuidFilter()。
void QBluetoothServiceDiscoveryAgent::setUuidFilter(const QList<QBluetoothUuid> &uuids)
将 UUID 过滤器设置为uuids 。仅会返回与uuids 中 UUID 匹配的服务。匹配操作适用于服务的ServiceId 和ServiceClassIds 属性。
空的 UUID 列表等同于仅包含QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup 的列表。
另请参阅 uuidFilter()。
[slot] void QBluetoothServiceDiscoveryAgent::start(QBluetoothServiceDiscoveryAgent::DiscoveryMode mode = MinimalDiscovery)
启动服务发现。mode 指定要执行的服务发现类型。
在某些平台上,设备发现可能会触发配对请求。
另请参阅 DiscoveryMode 。
[slot] void QBluetoothServiceDiscoveryAgent::stop()
停止服务发现进程。搜索停止后,将发出canceled()信号。
QList<QBluetoothUuid> QBluetoothServiceDiscoveryAgent::uuidFilter() const
返回 UUID 过滤器。
另请参阅 setUuidFilter()。
© 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.