Python蓝牙套接字出现OSError错误

4

我希望在Windows 10上使用Python 3.9中的套接字(socket)连接到Arduino上的HC-05模块并发送/读取一些字符。然而,当我使用以下代码时,会出现错误:

import socket
adapter_addr = '00:21:11:01:FA:1C'
port = 1  # Normal port for rfcomm?
buf_size = 1024
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, 
socket.BTPROTO_RFCOMM)
s.bind((adapter_addr, port))
s.listen(1)
try:
    print('Listening for connection...')
    client, address = s.accept()
    print(f'Connected to {address}')

    while True:
        data = client.recv(buf_size)
        if data:
            print(data)
except Exception as e:
    print(f'Something went wrong: {e}')
    client.close()
    s.close()

line 30, in <module>
    s.bind((adapter_addr, port))
OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions

我也尝试使用了PyBluez库,但是它给出了类似的错误信息。 感谢任何帮助。

1个回答

1
看起来你的问题可能与RFCOMM通道号(你所称的端口)有关。我建议你首先阅读一下这里的相关内容(链接),因为就至少监听方面来说,你的代码看起来没问题。通道1导致问题的原因(当测试你的代码时,我也遇到了同样的问题)可能是已经有另一个服务使用了该通道号,例如虚拟COM端口。如果你尝试使用其他数字,你应该会发现它不会失败。winsock库Python使用的反过来有一个常量BT_PORT_ANY可以使用,用于自动分配通道号,但Python似乎没有公开这个。通过试错,它似乎被定义为-1。

考虑到你正在使用RFCOMM,你可能想要考虑使用Windows已经为你创建的虚拟串行端口(COMx)。例如,像pyserial之类的东西。这将更简单,只要你能确定客户端的串行端口,就可以避免所有与蓝牙相关的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接