RFCOMM ohne Pairing mit PyBluez unter Debian?

Ich versuche, mit Python einen RFCOMM-Serverprozess zu erstellen, der ohne Pairing verwendet werden kann. Anfangs habe ich mir die beiden Beispielskripte aus der PyBluez-Dokumentation geholt:

Server:

# 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"

Klient:

# 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()

Als ich das Serverskript unter Windows ausführte, funktionierte alles so, wie ich es mir erhofft hatte - es war kein Pairing erforderlich. Zu diesem Zeitpunkt sah alles sehr vielversprechend aus.

Allerdings muss der Serverprozess unter Debian Squeeze laufen. Wenn ich unter Debian teste, wird die Client-Verbindung abgelehnt. Im Syslog gibt es Nachrichten von bluetoothd für eine fehlgeschlagene Anforderung eines Verbindungsschlüssels und eine PIN-Anforderung.

Versionsinformation:

PyBluez 0.18Python 2.6Bluez 4.66Bluetooth v2.0-Hardware an beiden Enden der Verbindung

Diese Diskussion scheint darauf hinzudeuten, dass das Pairing deaktiviert wird und alles wie erwartet funktioniert, wenn ich die Sicherheitsstufe am Server-Socket anpassen kann. Mir ist jedoch nicht klar, wie das mit PyBluez gemacht werden soll oder ob es überhaupt möglich ist.

Ich habe mit Aufrufen von setsockopt () experimentiert, indem ich verschiedene BT_SECURITY * -Konstanten verwendet, den letzten PyBluez abgerufen und setl2capsecurity () aufgerufen habe, konnte aber keine Fortschritte erzielen.

Wird dies mit PyBluez erreichbar sein?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage