Pairing bluetooth devices with Passkey/Password in python - RFCOMM (Linux)

32,417

Finally I am able to connect to a device using PyBlueZ. I hope this answer will help others in the future. I tried the following:

First, import the modules and discover the devices.

import bluetooth, subprocess
nearby_devices = bluetooth.discover_devices(duration=4,lookup_names=True,
                                                      flush_cache=True, lookup_class=False)

When you discover the device you want to connect, you need to know port, the address and passkey. With that information do the next:

name = name      # Device name
addr = addr      # Device Address
port = 1         # RFCOMM port
passkey = "1111" # passkey of the device you want to connect

# kill any "bluetooth-agent" process that is already running
subprocess.call("kill -9 `pidof bluetooth-agent`",shell=True)

# Start a new "bluetooth-agent" process where XXXX is the passkey
status = subprocess.call("bluetooth-agent " + passkey + " &",shell=True)

# Now, connect in the same way as always with PyBlueZ
try:
    s = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
    s.connect((addr,port))
except bluetooth.btcommon.BluetoothError as err:
    # Error handler
    pass

Now, you are connected!! You can use your socket for the task you need:

s.recv(1024) # Buffer size
s.send("Hello World!")

Official PyBlueZ documentation is available here

Share:
32,417
Juan C. Vanegas
Author by

Juan C. Vanegas

An electronic engineer working on Web development and IoT

Updated on August 02, 2022

Comments

  • Juan C. Vanegas
    Juan C. Vanegas almost 2 years

    I am working on a Python script to search for bluetooth devices and connect them using RFCOMM. This devices has Passkey/Password. I am using PyBlueZ and, as far as I know, this library cannot handle Passkey/Password connections (Python PyBluez connecting to passkey protected device).

    I am able to discover the devices and retrieve their names and addresses:

    nearby_devices = bluetooth.discover_devices(duration=4,lookup_names=True,
                                                          flush_cache=True, lookup_class=False)
    

    But if tried to connect to a specific device using:

    s = bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
    s.connect((addr,port)) 
    

    I get an error 'Device or resource busy (16)'.

    I tried some bash commands using the hcitool and bluetooth-agent, but I need to do the connection programmatically. I was able to connect to my device using the steps described here: How to pair a bluetooth device from command line on Linux.

    I want to ask if someone has connected to a bluetooth device with Passkey/Password using Python. I am thinking about to use the bash commands in Python using subprocess.call(), but I am not sure if it is a good idea.

    Thanks for any help.

  • Juan C. Vanegas
    Juan C. Vanegas about 5 years
    Hi Yahya. Yes, it is a command. bluetooth-agent is a tool to manage the pairing code. You can read more about it: askubuntu.com/questions/763939/… wiki.debian.org/BluetoothUser#Pairing_using_CLI
  • Yahya
    Yahya about 5 years
    Alright, thanks, so it's basically: your bluetooth agent for example bluetoothctl
  • Juan C. Vanegas
    Juan C. Vanegas about 5 years
    Yes. You can use bluetoothctl if you do not have bluetooth-agent
  • Yahya
    Yahya about 5 years
    So is there a bluetooth-agent package that I can install or it is just a name the refer to the category which includes as I mentioned for example bluetoothctl?
  • Juan C. Vanegas
    Juan C. Vanegas about 5 years
    According to manpages.ubuntu.com/manpages/trusty/en/man1/…, if you have bluez installed is possible you already have bluetooth-agent. In Debian (wiki.debian.org/BluetoothUser#Pairing_using_CLI) they said "Bluetooth-agent is part of package bluez. So, if you use Debian testing or unstable, it should already be installed."
  • Yahya
    Yahya about 5 years
    Any by the way for future readers, not all debians dists have bluetooth-agent , it's clearly mentioned that: "If bluetooth-agent is not available, try bluetoothctl"
  • moe asal
    moe asal over 4 years
    is there something similar to bluetoothctl or bluetooth-agent to use in windows 10
  • Juan C. Vanegas
    Juan C. Vanegas over 4 years
    Hi. I am not sure if there is something similar for Windows 10. Maybe you can check this link bluetoothinstaller.com/bluetooth-command-line-tools
  • Vincent Monteil
    Vincent Monteil over 4 years
    Hi ! In my case, the remote device will prompt its security passcode only when it gets a connexion request. How to manage this with this code ? Thanks !
  • Juan C. Vanegas
    Juan C. Vanegas over 4 years
    Hi Vincent, the prompt is on a display? If this is the case, I understand that the user needs to handle it.