从入门到实战的完整指南
目录导读
- 引言:为什么需要脚本化蓝牙设备扫描?
- 核心原理:蓝牙扫描背后的技术机制
- 主流脚本方案对比:Python vs PowerShell vs Shell
- 实战:Python脚本获取蓝牙设备列表(完整代码)
- 实战:Windows PowerShell脚本获取蓝牙设备列表
- 实战:Linux Shell脚本(基于bluetoothctl)
- 常见问题与问答
- 优化建议与SEO关键词布局
引言:为什么需要脚本化蓝牙设备扫描?
在日常开发、物联网调试、自动化测试或智能家居场景中,手动打开蓝牙设置查看设备列表往往效率低下,通过脚本获取蓝牙设备列表,可以:

- 自动化检测周边蓝牙设备(如传感器、耳机、手环)
- 集成到监控系统中实时追踪设备状态
- 批量管理连接与配对流程
本文将从零开始,教你使用三种主流脚本语言实现蓝牙设备列表扫描,并涵盖Windows、macOS、Linux三平台。
核心原理:蓝牙扫描背后的技术机制
脚本获取蓝牙设备列表的本质是调用操作系统的蓝牙协议栈API或命令工具,不同平台依赖的底层技术不同:
- Windows:通过
Windows.Devices.Bluetooth命名空间的PowerShell cmdlet,或调用bthprops.cpl(控制面板)的COM对象。 - macOS:依赖
IOBluetooth框架,可通过system_profiler命令或BlueUtil工具。 - Linux:最常用
bluez协议栈,通过hcitool、bluetoothctl或dbus接口获取。
关键点:脚本需要具有对应权限(如管理员/root),否则可能扫描失败。
主流脚本方案对比:Python vs PowerShell vs Shell
| 脚本类型 | 跨平台性 | 依赖 | 适用场景 |
|---|---|---|---|
| Python | 跨平台(需安装库) | PyBluez、bleak | 复杂逻辑、数据清洗 |
| PowerShell | Windows原生 | 无(Win10+内置) | 系统管理、快速集成 |
| Shell脚本 | Linux/macOS | bluez-utils | 轻量级、嵌入式设备 |
实战:Python脚本获取蓝牙设备列表(完整代码)
Python凭借bleak库(异步、跨平台)成为最佳选择,以下代码可扫描BLE(低功耗蓝牙)设备列表:
import asyncio
from bleak import BleakScanner
async def scan_bluetooth_devices(timeout=10):
print("正在扫描蓝牙设备...")
devices = await BleakScanner.discover(timeout=timeout)
if not devices:
print("未发现任何蓝牙设备。")
return
print(f"发现 {len(devices)} 个设备:")
for device in devices:
print(f" 名称:{device.name or '未知'}")
print(f" MAC地址:{device.address}")
print(f" RSSI信号:{device.rssi} dBm")
print("-" * 30)
if __name__ == "__main__":
asyncio.run(scan_bluetooth_devices())
运行要求:
pip install bleak
(Windows/Linux均需开启蓝牙硬件)
实战:Windows PowerShell脚本获取蓝牙设备列表
在Windows 10/11中,无需第三方工具:
# 方式一:使用Get-PnpDevice(仅显示已配对设备)
$pairedDevices = Get-PnpDevice -Class Bluetooth | Where-Object {$_.Status -eq "OK"}
$pairedDevices | Select-Object FriendlyName, Class, Status
# 方式二:调用Windows.Devices.Bluetooth API(可扫描周围设备)
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
$selector = [Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher]::new()
$watcher = $selector
Register-ObjectEvent -InputObject $watcher -EventName "Received" -Action {
$eventData = $EventArgs
$deviceName = $eventData.BluetoothLEAdvertisement.LocalName
if ([string]::IsNullOrEmpty($deviceName)) { $deviceName = "未知设备" }
Write-Host "发现: $deviceName (MAC: $($eventData.BluetoothAddress.ToString('X12')))"
}
$watcher.Start()
Start-Sleep -Seconds 5
$watcher.Stop()
注意:PowerShell方式二需要管理员权限,且仅扫描BLE设备。
实战:Linux Shell脚本(基于bluetoothctl)
在Ubuntu/Debian等系统,使用bluetoothctl工具:
#!/bin/bash
# 扫描蓝牙设备并输出列表
echo "启动蓝牙扫描(持续5秒)..."
bluetoothctl -- scan on &
SCAN_PID=$!
sleep 5
bluetoothctl -- scan off > /dev/null 2>&1
echo "已发现的设备列表:"
bluetoothctl devices | while read -r line; do
mac=$(echo "$line" | awk '{print $2}')
name=$(echo "$line" | cut -d' ' -f3-)
echo " MAC: $mac 名称: $name"
done
# 可选:显示信号强度(需安装bluez-tools)
if command -v hcitool &> /dev/null; then
echo -e "\n信号强度详情:"
hcitool rssi "$mac" 2>/dev/null || echo "无法获取RSSI"
fi
前置条件:sudo apt install bluez bluez-tools,并确保蓝牙服务运行。
常见问题与问答
Q1:脚本扫描不到任何设备,怎么办?
A:
- 检查蓝牙硬件是否启用(Windows设备管理器/BT开关;Linux
rfkill list) - 确保脚本拥有管理员/root权限(Linux加
sudo,PowerShell以管理员运行) - 设备是否处于可发现模式?部分蓝牙设备(如AirPods)需进入配对模式。
Q2:如何区分经典蓝牙与BLE设备?
A:
- Python的
bleak仅扫描BLE设备;若要扫描经典蓝牙(如音箱),需使用PyBluez(Linux)或Windows的32feet库。 - Linux可通过
hcitool scan(经典)和hcitool lescan(BLE)区分。
Q3:脚本获取到的MAC地址是否可以持久化?
A:
现代蓝牙设备(尤其是iOS/Android设备)会随机化MAC地址以保护隐私,脚本捕获的MAC可能每次扫描都不同,建议通过设备名称或服务UUID进行识别。
Q4:如何将结果输出到文件或数据库?
A:
在Python中可直接open("devices.txt", "w")写入;PowerShell使用| Out-File results.csv;Shell使用> devices.log。
优化建议与SEO关键词布局
为提升文章在搜索引擎(如必应、谷歌)的排名,本文已自然融入以下关键词:
- 蓝牙设备列表获取脚本
- Python扫描蓝牙设备
- PowerShell蓝牙扫描
- Linux蓝牙命令行
- BLE设备发现脚本
后续可补充:
- 连接/配对自动化脚本
- 跨平台统一接口封装(如
asyncio+bleak) - 错误处理与重试机制
通过本文,你应能独立实现脚本化蓝牙设备扫描,不同平台各有优劣,但Python以其跨平台性和生态优势成为首选,如果你有更复杂的场景(如过滤特定设备、持续监控),欢迎在评论区交流。