Как установить соединение уровня обслуживания Bluetooth HFP

#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 в качестве своей операционной системы.