Bluetooth-разъем Python для одновременной отправки и получения - PullRequest
0 голосов
/ 20 июня 2019

Используя pyBluez, я использую следующий код для рекламы и прослушивания соединения Bluetooth:

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() будет вызываться.)

Похоже, то, что я пытаюсь сделать, должно быть довольно простым и определенно не новым, но я не смог найти примеров или объяснений, которые мне удалось реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...