咱们搞 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 虽说有点年纪了,但该有的功能都有,性能也还不赖。平时写写小工具,跟蓝牙设备互动一下,都够用。不过写项目之前记得看看你要连的设备支持啥协议,免得白忙活。
搞不定就去翻翻文档,多试试,蓝牙这玩意儿就是得多倒腾才能玩明白。代码写得不对劲儿了也别怕,重启一下设备、重连一下,世界就清净了。