QBluetoothServiceDiscoveryAgent 类

QBluetoothServiceDiscoveryAgent 类可让您查询蓝牙服务。 更多信息...

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

公共类型

枚举DiscoveryMode { MinimalDiscovery, FullDiscovery }
枚举Error { NoError, PoweredOffError, InputOutputError, InvalidBluetoothAdapterError, MissingPermissionsError, UnknownError }

公共函数

QBluetoothServiceDiscoveryAgent(QObject *parent = nullptr)
QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &deviceAdapter, QObject *parent = nullptr)
虚拟~QBluetoothServiceDiscoveryAgent()
QList<QBluetoothServiceInfo>discoveredServices() const
QBluetoothServiceDiscoveryAgent::Errorerror() const
QStringerrorString() const
boolisActive() const
QBluetoothAddressremoteAddress() const
boolsetRemoteAddress(const QBluetoothAddress &address)
voidsetUuidFilter(const QList<QBluetoothUuid> &uuids)
voidsetUuidFilter(const QBluetoothUuid &uuid)
QList<QBluetoothUuid>uuidFilter() const

公共槽函数

voidclear()
voidstart(QBluetoothServiceDiscoveryAgent::DiscoveryMode mode = MinimalDiscovery)
voidstop()

信号

voidcanceled()
(自 6.2) voiderrorOccurred(QBluetoothServiceDiscoveryAgent::Error error)
voidfinished()
voidserviceDiscovered(const QBluetoothServiceInfo &info)

详细描述

发现过程依赖于蓝牙服务发现过程 (SDP)。查询所有可接触蓝牙设备提供的服务需要进行以下步骤

void MyClass::startServiceDiscovery()
{

    // Create a discovery agent and connect to its signals
    QBluetoothServiceDiscoveryAgent *discoveryAgent = new QBluetoothServiceDiscoveryAgent(this);
    connect(discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)),
            this, SLOT(serviceDiscovered(QBluetoothServiceInfo)));

    // Start a discovery
    discoveryAgent->start();

    //...
}

// In your local slot, read information about the found devices
void MyClass::serviceDiscovered(const QBluetoothServiceInfo &service)
{
    qDebug() << "Found new service:" << service.serviceName()
             << '(' << service.device().address().toString() << ')';
}

默认情况下执行最小化服务发现。在此模式下,返回的QBluetoothServiceInfo对象保证只包含设备和服务的UUID信息。根据平台和设备的能力,也可能有其他服务信息。最小化服务发现模式依赖于平台的缓存SDP数据。因此,发现可能找不到实际存在的设备。在这种情况下,必须执行完整发现来强制更新平台缓存。但是,对于大多数用例,最小发现是足够的,因为它更快,并且需要最新信息的其他类(如QBluetoothSocket::connectToService())在需要时也会进行额外的发现。如果需要完整的设备信息,请在start()中将FullDiscovery作为发现模式参数传递。

此类可能内部使用QBluetoothDeviceDiscoveryAgent来查找未知设备。

如果目标是经典和低功耗设备的组合,则设备发现可能也会找到低功耗服务。这些设备必须在SDP中广告它们的低功耗服务。如果目标设备只支持低功耗服务,则它们可能不会通过SDP广告。应该使用QLowEnergyController类来在低功耗设备上执行服务发现。

在iOS上,无法使用此类,因为平台未公开API可以提供访问QBluetoothServiceDiscoveryAgent相关功能的权限。

请参阅:QBluetoothDeviceDiscoveryAgentQLowEnergyController

成员类型文档

枚举 QBluetoothServiceDiscoveryAgent::DiscoveryMode

此枚举描述了服务发现模式。

常量描述
QBluetoothServiceDiscoveryAgent::MinimalDiscovery0执行最小化服务发现。返回的QBluetoothServiceInfo对象可能不完全,仅保证包含设备和服务UUID信息。由于最小发现依赖于缓存的SDP数据,它可能无法找到物理存在的设备,直到执行FullDiscovery
QBluetoothServiceDiscoveryAgent::FullDiscovery1执行完整服务发现。

枚举 QBluetoothServiceDiscoveryAgent::Error

此枚举描述在服务发现期间可能发生的错误。

常量描述
QBluetoothServiceDiscoveryAgent::NoErrorQBluetoothDeviceDiscoveryAgent::NoError未发生错误。
QBluetoothServiceDiscoveryAgent::PoweredOffErrorQBluetoothDeviceDiscoveryAgent::PoweredOffError蓝牙适配器已关闭电源,请在发现之前打开电源。
QBluetoothServiceDiscoveryAgent::InputOutputErrorQBluetoothDeviceDiscoveryAgent::InputOutputError从设备写入或读取操作导致出错。
QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError(自Qt 5.3起)QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError传递的本地适配器地址与任何本地蓝牙设备的物理适配器地址不匹配。
QBluetoothServiceDiscoveryAgent::MissingPermissionsError(自Qt 6.4起)QBluetoothDeviceDiscoveryAgent::MissingPermissionsError操作系统请求用户未授予的权限。
QBluetoothServiceDiscoveryAgent::UnknownErrorQBluetoothDeviceDiscoveryAgent::UnknownError发生未知错误。

