QBluetoothSocket 类

QBluetoothSocket 类允许连接到运行蓝牙服务器的蓝牙设备。 更多...

头文件 #include <QBluetoothSocket>
qmakeQT += bluetooth
继承 QIODevice

公共类型

枚举类SocketError { UnknownSocketError, NoSocketError, HostNotFoundError, ServiceNotFoundError, NetworkError, …, MissingPermissionsError }
枚举类SocketState { UnconnectedState, ServiceLookupState, ConnectingState, ConnectedState, BoundState, …, ListeningState }

公共函数

QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent = nullptr)
QBluetoothSocket(QObject *parent = nullptr)
虚拟~QBluetoothSocket()
voidabort()
voidconnectToService(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode = ReadWrite)
voidconnectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODeviceBase::OpenMode openMode = ReadWrite)
voidconnectToService(const QBluetoothAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
voiddisconnectFromService()
QBluetoothSocket::SocketErrorerror() const
QStringerrorString() const
QBluetoothAddresslocalAddress() const
QStringlocalName() const
quint16localPort() const
QBluetoothAddresspeerAddress() const
QStringpeerName() const
quint16peerPort() const
QBluetooth::SecurityFlagspreferredSecurityFlags() const
voidsetPreferredSecurityFlags(QBluetooth::SecurityFlags flags)
boolsetSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = SocketState::ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite)
intsocketDescriptor() const
QBluetoothServiceInfo::ProtocolsocketType() const
QBluetoothSocket::SocketStatestate() const

重实现的公共函数

虚拟bytesAvailable() const override
虚拟bytesToWrite() const override
虚拟canReadLine() const override
虚拟close() override
虚拟isSequential() const override

信号

void连接()
void断开连接()
(自6.2开始) voiderrorOccurred(QBluetoothSocket::SocketError error)
voidstateChanged(QBluetoothSocket::SocketState state)

保护函数

voiddoDeviceDiscovery(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode)
voidsetSocketError(QBluetoothSocket::SocketError error_)
voidsetSocketState(QBluetoothSocket::SocketState state)

重写的保护函数

虚拟readData(char *data, qint64 maxSize) override
虚拟writeData(const char *data, qint64 maxSize) override

详细信息

QBluetoothSocket 支持两种套接字类型,L2CAPRFCOMM

L2CAP 是一种低级数据报式蓝牙套接字。Android 不支持套接字连接上的 L2CAP

RFCOMM 是一种可靠、面向流的套接字。RFCOMM 套接字模拟 RS-232 串行端口。

要创建到蓝牙服务的连接,创建相应类型的套接字并调用 connectToService(),传入蓝牙地址和端口号。当连接建立时,QBluetoothSocket 会发出 connected() 信号。

如果平台不支持 Protocol,则调用 connectToService() 将发出 UnsupportedProtocolError 错误。

注意:QBluetoothSocket 不支持同步读写操作。如 waitForReadyRead() 和 waitForBytesWritten() 这样的函数未实现。I/O 操作应使用 readyRead()、read() 和 write 进行。

在 iOS 上,不能使用此类,因为平台没有公开允许访问 QBluetoothSocket 相关功能的 API。

注意:在 macOS Monterey (12) 上,当正在执行模态对话框或在事件跟踪模式下(例如,通过长按窗口关闭按钮)时,套接字数据流会暂停。这可能在 macOS 的未来版本中发生变化。

成员类型文档

枚举类 QBluetoothSocket::SocketError

此枚举描述蓝牙套接字错误类型。

常量描述
QBluetoothSocket::SocketError::UnknownSocketError1发生了未知错误。
QBluetoothSocket::SocketError::NoSocketError0没有错误。用于测试。
QBluetoothSocket::SocketError::HostNotFoundError3找不到远程主机。
QBluetoothSocket::SocketError::ServiceNotFoundError4在远程主机上找不到服务 UUID。
QBluetoothSocket::SocketError::NetworkError5尝试从套接字读取或写入时返回了错误
QBluetoothSocket::SocketError::UnsupportedProtocolError6平台不支持此平台的 Protocol
QBluetoothSocket::SocketError::OperationError7尝试在套接字处于不允许其状态时进行操作。
QBluetoothSocket::SocketError::RemoteHostClosedError (自 Qt 5.10)2远程主机关闭了连接。
QBluetoothSocket::SocketError::MissingPermissionsError (自 Qt 6.4)8操作系统请求的权限没有被用户授予。

枚举类 QBluetoothSocket::SocketState

此枚举描述了蓝牙套接字的状态。

