RFCOMM without pairing using PyBluez on Debian?
Asked Answered
Y

1

17

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

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?

Yahairayahata answered 31/1, 2013 at 4:5 Comment(0)
Y
18

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.

Yahairayahata answered 12/2, 2013 at 6:51 Comment(6)
Thanks! Very helpful. I'm on Ubuntu 12.04 too. I also found killing the bluetooth-agent process to help.Combinative
Would have never figured this out, thank you! Worked on Raspbian OS. Any chance you could add some info on what exactly is pnat and why its enabled by default? Cant find much info on it...Eyed
This Debian bug report has more information: bugs.debian.org/cgi-bin/bugreport.cgi?bug=690749Yahairayahata
The problem still happens for me on Raspbian, any hints how to debug it? Thanks for the heads up :)Calan
It's odd, I get this same error on Raspbian with a Pi3, but that fix does not work for me.Ermey
I ended up figuring out the original problem by building from source. I was surprised to find that it initially worked as expected. So then I had to make sure all the plugins were included and that replicated the problem.Yahairayahata

© 2022 - 2024 — McMap. All rights reserved.