Frage RFCOMM ohne Pairing mit PyBluez auf Debian?


Ich versuche einen RFCOMM-Serverprozess mit Python zu erstellen, der ohne Pairing verwendet werden kann. Zunächst griff ich die beiden Beispielskripte aus der PyBluez-Dokumentation:

Server:

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

Klient:

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

Als ich das Server-Skript unter Windows ausführte, funktionierte alles so, wie ich gehofft hatte - kein Pairing nötig. Zu diesem Zeitpunkt sah alles sehr vielversprechend aus.

Allerdings muss der Serverprozess unter Debian Squeeze ausgeführt werden. Wenn ich auf Debian teste, wird die Clientverbindung abgelehnt. Im syslog gibt es Nachrichten von bluetoothd für eine fehlgeschlagene Verbindungsschlüsselanfrage und PIN-Anfrage.

Versionsinformation:

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

Diese Diskussion scheint zu suggerieren, dass, wenn ich die Sicherheitsstufe auf dem Server-Socket anpassen kann, Pairing deaktiviert wird und alles wie erwartet funktioniert. Es ist mir jedoch nicht klar, wie ich das mit PyBluez machen soll oder ob es möglich ist.

Ich habe mit Calls zu Setsockopt () experimentiert, indem ich verschiedene BT_SECURITY * -Konstanten benutzte, sowie den letzten PyBluez und den Aufruf von setl2capsecurity () gepackt habe, aber noch keine Fortschritte machen konnte.

Wird das mit PyBluez möglich sein?


14
2018-01-31 04:05


Ursprung


Antworten:


Dies stellte sich als ein Problem mit der Standardkonfiguration von Debian Squeeze bluez heraus.

Wenn jemand anderes dieses Problem hat, deaktivieren Sie das Pnat-Plugin, indem Sie /etc/bluetooth/main.conf bearbeiten:

DisablePlugins = pnat

Dann starte bluetoothd neu.

$ sudo invoke-rc.d bluetooth restart

Für den PyBluez-Code waren keine Änderungen erforderlich.


15
2018-02-12 06:51