RFCOMM without pairing using PyBluez on Debian?

五迷三道 提交于 2019-11-26 11:03:15

问题


I am trying to create an RFCOMM server process with Python that can be used without the need for pairing. Initially, I grabbed the two example scripts from the PyBluez documentation:

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

Client:

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

When I ran the server script on Windows everything worked just how I had hoped - no pairing was necessary. At this stage everything was looking very promising.

However, I need the server process to run under Debian Squeeze. When I test on Debian the client connection is refused. In the syslog there are messages from bluetoothd for a failed link key request and PIN request.

Version information:

  • PyBluez 0.18
  • Python 2.6
  • Bluez 4.66
  • Bluetooth v2.0 hardware on both ends of the connection

This discussion seems to suggest that if I can adjust the security level on the server socket then pairing will be disabled and everything will just work as expected. It is not apparent to me how to do this with PyBluez though, or even if it is possible.

I have experimented with calls to setsockopt() using various BT_SECURITY* constants, as well as grabbing the last PyBluez and calling setl2capsecurity() but have not been able to make any progress.

Is this going to be achievable with PyBluez?


回答1:


This turned out to be a problem with the Debian Squeeze bluez default configuration.

If anyone else hits this problem, disable the pnat plugin by editing /etc/bluetooth/main.conf:

DisablePlugins = pnat

Then restart bluetoothd.

$ sudo invoke-rc.d bluetooth restart

No changes were required to the PyBluez code.



来源:https://stackoverflow.com/questions/14618277/rfcomm-without-pairing-using-pybluez-on-debian

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!