简体   繁体   English

在 python 中将蓝牙设备与密钥/密码配对 - RFCOMM (Linux)

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

I am working on a Python script to search for bluetooth devices and connect them using RFCOMM .我正在研究 Python 脚本来搜索蓝牙设备并使用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 ).我正在使用 PyBlueZ,据我所知,该库无法处理密码/密码连接( Python PyBluez 连接到密码保护设备)。

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)' .我收到错误'Device or resource busy (16)'

I tried some bash commands using the hcitool and bluetooth-agent , but I need to do the connection programmatically.我使用hcitoolbluetooth-agent尝试了一些 bash 命令,但我需要以编程方式进行连接。 I was able to connect to my device using the steps described here: How to pair a bluetooth device from command line on Linux .我能够使用此处描述的步骤连接到我的设备: 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.我想问一下是否有人使用 Python 通过密码/密码连接到蓝牙设备。我正在考虑使用 subprocess.call subprocess.call()在 Python 中使用 bash 命令,但我不确定这是否是个好主意。

Thanks for any help.谢谢你的帮助。

Finally I am able to connect to a device using PyBlueZ. 最后,我能够使用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 官方PyBlueZ文档可在此处获得

Is there a way to connect two phones via Bluetooth, the script should be running on a Linux host.有没有办法通过蓝牙连接两部手机,脚本应该在 Linux 主机上运行。 Any suggestions of using pybluez or any other APIs?使用 pybluez 或任何其他 API 的任何建议?

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.我已经看到一些示例,其中 Linux 主机用作客户端并连接手机(这是服务器),但在这里我想使用 Linux 主机作为运行脚本并使两部手机通过蓝牙连接的设备.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM