可同时发送和接收的Python蓝牙插座

时间:2019-06-20 17:34:30

标签: python sockets bluetooth

使用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()一直被调用。)

似乎我想做的事情应该很简单,当然也不是新颖的,但是我却找不到能够实现的示例或解释。

0 个答案:

没有答案