Bleak
是一个跨平台的 Python 库,用于与蓝牙低能耗(BLE)设备进行通信。它提供了简化的 API 来连接、读取和写入蓝牙设备的特性。Bleak
支持 Windows、Mac 和 Linux 等平台,并且可以与各种蓝牙设备进行交互。
以下是使用 Bleak
库的基本方法:
安装 Bleak
首先,确保安装了 bleak
库,可以通过 pip 安装:
pip install bleak
1. 扫描可用的蓝牙设备
你可以使用 BleakScanner
来扫描附近的 BLE 设备。
import asyncio
from bleak import BleakScanner
async def scan_devices():
devices = await BleakScanner.discover()
for device in devices:
print(f"Device found: {device.name} ({device.address})")
# 启动扫描
asyncio.run(scan_devices())
2. 连接到 BLE 设备
连接到蓝牙设备时,需要使用 BleakClient
。在连接之前,你需要获取设备的地址(通常是 MAC
地址)或设备名称。
import asyncio
from bleak import BleakClient
async def connect_device(address):
async with BleakClient(address) as client:
connected = await client.is_connected()
print(f"Connected: {connected}")
# 获取设备的所有特性
services = await client.get_services()
print(f"Services: {services}")
# 使用设备的地址来连接
device_address = "XX:XX:XX:XX:XX:XX" # 替换为实际设备地址
asyncio.run(connect_device(device_address))
3. 读取蓝牙特性
每个蓝牙设备都有特性(Characteristics),你可以使用 BleakClient
读取设备的特性。
import asyncio
from bleak import BleakClient
async def read_characteristic(address, characteristic_uuid):
async with BleakClient(address) as client:
value = await client.read_gatt_char(characteristic_uuid)
print(f"Value: {value}")
# 替换为设备地址和特性UUID
device_address = "XX:XX:XX:XX:XX:XX"
characteristic_uuid = "00002a37-0000-1000-8000-00805f9b34fb" # 示例UUID
asyncio.run(read_characteristic(device_address, characteristic_uuid))
4. 写入蓝牙特性
可以通过 BleakClient
向蓝牙设备写入特性值。确保设备允许写操作。
import asyncio
from bleak import BleakClient
async def write_characteristic(address, characteristic_uuid, data):
async with BleakClient(address) as client:
await client.write_gatt_char(characteristic_uuid, data)
print(f"Wrote {data} to characteristic {characteristic_uuid}")
# 替换为设备地址和特性UUID
device_address = "XX:XX:XX:XX:XX:XX"
characteristic_uuid = "00002a37-0000-1000-8000-00805f9b34fb" # 示例UUID
data = bytearray([0x01, 0x02]) # 示例数据
asyncio.run(write_characteristic(device_address, characteristic_uuid, data))
5. 监听通知
Bleak
允许监听设备特性上的通知。通知通常用于蓝牙设备定期发送数据更新。
import asyncio
from bleak import BleakClient
async def notification_handler(sender: int, data: bytearray):
print(f"Received data: {data}")
async def enable_notifications(address, characteristic_uuid):
async with BleakClient(address) as client:
await client.start_notify(characteristic_uuid, notification_handler)
await asyncio.sleep(5) # 接收通知的持续时间
await client.stop_notify(characteristic_uuid)
# 替换为设备地址和特性UUID
device_address = "XX:XX:XX:XX:XX:XX"
characteristic_uuid = "00002a37-0000-1000-8000-00805f9b34fb" # 示例UUID
asyncio.run(enable_notifications(device_address, characteristic_uuid))
6. 断开连接
BleakClient
在 async with
语句块结束时会自动断开连接。如果你不使用 async with
,可以显式调用 client.disconnect()
来断开连接。
import asyncio
from bleak import BleakClient
async def disconnect_device(address):
client = BleakClient(address)
await client.connect()
print(f"Connected: {await client.is_connected()}")
await client.disconnect()
print("Disconnected")
device_address = "XX:XX:XX:XX:XX:XX"
asyncio.run(disconnect_device(device_address))
总结
Bleak
提供了简化的接口来处理 BLE 设备的扫描、连接、读取和写入操作。上面的示例展示了如何与蓝牙设备进行基本的交互。你可以根据自己的需求,修改 UUID、设备地址等参数来与具体的蓝牙设备进行通信。