成员函数文档

[显式] QBluetoothServiceDiscoveryAgent::QBluetoothServiceDiscoveryAgent(QObject *parent = nullptr)

使用parent构建一个新的QBluetoothServiceDiscoveryAgent。搜索通过本地默认蓝牙适配器执行。

[显式] 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().

[虚函数 noexcept] QBluetoothServiceDiscoveryAgent::~QBluetoothServiceDiscoveryAgent()

QBluetoothServiceDiscoveryAgent的析构函数

[信号] void QBluetoothServiceDiscoveryAgent::canceled()

当通过调用stop()取消服务发现时,该信号被触发。

[槽(函数)] void QBluetoothServiceDiscoveryAgent::clear()

清除之前服务搜索的结果,并重置uuidFilter。在正在进行的搜索期间(请参阅isActive),此函数不执行任何操作。

另见:discoveredServices().

QList<QBluetoothServiceInfo> QBluetoothServiceDiscoveryAgent::discoveredServices() const

返回所有发现服务的列表。

该服务列表累积来自start()的多次调用中新发现的服务的列表。除非调用clear(),否则列表大小不能减小。这意味着如果远程蓝牙设备在两次连续调用start()之间移出范围,则列表可能会包含过时的条目。

注意:在更改发现模式之前,应该始终清除服务列表。

另见:clear().

QBluetoothServiceDiscoveryAgent::Error QBluetoothServiceDiscoveryAgent::error() const

返回最后一次发生的错误类型。如果为单个远程地址执行服务发现,将返回在尝试在设备上发现服务时发生的错误。如果未设置remoteAddress(),并且通过扫描发现设备,则在单个设备上的服务发现期间的错误不会被保存,也不会发出信号。在这种情况下,由于某些设备可能不会响应该发现或不再在范围内,此类错误是正常的。这些错误会受到抑制。如果没有返回服务,则可以假设无法发现服务。

重新启动发现时,将清除任何可能的先前错误。

[signal, since 6.2] void QBluetoothServiceDiscoveryAgent::errorOccurred(QBluetoothServiceDiscoveryAgent::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描述的蓝牙服务时,发出此信号。

注意:传递的QBluetoothServiceInfo参数可能包含一个通过SDP广告的蓝牙低功耗服务。这是对同时支持经典蓝牙(基带)和低功耗服务的设备所需。

另请参阅 QBluetoothDeviceInfo::coreConfigurations

bool QBluetoothServiceDiscoveryAgent::setRemoteAddress(const QBluetoothAddress &address)

设置远程设备地址为 address。如果 address 是默认构造的,则会发现所有可接触的蓝牙设备上的服务。只有在没有正在进行的服务发现时,才能设置新的远程地址;否则此函数返回 false。

在某些平台上,服务发现可能会引发配对请求。因此,不建议对所有设备进行服务发现。此函数可以用于将服务发现限制为特定设备。

另请参阅 remoteAddress

void QBluetoothServiceDiscoveryAgent::setUuidFilter(const QList<QBluetoothUuid> &uuids)

设置 UUID 筛选器为 uuids。仅返回与 uuids 中的 UUID 匹配的服务。匹配适用于服务的 ServiceIdServiceClassIds 属性。

空的 UUID 列表与仅包含 QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup 的列表等价。

另请参阅 uuidFilter

void QBluetoothServiceDiscoveryAgent::setUuidFilter(const QBluetoothUuid &uuid)

这是一个提供便利的重载成员函数。

设置 UUID 筛选器为包含单个元素 uuid 的列表。匹配适用于服务的 ServiceIdServiceClassIds 属性。

另请参阅 uuidFilter

[slot] void QBluetoothServiceDiscoveryAgent::start(QBluetoothServiceDiscoveryAgent::DiscoveryMode mode = MinimalDiscovery)

启动服务发现。 mode 指定要执行的服务发现类型。

在某些平台中,设备发现可能会引发配对请求。

另请参阅 DiscoveryMode

[slot] void QBluetoothServiceDiscoveryAgent::stop()

停止服务发现过程。一旦搜索停止,将发出 canceled() 信号。

QList<QBluetoothUuid> QBluetoothServiceDiscoveryAgent::uuidFilter() const

返回 UUID 筛选器。

另请参阅 setUuidFilter

© 2024 The Qt Company Ltd. 本文档中包含的贡献的文档版权属于各自的所有者。此处提供的文档根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 和相关徽标是芬兰和/或全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。