Pairing bluetooth devices with Passkey/Password in python - RFCOMM (Linux)
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
Juan C. Vanegas
An electronic engineer working on Web development and IoT
Updated on August 02, 2022Comments
-
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 about 5 yearsHi 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 about 5 yearsAlright, thanks, so it's basically:
your bluetooth agent
for examplebluetoothctl
-
Juan C. Vanegas about 5 yearsYes. You can use
bluetoothctl
if you do not havebluetooth-agent
-
Yahya about 5 yearsSo 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 examplebluetoothctl
? -
Juan C. Vanegas about 5 yearsAccording to manpages.ubuntu.com/manpages/trusty/en/man1/…, if you have
bluez
installed is possible you already havebluetooth-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 about 5 yearsAny by the way for future readers, not all debians dists have
bluetooth-agent
, it's clearly mentioned that: "Ifbluetooth-agent
is not available, trybluetoothctl
" -
moe asal over 4 yearsis there something similar to
bluetoothctl
orbluetooth-agent
to use in windows 10 -
Juan C. Vanegas over 4 yearsHi. 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 over 4 yearsHi ! 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 over 4 yearsHi Vincent, the prompt is on a display? If this is the case, I understand that the user needs to handle it.