Используя 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()
будет вызываться.)
Похоже, то, что я пытаюсь сделать, должно быть довольно простым и определенно не новым, но я не смог найти примеров или объяснений, которые мне удалось реализовать.