RFCOMM без сопряжения с использованием PyBluez на Debian?

Я пытаюсь создать серверный процесс RFCOMM с Python, который можно использовать без необходимости спаривания. Первоначально я схватил два примера сценариев из документации PyBluez:

Сервер:

# file: rfcomm-server.py # auth: Albert Huang <albert@csail.mit.edu> # desc: simple demonstration of a server application that uses RFCOMM sockets # # $Id: rfcomm-server.py 518 2007-08-10 07:20:07Z albert $ from bluetooth import * server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee" advertise_service( server_sock, "SampleServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ], # protocols = [ OBEX_UUID ] ) print "Waiting for connection on RFCOMM channel %d" % port client_sock, client_info = server_sock.accept() print "Accepted connection from ", client_info try: while True: data = client_sock.recv(1024) if len(data) == 0: break print "received [%s]" % data except IOError: pass print "disconnected" client_sock.close() server_sock.close() print "all done" 

Клиент:

 # file: rfcomm-client.py # auth: Albert Huang <albert@csail.mit.edu> # desc: simple demonstration of a client application that uses RFCOMM sockets # intended for use with rfcomm-server # # $Id: rfcomm-client.py 424 2006-08-24 03:35:54Z albert $ from bluetooth import * import sys addr = None if len(sys.argv) < 2: print "no device specified. Searching all nearby bluetooth devices for" print "the SampleServer service" else: addr = sys.argv[1] print "Searching for SampleServer on %s" % addr # search for the SampleServer service uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee" service_matches = find_service( uuid = uuid, address = addr ) if len(service_matches) == 0: print "couldn't find the SampleServer service =(" sys.exit(0) first_match = service_matches[0] port = first_match["port"] name = first_match["name"] host = first_match["host"] print "connecting to \"%s\" on %s" % (name, host) # Create the client socket sock=BluetoothSocket( RFCOMM ) sock.connect((host, port)) print "connected. type stuff" while True: data = raw_input() if len(data) == 0: break sock.send(data) sock.close() 

Когда я запускал серверный скрипт в Windows, все работало именно так, как я надеялся – никаких спариваний не было. На этом этапе все выглядело очень многообещающим.

Тем не менее, мне нужен серверный процесс для запуска под Debian Squeeze. Когда я тестирую Debian, клиентское соединение отказывается. В syslog есть сообщения от bluetoothd для отказавшего запроса ключа ключа и запроса PIN-кода.

Информация о версии:

  • PyBluez 0.18
  • Python 2.6
  • Bluez 4.66
  • Аппаратное обеспечение Bluetooth v2.0 на обоих концах соединения

Это обсуждение, похоже, предполагает, что если я смогу настроить уровень безопасности на серверном сокете, тогда соединение будет отключено, и все будет работать так, как ожидалось. Мне не очевидно, как это сделать с PyBluez, хотя, даже если это возможно.

Я экспериментировал с вызовами setsockopt () с использованием различных констант BT_SECURITY *, а также захватывал последний PyBluez и вызывал setl2capsecurity (), но не смог добиться какого-либо прогресса.

Возможно ли это с PyBluez?

Это оказалось проблемой с конфигурацией Debian Squeeze bluez по умолчанию.

Если кто-то еще сталкивается с этой проблемой, отключите плагин pnat, отредактировав файл /etc/bluetooth/main.conf:

 DisablePlugins = pnat 

Затем перезапустите bluetoothd.

 $ sudo invoke-rc.d bluetooth restart 

Для кода PyBluez изменений не требовалось.