RFCOMM sans liaison à l'aide d'PyBluez sur Debian?

Je suis en train de créer un RFCOMM processus de serveur avec Python qui peuvent être utilisés sans la nécessité pour le couplage. D'abord, j'ai attrapé les deux exemples de scripts à partir de la PyBluez documentation:

Serveur:

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

Client:

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

Lorsque j'ai exécuté le script serveur sur Windows, tout a fonctionné exactement comme je l'avais espéré - pas de couplage a été nécessaire. À ce stade, tout avait l'air très prometteur.

Cependant, j'ai besoin de processus de serveur pour fonctionner sous Debian Squeeze. Quand je l'ai tester sur Debian, le client, la connexion est refusée. Dans le syslog il y a des messages à partir de bluetoothd de l'échec d'une clé de liaison et de demande de demande de PIN.

Informations de Version:

  • PyBluez 0.18
  • Python 2.6
  • Bluez 4.66
  • Bluetooth v2.0 matériels sur les deux extrémités de la connexion

Cette discussion semble suggérer que, si je peux ajuster le niveau de sécurité sur le serveur douille de couplage sera désactivé et tout ce que tout fonctionne comme prévu. Il n'est pas évident pour moi comment faire cela avec PyBluez bien, ou même si c'est possible.

J'ai expérimenté avec des appels à setsockopt() à l'aide de divers BT_SECURITY* constantes, ainsi que l'accaparement de la dernière PyBluez et de l'appel de setl2capsecurity (), mais n'ont pas été en mesure de faire des progrès.

Est-ce que ce sera réalisable avec PyBluez?

OriginalL'auteur Tim Connolly | 2013-01-31