使用socket.AF_BLUETOOTH实现蓝牙通信遇WinError 10051问题求助
蓝牙Socket连接失败问题排查
问题说明
使用Python的socket库结合蓝牙功能实现两台设备间消息收发,服务端运行后能正常打印listening,但客户端无法建立连接,抛出以下错误:
C:\Users\DELL\PycharmProjects\bluetooth>python client.py Traceback (most recent call last): File "C:\Users\DELL\PycharmProjects\bluetooth\client.py", line 6, in <module> connection.connect(("b8:08:cf:3c:7a:c2", 4)) OSError: [WinError 10051] A socket operation was attempted to an unreachable network
已确认蓝牙处于开启、可被发现状态,怀疑MAC地址有误,但设备管理器中仅有一个设备带有“高级”选项。
相关代码
服务端代码
import socket bmac = "b8:08:cf:3c:7a:c2" server = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) server.bind((bmac, 4)) server.listen(1) print("listening") connection, addr = server.accept() print(f"{addr} connected!") connection.sendall("Hello Bluetooth!".encode()) print(connection.recv(1024)) connection.close()
客户端代码
import socket bmac = "b8:08:cf:3c:7a:c2" connection = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) connection.connect((bmac, 4)) data = connection.recv(1024) print(data) connection.sendall("Hello there!".encode()) connection.close()
可能的原因及解决方案
1. MAC地址错误
你获取的MAC地址可能不是蓝牙适配器的正确地址,可通过以下方式确认:
- Windows系统:打开命令提示符,执行
getmac /v命令,在结果中找到标注为“蓝牙”的适配器对应的物理地址;或者进入蓝牙设置→“更多蓝牙设置”→“硬件”选项卡,选中蓝牙适配器后点击“属性”→“高级”查看。 - 工具扫描验证:安装
pybluez库,运行以下代码扫描附近蓝牙设备,确认目标设备的正确MAC:import bluetooth nearby_devices = bluetooth.discover_devices(lookup_names=True) print("Found {} devices.".format(len(nearby_devices))) for addr, name in nearby_devices: print(" {} - {}".format(addr, name))
2. RFCOMM端口问题
- 端口4可能被系统占用或不允许使用,尝试更换为1-31之间的其他端口(RFCOMM协议的有效端口范围是1-31);
- 服务端可绑定到0号端口让系统自动分配可用端口,再通过
socket.getsockname()获取实际端口,客户端使用该端口连接:
服务端修改部分:server.bind((bmac, 0)) print(f"Listening on port {server.getsockname()[1]}")
3. 设备未配对或权限不足
- 先手动在系统蓝牙设置中完成两台设备的配对,再运行代码;
- 确保Python程序拥有蓝牙访问权限,Windows系统可在“隐私和安全性”→“蓝牙”中检查是否允许应用访问蓝牙。
4. 原生socket库对Windows蓝牙支持有限
Python原生socket的AF_BLUETOOTH在Windows平台的兼容性不如专用蓝牙库,建议使用pybluez库实现蓝牙通信,该库对Windows的蓝牙协议支持更完善。
5. 防火墙或安全软件拦截
- 临时关闭Windows防火墙或第三方安全软件,测试连接是否正常;
- 若正常,可在防火墙中添加Python程序的蓝牙连接放行规则。
内容的提问来源于stack exchange,提问作者user19154852
相关产品推荐
相关产品推荐

