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

Tim Connolly
  • 499
  • 1
  • 3
  • 11

1 Answers1

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.

Tim Connolly
  • 499
  • 1
  • 3
  • 11
  • Thanks! This is also a problem under Ubuntu 12.04! – Unapiedra Apr 22 '13 at 16:16
  • Thanks! Very helpful. I'm on Ubuntu 12.04 too. I also found killing the bluetooth-agent process to help. – jagsaund Dec 30 '13 at 06:58
  • 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... – DominicM May 09 '14 at 15:24
  • This Debian bug report has more information: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690749 – Tim Connolly Jun 10 '14 at 04:06
  • The problem still happens for me on Raspbian, any hints how to debug it? Thanks for the heads up :) – perrohunter Jan 09 '15 at 09:21
  • It's odd, I get this same error on Raspbian with a Pi3, but that fix does not work for me. – Cerin Apr 18 '16 at 14:40
  • 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. – Tim Connolly Apr 20 '16 at 00:51