常量描述
QBluetoothSocket::SocketState::UnconnectedState0套接字未连接。
QBluetoothSocket::SocketState::ServiceLookupState1套接字正在查询连接参数。
QBluetoothSocket::SocketState::ConnectingState2套接字正在尝试连接到设备。
QBluetoothSocket::SocketState::ConnectedState3套接字已连接到设备。
QBluetoothSocket::SocketState::BoundState4套接字已绑定到本地地址和端口。
QBluetoothSocket::SocketState::ClosingState5套接字已连接,将在所有待处理数据写入套接字后关闭。
QBluetoothSocket::SocketState::ListeningState6套接字正在监听传入的连接。

成员函数文档

[显式] QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent = nullptr)

使用 socketType 类型构建 parent 的蓝牙套接字。

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

使用 parent 构建蓝牙套接字。

[虚,无异常] QBluetoothSocket::~QBluetoothSocket()

销毁蓝牙套接字。

void QBluetoothSocket::abort()

终止当前连接并重置套接字。与 disconnectFromService 不同,此函数立即关闭套接字,丢弃写缓冲区中的任何待处理数据。

注意:在 Android 上,终止套接字需要与 Android 线程的异步交互。因此,相关的 disconnected() 和 stateChanged() 信号将延迟,直到线程完成关闭。

另请参阅disconnectFromService() 和 close

[继承虚拟] qint64 QBluetoothSocket::bytesAvailable() const

重新实现:QIODevice::bytesAvailable() const.

返回等待读取的输入字节数。

另请参阅bytesToWrite() 和 read

[继承虚拟] qint64 QBluetoothSocket::bytesToWrite() const

重新实现:QIODevice::bytesToWrite() const.

返回等待写入的字节数。当控制权返回事件循环时,将写入字节。

[继承虚拟] bool QBluetoothSocket::canReadLine() const

重新实现:QIODevice::canReadLine() const.

如果可以从设备读取至少一行,则返回 true。

[继承虚拟] void QBluetoothSocket::close()

重新实现: QIODevice::close().

断开套接字与设备的连接。

注意:在Android上,关闭套接字需要与Android线程进行异步交互。因此,相关的 disconnected() 和 stateChanged() 信号将延迟到线程完成关闭操作。

void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode = ReadWrite)

尝试连接到由 service 描述的服务。

在给定的 openMode 中打开套接字。如果 service 指定了一个不同的 QBluetoothServiceInfo::socketProtocol,则忽略 socketType

套接字首先进入 ConnectingState 并尝试连接到提供 service 的设备。如果建立了连接,QBluetoothSocket 将进入 ConnectedState 并发出 connected()。

在任何时候,套接字都可以发出 errorOccurred() 以指示发生了错误。

请注意,大多数平台在连接到远程设备之前都需要配对。否则,连接过程可能会失败。

在Android上,只可能建立RFCOMM连接。此函数忽略任何套接字协议指示器,并假定RFCOMM。

另请参阅:state() 和 disconnectFromService().

void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODeviceBase::OpenMode openMode = ReadWrite)

尝试建立到具有地址 address 的设备上标识为 uuid 的服务的连接。

在给定的 openMode 中打开套接字。

对于BlueZ,套接字首先进入 ServiceLookupState 并查询 uuid 的连接参数。如果服务参数成功检索,套接字进入 ConnectingState 并尝试连接到 address。如果建立了连接,QBluetoothSocket 将进入 ConnectedState 并发出 connected()。

在Android上,服务连接可以直接使用远程服务的UUID建立。因此,平台不需要ServiceLookupState,并且始终将socketType() 设置为QBluetoothServiceInfo::RfcommProtocol

在任何时候,套接字都可以发出 errorOccurred() 以指示发生了错误。

请注意,大多数平台在连接到远程设备之前都需要配对。否则,连接过程可能会失败。

另请参阅:state() 和 disconnectFromService().

void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)

尝试在指定的 port 上与 address 建立连接。

在给定的 openMode 中打开套接字。

套接字首先进入连接状态,并尝试连接到地址。如果建立了连接,QBluetoothSocket将进入已连接状态并发出connected()。

在任何时候,套接字都可以发出 errorOccurred() 以指示发生了错误。

在Android和BlueZ(版本5.46或更高)中,无法使用端口建立对服务的连接。调用此函数将发出ServiceNotFoundError

请注意,大多数平台在连接到远程设备之前都需要配对。否则,连接过程可能会失败。

另请参阅:state() 和 disconnectFromService().

[信号] void QBluetoothSocket::connected()

在该连接建立时发出此信号。

另请参阅QBluetoothSocket::SocketState::ConnectedStatestateChanged

void QBluetoothSocket::disconnectFromService()

尝试关闭套接字。如果存在待写数据,则QBluetoothSocket将进入关闭状态并等待所有数据写入完毕。最终,它将进入未连接状态并发出disconnected()信号。

另请参阅connectToService

[信号] void QBluetoothSocket::disconnected()

在套接字断开连接时发出此信号。

另请参阅QBluetoothSocket::SocketState::UnconnectedStatestateChanged

