在python中使用Passkey/Password配对蓝牙设备 - RFCOMM(Linux)

Jua*_*gas 6 python linux bluetooth pybluez

我正在研究一个Python脚本来搜索蓝牙设备并使用RFCOMM连接它们.此设备具有密码/密码.我正在使用PyBlueZ,据我所知,这个库无法处理Passkey/Password连接(Python PyBluez连接到passkey protected device).

我能够发现设备并检索它们的名称和地址:

nearby_devices = bluetooth.discover_devices(duration=4,lookup_names=True,
                                                      flush_cache=True, lookup_class=False)
Run Code Online (Sandbox Code Playgroud)

但如果尝试使用以下方法连接到特定设备:

s = bluetooth.BluetoothSocket(bluetooth.RFCOMM) 
s.connect((addr,port)) 
Run Code Online (Sandbox Code Playgroud)

我收到一个错误'Device or resource busy (16)'.

我使用hcitoolbluetooth-agent尝试了一些bash命令,但我需要以编程方式进行连接.我能够使用此处描述的步骤连接到我的设备:如何在Linux上从命令行配对蓝牙设备.

我想询问是否有人使用Python连接到使用Passkey/Password的蓝牙设备.我正在考虑在Python中使用bash命令subprocess.call(),但我不确定这是不是一个好主意.

谢谢你的帮助.

Jua*_*gas 10

最后,我能够使用PyBlueZ连接到设备.我希望这个答案能在将来帮助其他人.我尝试了以下方法:

首先,导入模块并发现设备.

import bluetooth, subprocess
nearby_devices = bluetooth.discover_devices(duration=4,lookup_names=True,
                                                      flush_cache=True, lookup_class=False)
Run Code Online (Sandbox Code Playgroud)

当您发现要连接的设备时,您需要知道端口,地址和密码.有了这些信息,请做下一步:

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
Run Code Online (Sandbox Code Playgroud)

现在,你已经连接!! 您可以使用套接字完成所需的任务:

s.recv(1024) # Buffer size
s.send("Hello World!")
Run Code Online (Sandbox Code Playgroud)

官方PyBlueZ文档可在此处获得

  • 顺便说一下,对于未来的读者,并非所有 debian 发行版都有 `bluetooth-agent` ,它清楚地提到:“如果 `bluetooth-agent` 不可用,请尝试使用 `bluetoothctl`” (2认同)