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

2

10

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.

Nesline answered 26/5, 2016 at 15:29 Comment(0)
N
17

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

Nesline answered 27/5, 2016 at 15:40 Comment(10)
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_CLINesline
Alright, thanks, so it's basically: your bluetooth agent for example bluetoothctlAutomaton
Yes. You can use bluetoothctl if you do not have bluetooth-agentNesline
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?Automaton
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."Nesline
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"Automaton
is there something similar to bluetoothctl or bluetooth-agent to use in windows 10Cannady
Hi. I am not sure if there is something similar for Windows 10. Maybe you can check this link bluetoothinstaller.com/bluetooth-command-line-toolsNesline
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 !Walliw
Hi Vincent, the prompt is on a display? If this is the case, I understand that the user needs to handle it.Nesline
P
0

Is there a way to connect two phones via Bluetooth , the script should be running on a Linux host. Any suggestions of using pybluez or any other APIs?

I have seen some examples where a Linux host is used as Client and is connect a phone (which is a server), but here I'm want to use Linux host as just a device to run the script and make two phones connect via Bluetooth.

Psychrometer answered 1/12, 2022 at 0:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.