#python #bluetooth #bluez #pybluez #hfp
#python #bluetooth #bluez #pybluez #hfp
Вопрос:
Я пытаюсь установить соединение уровня обслуживания HFP (Hands Free Profile), используя тестовый код python, предоставленный в репозитории bluez.
Для того, чтобы даже запустить, пример нуждался в некоторых модификациях:
- Исправьте устаревшую инструкцию import:
import glib
try:
from gi.repository import GObject
except ImportError:
import gobject as GObject
=>
from gi.repository import GLib as glib
- Измените объект mainloop:
mainloop = GObject.MainLoop()
=>
mainloop = glib.MainLoop()
- Отключите звук, поскольку он не имеет отношения к этому тесту:
audio_supported = False
- Кодировать команды, отправленные в байты:
os.write(self.fd, cmd "rn")
=>
os.write(self.fd, f"{cmd}rn".encode())
- Декодировать байты, полученные из буфера:
buf = buf.strip()
=>
buf = buf.decode('utf8').strip()
- Измените BDADDR_ANY на адрес телефона:
На этом этапе выполняется пример, для того чтобы на самом деле попытаться установить соединение, я добавил следующий код:
fd = os.open("test.log", os.O_RDWR)
profile.NewConnection(options.path, fd, opts)
В этот момент я получаю сообщение об ошибке от newConnection() в следующей строке: fd = fd.take()
Глядя на код, fd кажется простым файловым дескриптором, поэтому закомментирование этой строки помогает мне двигаться дальше.
Актуальная проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не получаю ответа от устройства после отправки начальной команды AT (строка 78 по ссылке выше). В соответствии со спецификацией Bluetooth HFP 1.8 предполагается, что это запустит процедуру подключения на уровне обслуживания. Я даже не уверен, что моя команда попадает на устройство.
Я также попробовал другой пример, который немного новее. Это устройство может открывать соединение RFCOMM через сокет (BluetoothSocket), но соединение продолжает сбрасываться. Это связано с тем, что функция _read_at() (строка 181) ничего не получает от устройства и истекает время ожидания.
Комментарии:
1. Этот пример BlueZ ожидает соединений с
NewConnection
методом, вызываемым bluetoothd. На каком оборудовании вы работаете? Если вы введетеbluetoothctl show
, уже ли активен плагин громкой связи Audio Gateway?2. Я использую доверенный Bluetooth-ключ ( TRU18187 ).
bluetoothctl show
действительно показывает UUID «Headset AG». По умолчанию я мог использовать свой компьютер в качестве гарнитуры, просто подключившись к нему. Может быть, мне нужно сначала как-то отключить это соединение? Я должен также упомянуть, что я использую Manjaro KDE в качестве своей операционной системы.