在python3中使用socket库(RFCOMM模式)重新连接蓝牙设备?

2024-09-24 16:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python3中的socket库从Raspberry Pi3连接到蓝牙GPS单元。我可以第一次连接并使数据流动,但如果我断开连接然后尝试重新连接,我会得到:

[Errno 16] Device or resource busy

我试着把连接放到一个子进程中,杀死它并重新创建它(最终目标),我得到了同样的错误。如果我关闭并重新启动测试程序,它连接没有问题。在

这是一个基于我发现的演示的测试脚本,打开连接关闭它然后尝试永远重新连接。当我尝试的时候,我得到了滴答滴答。。。直到我撞到^c杀死它

import io
import socket
from time import sleep
from bluetooth import *
import sys
class SocketIO(io.RawIOBase):
    def __init__(self, sock):
        self.sock = sock
    def read(self, sz=-1):
        if (sz == -1): sz=0x7FFFFFFF
        return self.sock.recv(sz)
    def seekable(self):
        return False

# file: l2capclient.py
# desc: Demo L2CAP client for bluetooth module.
# $Id: l2capclient.py 524 2007-08-15 04:04:52Z albert $

if sys.version < '3':
    input = raw_input

if len(sys.argv) < 2:
    print("usage: l2capclient.py <addr>")
    sys.exit(2)

bt_addr=sys.argv[1]
port = 1

print("trying to connect to %s on PSM 0x%X" % (bt_addr, port))

# Create the client socket
sock=BluetoothSocket( RFCOMM )

sock.connect((bt_addr, port))
fd = SocketIO(sock)
bno = 0
for line in fd:
    print(line)
    bno +=1
    if bno >10:
         break
sock.shutdown(socket.SHUT_RDWR)
sock.close()
print("closed")
sock=BluetoothSocket( RFCOMM )
not_connected = True
while not_connected:
    try:
        sock.connect((bt_addr, port))
        not_connected = False
    except:
        sleep(1)
        print("tick")
        pass
fd = SocketIO(sock)
try:
    for line in fd:
        print(line)
except IOError:
    pass
sock.close()

SocketIO类只是为了方便我一行一行地获取数据短袜收银机(1024)得到了相同的结果。在


Tags: importselfifportdefsyslinesocket
1条回答
网友
1楼 · 发布于 2024-09-24 16:41:39

我也有类似的问题。我使用python套接字和蓝牙RFCOMM套接字从我的PC向HC-05蓝牙模块发送数据。这里有一些事情似乎改善了使用蓝牙的调试情况。。。在

  • 如果您还没有,请将您的套接字设置为非阻塞套接字,它会在出现问题时发出一个标志,而不是使程序崩溃
  • 请确保您正确地关闭了连接(但似乎您正在这样做)
  • 确保GPS的出厂设置没有阻止您立即重新连接。这可能与出厂设置/超时不符合您再次请求连接的方式有关,而该错误可能是由于您的代码造成的,而且很可能是由于出厂设置(如果有的话)。在

相关问题 更多 >