使用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、厂商特定数据等唯一特征识别:
- 先运行扫描代码,记录目标手机广播中的唯一标识(比如特定服务UUID、厂商ID)
- 编写过滤逻辑,示例如下:
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
相关产品推荐
相关产品推荐