[保护] void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode)

开始对服务进行设备发现,并使用openMode打开套接字。如果使用服务uuid设备地址创建套接字,请使用服务发现找到要连接的端口号。

QBluetoothSocket::SocketError QBluetoothSocket::error() const

返回最后错误。

[信号,自6.2以来] void QBluetoothSocket::errorOccurred(QBluetoothSocket::SocketError error)

当发生错误时发出此信号。

此函数自Qt 6.2以来引入。

另请参阅error

QString QBluetoothSocket::errorString() const

返回错误的可视文本字符串。

[重写虚拟] bool QBluetoothSocket::isSequential() const

重写:QIODevice::isSequential() const

QBluetoothAddress QBluetoothSocket::localAddress() const

返回本机设备的地址。

尽管一些平台可能有所不同,但通常必须连接套接字以确保返回有效的地址。特别是,当处理支持多个本地蓝牙适配器的平台时,这一点尤为重要。

QString QBluetoothSocket::localName() const

返回本地设备的名称。

尽管一些平台可能有所不同,但通常必须连接套接字以确保返回有效的名称。特别是,当处理支持多个本地蓝牙适配器的平台时,这一点尤为重要。

quint16 QBluetoothSocket::localPort() const

如果可用,返回本地套接字的端口号,否则返回 0。尽管一些平台可能有所不同,但通常必须连接套接字以确保返回有效的端口号。

在 Android 和 macOS 上,此功能不受支持,返回 0。

QBluetoothAddress QBluetoothSocket::peerAddress() const

返回对等设备的地址。

QString QBluetoothSocket::peerName() const

返回对等设备的名称。

quint16 QBluetoothSocket::peerPort() const

如果可用,则返回对等套接字的端口号,否则返回 0。在 Android 上,此功能不受支持。

QBluetooth::SecurityFlags QBluetoothSocket::preferredSecurityFlags() const

返回用于初始连接尝试的安全参数。

安全参数可能在连接建立过程中或之后由双方重新协商。如果发生此类更改,则此标志值中不会反映。

在 macOS 上,此标志始终设置为 QBluetooth::Security::Secure

另请参阅setPreferredSecurityFlags

[覆盖虚拟保护] qint64 QBluetoothSocket::readData(char *data, qint64 maxSize)

重新实现: QIODevice::readData(char *data, qint64 maxSize).

void QBluetoothSocket::setPreferredSecurityFlags(QBluetooth::SecurityFlags flags)

将连接尝试的首选安全参数设置为 flags。在调用 connectToService 时将此值合并。因此,要更改现有连接的此参数,需要重新连接。

在 Bluez 中,此属性默认设置为 QBluetooth::Security::Authorization

在 macOS 上,此值被忽略,因为平台不允许访问套接字的安全参数。默认情况下,平台更喜欢安全/加密连接,因此此函数始终返回 QBluetooth::Security::Secure

Android仅支持两个级别的安全性(安全和非安全)。如果此标志设置为QBluetooth::Security::NoSecurity,则套接字对象不会使用任何身份验证或加密。任何其他安全性标志组合都将触发安全的蓝牙连接。默认情况下,此标志设置为QBluetooth::Security::Secure

注意:安全的连接需要两个设备之间的配对。在某些平台上,配对会在连接建立时自动启动。在其他平台上,需要在尝试连接之前手动触发配对。

另请参阅:preferredSecurityFlags

bool QBluetoothSocket::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = SocketState::ConnectedState, QIODeviceBase::OpenMode openMode = ReadWrite)

设置套接字以使用具有类型 socketType、处于 socketState 状态和模式 openModesocketDescriptor

套接字描述符由 QBluetoothSocket 实例拥有,完成后可以进行关闭。

成功时返回 true

另请参阅:socketDescriptor

[protected] void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_)

设置上次发生错误的类型为 error_

[protected] void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state)

设置套接字状态为 state

int QBluetoothSocket::socketDescriptor() const

如果可用,返回平台特定的套接字描述符。如果描述符不可用或发生错误,则此函数返回 -1。

另请参阅:setSocketDescriptor

QBluetoothServiceInfo::Protocol QBluetoothSocket::socketType() const

返回套接字类型。套接字会自动调整到远程服务提供的协议。

Android仅支持基于 RFCOMM 的套接字。

QBluetoothSocket::SocketState QBluetoothSocket::state() const

返回套接字的当前状态。

[signal] void QBluetoothSocket::stateChanged(QBluetoothSocket::SocketState state)

当套接字状态更改为 state 时发出此信号。

另请参阅:connecteddisconnectedstateQBluetoothSocket::SocketState

[override virtual protected] qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize)

重新实现: QIODevice::writeData(const char *data, qint64 maxSize).

© 2024 Qt公司。本文档中的文档贡献归各自所有者所有。本文档按自由软件基金会发布的