警告

本节包含自动从C++翻译成Python的代码片段,可能包含错误。

Qt蓝牙概述#

Qt蓝牙API使与支持蓝牙和蓝牙低能耗的设备进行连接。

使用Qt蓝牙API的典型用例包括

  • 检索本地蓝牙设备的信息。

  • 扫描范围内的蓝牙设备,并获取它们的信息。

  • 使用OBEX对象推送配置文件(OPP)将文件推送到远程设备

  • 通过RFCOMM通道使用串行端口配置文件(SPP)连接到远程设备。

  • 创建一个允许使用SPP进行入站连接的RFCOMM服务器

  • 获取蓝牙低能耗设备规范。

  • 连接到蓝牙低能耗设备。

  • 从蓝牙低能耗设备接收广告。

请注意,对象推送配置文件不支持在Android和Windows上使用。

注意

在Windows上,Qt无法配置RFCOMM功能的一些部分。服务的ServiceClassIdsProtocolDescriptorList字段会被自动填充。因此,使用这些字段的自定义值注册服务可能在Windows上不会得到预期的结果。

注意

接收信号强度指示器(RSSI)以及蓝牙LE设备广播的制造商特定数据不支持Win32后端。此外,只能通过Windows设置查找已预先配对的设备。

以下各节描述了如何使用Qt蓝牙C++ API类来实现上述用例。

获取本地设备信息#

Qt蓝牙API有三个主要目的。第一个目的是获取本地和远程设备信息。检索设备信息的第一步是检查设备上是否有蓝牙,并读取本地设备的地址和名称。QBluetoothLocalDevice是提供所有这些信息的类。此外,您还可以使用它来开关蓝牙,设置设备的可见性以及确定当前的连接。

localDevice = QBluetoothLocalDevice()
localDeviceName = QString()
# Check if Bluetooth is available on this device
if localDevice.isValid():
    # Turn Bluetooth on
    localDevice.powerOn()
    # Read local device name
    localDeviceName = localDevice.name()
    # Make it visible to others
    localDevice.setHostMode(QBluetoothLocalDevice.HostDiscoverable)
    # Get connected devices
remotes = QList()
    remotes = localDevice.connectedDevices()

扫描蓝牙设备#

类似于QBluetoothLocalDevice,该API提供了QBluetoothDeviceInfo,它可以提供远程设备类似的信息。虽然您可以自己创建QBluetoothDeviceInfo对象并填充数据,但更简单的方法是使用QBluetoothDeviceDiscoveryAgent自动搜索连接范围内的可见蓝牙设备。

def startDeviceDiscovery(self):

    # Create a discovery agent and connect to its signals
    discoveryAgent = QBluetoothDeviceDiscoveryAgent(self)
    connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
            self, SLOT(deviceDiscovered(QBluetoothDeviceInfo)))
    # Start a discovery
    discoveryAgent.start()
    #...

# In your local slot, read information about the found devices
def deviceDiscovered(self, device):

    print("Found device():", device.name(), '(', device.address().toString(), ')')

在设备之间交换数据

在两个启用蓝牙的设备之间进行通信的一种更灵活的方法是创建一个虚拟串行端口连接,并且可以自由地在该连接上交换数据。这可以通过串行端口配置文件(SPP)完成。串行端口配置文件在蓝牙传输协议RFCOMM上模拟串行连接。

要能够接收传入的SPP连接,您需要使用QBluetoothServer来监听传入的连接。

rfcommServer = QBluetoothServer(QBluetoothServiceInfo.RfcommProtocol, self)
rfcommServer.newConnection.connect(
        self, QOverload<>.of(ChatServer.clientConnected))
result = rfcommServer.listen(localAdapter)
if not result:
    qWarning() << "Cannot bind chat server to" << localAdapter.toString()
    return

通过使用QBluetoothSocket从另一台设备连接充当客户端的角色。

def startClient(self, remoteService):

    if socket:
        return
    # Connect to service
    socket = QBluetoothSocket(QBluetoothServiceInfo.RfcommProtocol)
    print("Create socket")
    socket.connectToService(remoteService)
    print("ConnectToService done")
    socket.readyRead.connect(self.readSocket)
    socket.connected.connect(this, QOverload<>::of(&ChatClient::connected))
    socket.disconnected.connect(self.disconnected)
    socket.errorOccurred.connect(self.onSocketErrorOccurred)

使用这种连接可以在两个方向上交换任何形式的数据。它非常适合游戏或同步两个设备上同一应用程序实例之间的状态。有关如何配置服务器和客户端的更详细描述,请参阅QBluetoothServerQBluetoothSocket类中的详细描述章节。开始使用SPP的好例子是蓝牙聊天示例。

蓝牙低功耗

蓝牙低功耗,也称为蓝牙智能,是一种使低功耗设备能够相互通信的新技术。有关此技术及其相关Qt API的更多详细信息,请参阅蓝牙低功耗概述