You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Bleak实现蓝牙设备配对?附扫描设备代码

基于Bleak实现蓝牙设备配对

蓝牙配对属于系统层面的操作,Bleak通过BleakClient提供了触发配对的接口,以下是在你现有扫描代码基础上添加配对功能的实现方案:

核心修改点

  • 新增BleakClient用于连接并触发设备配对
  • 为扫描到的每个设备添加配对按钮
  • 新增状态区域展示配对结果

修改后的完整代码

from bleak import BleakScanner, BleakClient
import flet as ft
import asyncio


async def scan_devices(device_list, status_text, page):
    device_list.controls.clear()
    device_list.controls.append(ft.Text("Scanning for Bluetooth devices..."))
    status_text.value = ""
    page.update()

    devices = await BleakScanner.discover()

    device_list.controls.clear()
    if devices:
        for device in devices:
            # 为每个设备创建条目:名称地址信息 + 配对按钮
            device_row = ft.Row(
                controls=[
                    ft.Text(f"Name: {device.name or 'Unnamed'}, Address: {device.address}, RSSI: {device.rssi}"),
                    ft.ElevatedButton(
                        text="Pair",
                        on_click=lambda e, addr=device.address: asyncio.run(
                            pair_device(addr, status_text, page)
                        )
                    )
                ],
                alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
                width=page.window_width - 40
            )
            device_list.controls.append(device_row)
    else:
        device_list.controls.append(ft.Text("No devices found."))

    page.update()


async def pair_device(device_address, status_text, page):
    status_text.value = f"Attempting to pair with {device_address}..."
    page.update()

    try:
        # 连接设备并触发配对
        async with BleakClient(device_address) as client:
            # 调用pair方法发起配对,不同平台会触发系统配对流程
            paired = await client.pair()
            if paired:
                status_text.value = f"Successfully paired with {device_address}!"
            else:
                status_text.value = f"Failed to pair with {device_address}."
    except Exception as e:
        status_text.value = f"Pairing error: {str(e)}"
    page.update()


def main(page: ft.Page):
    page.title = "Bluetooth Scanner & Pairer"
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
    page.vertical_alignment = ft.MainAxisAlignment.CENTER
    page.scroll = ft.ScrollMode.AUTO
    page.padding = 20

    device_list = ft.Column(spacing=10)
    status_text = ft.Text(color=ft.colors.BLUE_700, size=14)

    def on_scan_click(e):
        asyncio.run(scan_devices(device_list, status_text, page))

    scan_button = ft.ElevatedButton(text="Scan for Devices", on_click=on_scan_click)
    page.controls.extend([scan_button, device_list, status_text])
    page.update()


ft.app(target=main)

关键说明

  • 配对流程:调用BleakClient.pair()后,系统会弹出配对提示(比如Windows的配对窗口、macOS的权限弹窗),部分设备需要输入PIN码(通常设备说明书会标注,或为0000/1234)
  • 平台差异:
    • Windows:依赖系统蓝牙服务,配对后设备会出现在系统蓝牙列表中
    • Linux:可能需要bluetoothctl权限,确保用户有蓝牙操作权限
    • macOS:配对前需要允许应用访问蓝牙权限
  • 异常处理:代码中捕获了配对过程中的异常,比如设备不可达、配对超时等情况,会在状态区域显示错误信息

内容的提问来源于stack exchange,提问作者Subzee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:43:15