咱们搞 Python 开发的都知道,蓝牙设备已经遍地开花了,从耳机到手环,从智能家居到工业控制,可不得整明白怎么用 Python 跟这些设备唠嗑?PyBluez这个库就是来帮咱们解决这个问题的。
1.安装那些事
装这玩意儿可不像装其他包那么简单,得先把环境搞好。Windows 用户要先装 Visual C++ 编译工具,Linux 党得装 libbluetooth-dev,Mac 用户还得装 XCode。环境搞定了,就能愉快地 pip 了:
pip install PyBluez
哦对了,要是装不上,别慌,看看是不是 Python 版本太新了,PyBluez 最多支持到 Python 3.8。
2.找设备玩耍
想跟蓝牙设备玩,得先找到它们在哪儿躲着:
import bluetooth
nearby_devices = bluetooth.discover_devices(lookup_names=True)
for addr, name in nearby_devices:
print(f“找到设备:{name} - {addr}”)
温馨提示:有些设备可能处于隐身模式,这时候就找不着了,得让它们现个身。
3.建立连接整活
找着设备了,咱们就可以连上它搞事情了:
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
target_address = “XX:XX:XX:XX:XX:XX” # 这是设备的MAC地址
port = 1 # 端口号,不同设备可能不一样
try:
sock.connect((target_address, port))
print(“连上了!”)
sock.send(“你好呀!”)
data = sock.recv(1024)
print(f“收到消息:{data}”)
except Exception as e:
print(f“哎呀,出事了:{e}”)
finally:
sock.close()
4.RFCOMM 服务器整起来
要是想让你的电脑变身蓝牙服务器,接收其他设备发来的消息,也不难:
server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
server_sock.bind((“”, bluetooth.PORT_ANY))
server_sock.listen(1)
port = server_sock.getsockname()[1]
uuid = “94f39d29-7d6d-437d-973b-fba39e49d4ee”
bluetooth.advertise_service(server_sock, “我的蓝牙服务”,
service_id=uuid,
service_classes=[uuid, bluetooth.SERIAL_PORT_CLASS],
profiles=[bluetooth.SERIAL_PORT_PROFILE])
print(“等待连接...”)
client_sock, client_info = server_sock.accept()
print(f“接到连接:{client_info}”)
温馨提示:UUID 是服务的唯一标识,建议用在线工具生成一个,别直接抄我的。
5.异步操作不卡顿
同步操作容易把程序卡住,咱们用 asyncio 来搞定这事:
import asyncio
import bluetooth
from concurrent.futures import ThreadPoolExecutor
async def scan_devices():
loop = asyncio.get_event_loop()
with ThreadPoolExecutor() as pool:
devices = await loop.run_in_executor(
pool, bluetooth.discover_devices, True, True
)
return devices
async def main():
print(“开始扫描...”)
devices = await scan_devices()
for addr, name in devices:
print(f“设备:{name} - {addr}”)
asyncio.run(main())
蓝牙开发看着高大上,其实搞明白了也就那么回事。PyBluez 虽说有点年纪了,但该有的功能都有,性能也还不赖。平时写写小工具,跟蓝牙设备互动一下,都够用。不过写项目之前记得看看你要连的设备支持啥协议,免得白忙活。
搞不定就去翻翻文档,多试试,蓝牙这玩意儿就是得多倒腾才能玩明白。代码写得不对劲儿了也别怕,重启一下设备、重连一下,世界就清净了。

