一、描述
QBluetoothSocket 类继承自 QIODevice,用于与运行蓝牙服务器的蓝牙设备建立连接。
QBluetoothSocket 支持两种连接类型,L2CAP 和 RFCOMM:
- L2CAP 是一个低级的面向数据报的蓝牙套接字。Android 不支持 L2CAP。
- RFCOMM 是一个可靠的、面向流的蓝牙套接字。
要创建到蓝牙服务的连接:
- 创建适当类型的套接字
- 调用 connectToService() 传递蓝牙地址和端口号。
- QBluetoothSocket 将在连接建立时发出 connected() 信号。
QBluetoothSocket 不支持同步读写操作。I/O 操作应该使用 readyRead()、read() 和 write() 来执行。
在 iOS 上,不能使用此类,因为平台没有公开可能允许访问 QBluetoothSocket 相关功能的 API。
二、类型成员
1、enum class QBluetoothSocket::SocketError:此枚举描述蓝牙套接字错误类型。
- UnknownSocketError:发生未知错误。
- NoSocketError:没有错误。
- HostNotFoundError:找不到远程主机。
- ServiceNotFoundError:在远程主机上找不到服务 UUID。
- NetworkError:尝试从套接字读取或写入返回错误
- UnsupportedProtocolError:该平台不支持该协议。
- OperationError:在套接字处于不允许的状态时尝试操作。
- RemoteHostClosedError:远程主机关闭了连接。
2、enum class QBluetoothSocket::SocketState:此枚举描述了蓝牙套接字的状态。
- UnconnectedState:未连接。
- ServiceLookupState:正在查询连接参数。
- ConnectingState:正在尝试连接到设备。
- ConnectedState:已经连接到设备。
- BoundState:绑定到本地地址和端口。
- ClosingState:已连接,一旦所有待处理的数据写入套接字就会关闭。
- ListeningState:正在监听传入的连接。
三、成员函数
1、【信号】void connected()
建立连接时会发出此信号。
2、【信号】void disconnected()
当断开连接时发出此信号。
3、【信号】void errorOccurred(QBluetoothSocket::SocketError error)
发生错误时发出此信号。
4、【信号】void stateChanged(QBluetoothSocket::SocketState state)
当状态更改时发出此信号。
5、void abort()
中止当前连接并重置套接字。与 disconnectFromService() 不同,此函数立即关闭套接字,丢弃写入缓冲区中的任何未决数据。
在 Android 上,中止套接字需要与 Android 线程进行异步交互。因此,相关的 disconnected() 和 stateChanged() 信号被延迟到线程完成关闭才发出。
6、void connectToService(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode = ReadWrite)
尝试连接到 service 描述的服务。套接字在给定的 openMode 中打开。
void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODeviceBase::OpenMode openMode = ReadWrite)
尝试使用地址 address 与设备上由 uuid 标识的服务建立连接。套接字在给定的 openMode 中打开。
void connectToService(const QBluetoothAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
尝试与端口 port 上的地址 address 建立连接。套接字在给定的 openMode 中打开。
7、void disconnectFromService()
尝试关闭套接字。
如果有等待写入的未决数据,将进入 ClosingState 并等待直到所有数据都已写入。最终,它将进入 UnconnectedState 并发出 disconnected() 信号。
8、void doDeviceDiscovery(const QBluetoothServiceInfo &service, QIODeviceBase::OpenMode openMode)
为服务 service 启动设备搜索并使用 openMode 打开套接字。如果套接字是使用服务 uuid 设备地址创建的,则使用服务发现来查找要连接的端口号。
9、QBluetoothSocket::SocketError error()
返回最后一个错误。
10、QString errorString()
返回错误的描述文本字符串。
11、QBluetoothAddress localAddress()
本地设备的地址。
12、QString localName()
本地设备的名称。
13、quint16 localPort()
如果可用,则返回本地套接字的端口号,否则返回 0。
在 Android 和 macOS 上,不支持此功能并返回 0。
14、QBluetoothAddress peerAddress()
对面和本地设备连接的设备的地址。
15、QString peerName()
对面和本地设备连接的设备的名称。
16、quint16 peerPort()
如果可用,返回对面和本地设备连接的设备的端口号,否则返回 0。在 Android 上,不支持此功能。
17、QBluetooth::SecurityFlags preferredSecurityFlags()
void setPreferredSecurityFlags(QBluetooth::SecurityFlags flags)
用于初始连接尝试的安全参数。
18、int socketDescriptor()
如果可用,则返回特定于平台的套接字描述符。如果描述符不可用或发生错误,则返回 -1。
19、QBluetoothServiceInfo::Protocol socketType()
套接字类型。套接字自动适应远程服务提供的协议。
Android 仅支持基于 RFCOMM 的套接字。
20、QBluetoothSocket::SocketState state()
套接字的当前状态。