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

使用Python Bleak获取蓝牙设备地址:扫描结果与手机地址不匹配问题

解决Bleak扫描BLE设备名称为None、地址不匹配的问题

核心原因分析

  • 手机BLE默认使用随机可解析地址,而非设置里显示的经典蓝牙地址,所以扫描到的地址会动态变化,和设置页地址不匹配是正常现象。
  • 部分设备默认不主动广播名称,或扫描模式为被动时无法获取名称信息。

具体解决思路

1. 切换主动扫描模式获取设备名称

被动扫描仅接收设备主动广播的数据,主动扫描会向设备发送请求,获取更多信息(包括名称)。修改代码如下:

import asyncio
from bleak import BleakScanner

async def main():
    # 启用主动扫描模式
    devices = await BleakScanner.discover(scanning_mode="active")
    for device in devices:
        # 从广播数据中多维度提取名称
        adv_data = device.advertisement_data
        device_name = adv_data.local_name or adv_data.complete_local_name or device.name
        print(f"地址: {device.address}, 名称: {device_name if device_name else '未获取到名称'}")

asyncio.run(main())

2. 基于唯一标识识别目标设备

不要依赖动态变化的BLE地址,改用设备广播中的服务UUID、厂商特定数据等唯一特征识别:

  1. 先运行扫描代码,记录目标手机广播中的唯一标识(比如特定服务UUID、厂商ID)
  2. 编写过滤逻辑,示例如下:
import asyncio
from bleak import BleakScanner

# 替换为你实际获取的目标手机特征UUID
TARGET_SERVICE_UUID = "0000180a-0000-1000-8000-00805f9b34fb"

async def main():
    def on_device_found(device, adv_data):
        # 检查设备是否包含目标UUID
        if TARGET_SERVICE_UUID in adv_data.service_uuids:
            device_name = adv_data.local_name or device.name or "未知设备"
            print(f"发现目标手机: {device_name}")

    # 使用回调模式持续扫描
    scanner = BleakScanner(detection_callback=on_device_found)
    await scanner.start()
    await asyncio.sleep(15)  # 扫描15秒
    await scanner.stop()

asyncio.run(main())

3. 平台相关配置检查

  • Linux:确保bluez版本≥5.50,执行sudo bluetoothctl后输入scan on,确认系统层面能扫描到设备名称
  • macOS:在系统偏好设置→安全性与隐私中,允许当前Python环境的蓝牙权限
  • Windows:更新蓝牙驱动至最新版本,确保系统蓝牙处于开启状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:22