蓝牙低功耗心率服务器#
蓝牙低功耗心率服务器是一个命令行应用程序,展示了如何使用 Qt 蓝牙 API 开发一个蓝牙 GATT 服务器。该应用程序涵盖了设置 GATT 服务、发布它以及通知客户端关于特性值变更的内容。
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
"""PySide6 port of the bluetooth/heartrate-server example from Qt v6.x"""
import sys
from enum import Enum
from PySide6.QtBluetooth import (QBluetoothUuid, QLowEnergyAdvertisingData,
QLowEnergyAdvertisingParameters,
QLowEnergyCharacteristic,
QLowEnergyCharacteristicData,
QLowEnergyController,
QLowEnergyDescriptorData,
QLowEnergyServiceData)
from PySide6.QtGui import QGuiApplication
from PySide6.QtCore import QByteArray, QTimer, QLoggingCategory
class ValueChange(Enum):
VALUE_UP = 1
VALUE_DOWN = 2
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
QLoggingCategory.setFilterRules("qt.bluetooth* = true")
#! [Advertising Data]
advertising_data = QLowEnergyAdvertisingData()
advertising_data.setDiscoverability(QLowEnergyAdvertisingData.DiscoverabilityGeneral)
advertising_data.setIncludePowerLevel(True)
advertising_data.setLocalName("HeartRateServer")
advertising_data.setServices([QBluetoothUuid.ServiceClassUuid.HeartRate])
#! [Advertising Data]
#! [Service Data]
char_data = QLowEnergyCharacteristicData()
char_data.setUuid(QBluetoothUuid.CharacteristicType.HeartRateMeasurement)
char_data.setValue(QByteArray(2, 0))
char_data.setProperties(QLowEnergyCharacteristic.Notify)
client_config = QLowEnergyDescriptorData(
QBluetoothUuid.DescriptorType.ClientCharacteristicConfiguration, QByteArray(2, 0))
char_data.addDescriptor(client_config)
service_data = QLowEnergyServiceData()
service_data.setType(QLowEnergyServiceData.ServiceTypePrimary)
service_data.setUuid(QBluetoothUuid.ServiceClassUuid.HeartRate)
service_data.addCharacteristic(char_data)
#! [Service Data]
#! [Start Advertising]
le_controller = QLowEnergyController.createPeripheral()
service = le_controller.addService(service_data)
le_controller.startAdvertising(QLowEnergyAdvertisingParameters(),
advertising_data, advertising_data)
#! [Start Advertising]
#! [Provide Heartbeat]
value_change = ValueChange.VALUE_UP
heartbeat_timer = QTimer()
current_heart_rate = 60
def heartbeat_provider():
global current_heart_rate, value_change, current_heart_rate
value = QByteArray()
value.append(chr(0)) # Flags that specify the format of the value.
value.append(chr(current_heart_rate)) # Actual value.
characteristic = service.characteristic(
QBluetoothUuid.CharacteristicType.HeartRateMeasurement)
assert characteristic.isValid()
# Potentially causes notification.
service.writeCharacteristic(characteristic, value)
if current_heart_rate == 60:
value_change = ValueChange.VALUE_UP
elif current_heart_rate == 100:
value_change = ValueChange.VALUE_DOWN
if value_change == ValueChange.VALUE_UP:
current_heart_rate += 1
else:
current_heart_rate -= 1
heartbeat_timer.timeout.connect(heartbeat_provider)
heartbeat_timer.start(1000)
#! [Provide Heartbeat]
def reconnect():
service = le_controller.addService(service_data)
if not service.isNull():
le_controller.startAdvertising(QLowEnergyAdvertisingParameters(),
advertising_data, advertising_data)
le_controller.disconnected.connect(reconnect)
sys.exit(app.exec())