9

我正在编写一个 Python 脚本来搜索蓝牙设备并使用RFCOMM连接它们。该设备具有密码/密码。我正在使用 PyBlueZ,据我所知,这个库无法处理密码/密码连接(Python PyBluez 连接到密码保护设备)。

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

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

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

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

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

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

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

谢谢你的帮助。

4

1 回答 1

15

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

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

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

当您发现要连接的设备时,您需要知道端口、地址和密码。使用该信息执行以下操作:

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

现在,您已连接!您可以将套接字用于您需要的任务:

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

官方 PyBlueZ 文档可在此处获得

于 2016-05-27T15:40:30.690 回答