2016-05-26 6 views
3

Я работаю над скриптом Python для поиска устройств Bluetooth и подключаю их с помощью RFCOMM. Эти устройства имеют пароль/пароль. Я использую PyBlueZ и, насколько мне известно, эта библиотека не может обрабатывать соединения с паролем/паролем (Python PyBluez connecting to passkey protected device).Сопряжение устройств bluetooth с паролем/паролем в python - RFCOMM (Linux)

Я могу обнаружить устройства и получить их имена и адреса:

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)'.

Я попробовал некоторые команды Баш с помощью hcitool и Bluetooth-агент, но мне нужно сделать подключение программно. Я смог подключиться к своему устройству, используя описанные здесь шаги: How to pair a bluetooth device from command line on Linux.

Я хочу спросить, подключен ли кто-то к устройству Bluetooth с помощью пароля/пароля с помощью Python. Я собираюсь использовать команды bash в Python, используя subprocess.call(), но я не уверен, что это хорошая идея.

Спасибо за любую помощь.

ответ

5

Наконец, я могу подключиться к устройству с использованием 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 документации доступна here

Смежные вопросы