Подтвердить что ты не робот

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

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

Сервер:

# file: rfcomm-server.py

# auth: Albert Huang <[email protected]>
# 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 <[email protected]>
# 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()

Когда я запускал сервер script в 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?

4b9b3361

Ответ 1

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

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

DisablePlugins = pnat

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

$ sudo invoke-rc.d bluetooth restart

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