PyBlueZ: создание нескольких клиентских подключений - PullRequest
4 голосов
/ 15 марта 2012

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

Однако, что я действительно хочу, так это запустить взаимодействие клиента в отдельных потокахУ меня есть несколько клиентов одновременно.Однако когда я пытаюсь подключиться ко второму клиенту, PyBlueZ объявляет тот же порт, который используется первым клиентом.Я устанавливаю соединения следующим образом:

self.port = bluetooth.PORT_ANY
print "Accepting clients..."
self.server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
self.server_sock.bind(("",self.port))
self.server_sock.listen(5)
print "listening on port %d" % self.port

bluetooth.advertise_service( self.server_sock, MY_SERVICE, MY_UUID )

client_sock,address = self.server_sock.accept()
print "Accepted connection from ",address

commThread = ServerThread(client_sock, self.bn_id, self.bn_name, self.bn_thumbnail)

Опять же, этот код отлично работает для последовательных соединений, но когда я пытаюсь сделать это параллельно, мой клиент получает ответ «занято» от системы bluetooth сервера.На стороне клиента я вывожу порт, к которому он пытается подключиться, и он всегда показывает порт "1".

Есть ли ограничение в PyBlueZ, которое допускает только одно соединение?Или я что-то не так делаю для параллельных соединений?

1 Ответ

1 голос
/ 02 апреля 2012

Я думаю, что ваша проблема не имеет ничего общего с клиентской частью кода Bluetooth.Вы были правы, чтобы показать код сервера Bluetooth.Что вы должны попытаться изменить:

  • Рекламируйте сервис только один раз и только один раз (нет необходимости рекламировать его для каждого потока сервера)
  • Выделитеразные серверные каналы для каждого потока. (При подключении RFCOMM обычно есть менеджер RFCOMM, который выделяет новый серверный канал для каждого сокета. Я думаю, в вашем случае вам, возможно, придется сделать это вручную.) Измените этот код

    self.port = bluetooth.PORT_ANY
    

    Попробуйте каналы 1, 2 и т. Д. И посмотрите, работает ли он!Тогда все, что вам нужно сделать, это отслеживать выделенные каналы.

Пожалуйста, дайте мне знать, если это сработало!

...