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 VerbindungDiese 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?