使用pyBluez,我使用以下代码做广告并监听蓝牙连接:
def connect_socket():
global client_sock
try:
server_sock = BluetoothSocket(RFCOMM)
server_sock.bind(("", PORT_ANY))
server_sock.listen(1)
port = server_sock.getsockname()[1]
uuid = "00001101-0000-1000-8000-00805F9B34FB"
advertise_service(server_sock, "GSA",
service_id=uuid,
service_classes=[uuid, SERIAL_PORT_CLASS],
profiles=[SERIAL_PORT_PROFILE])
print("Waiting for connection on RFCOMM channel %d" % port)
client_sock, client_info = server_sock.accept()
print("Accepted connection from ", client_info)
except Exception as e: (yes, I know I'm catching all exceptions)
print(e)
我使用以下命令来调用上述命令并从套接字发送数据。 (我希望在每个可能的通道上都等待连接,这是不希望的,但这不是我唯一的问题,也不是提示此问题的一个问题,尽管我也想修复它。)
def write_bt(message):
global client_sock
if client_sock is None:
threading.Thread(target=connect_socket).start()
if client_sock is not None:
try:
client_sock.send(message)
except Exception as e:
gsa_msg.message(e)
client_sock = None
我还需要从套接字接收数据并将其写入USB连接。为此,我使用以下内容:
def forward_bt_to_usb():
global client_sock
global serUSB
if (client_sock is not None) and (serUSB is not None):
try:
data = client_sock.recv(1024)
serUSB.write(data)
except Exception as e:
gsa_msg.error(e)
client_sock = None
write_bt()
和forward_bt_to_usb()
都从循环中连续调用并与同一个客户端进行通信,但是并不总是通过套接字接收数据,并且forward_bt_to_usb()
似乎可以在这种情况下,阻止所有内容。
我认为,对于我想做的事情,我可能所有的结构都不正确,或者也许我只需要使用单独的线程来发送和接收数据,但是对我来说,如何做到这一点并不明显(最初我只是将forward_bt_to_usb()
中的一些代码放在了单独的线程中,却没有意识到那样会继续创建新线程,因为forward_bt_to_usb()
一直被调用。)
似乎我想做的事情应该很简单,当然也不是新颖的,但是我却找不到能够实现的示例或解释。