У меня Raspberry Pi 4 Model B под управлением 64-разрядной версии Raspberry Pi OS Lite с
Операционная система: Debian GNU/Linux 12 (Книжный червь)
Ядро: Linux 6.6.20+rpt-rpi-v8.
Мне нужно управлять Bluetooth Raspberry с помощью скрипта Python.
Скрипт должен иметь возможность включать/отключать Bluetooth и переименовывать Raspberry Pi.
Мне нужно автоматически изменить имя Bluetooth на лету, поскольку имя Bluetooth должно соответствовать подключенным устройствам, которые можно заменять в горячем режиме.
В настоящее время я использую os.system(f"sudo hostnamectl set-hostname '{name}'")
для переименования устройства и os.system(f"sudo systemctl restart bluetooth")
для перезапуска Bluetooth.
Это работает лишь в некоторых случаях, и часто мне приходится вручную вводить дополнительные команды в консоль:
pi@One:~ $ bluetoothctl
[bluetooth]# discoverable on
[bluetooth]# exit
Есть ли более элегантное решение для этого, которое также может обеспечить большую функциональность?
Официальным стеком Bluetooth в Linux является BlueZ, у которого есть API, который он предоставляет и который документирован по адресу:
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc
Похоже, вы хотите изменить настройки адаптера, поэтому эти команды и свойства описаны по адресу:
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/org.bluez.Adapter.rst
BlueZ API использует привязки Linux D-Bus, чтобы скрипт Python мог взаимодействовать с демоном Bluetooth RPi. Это может потребовать сложного обучения, если вы не использовали его раньше.
BlueZ предоставляет примеры использования API по адресу:
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test
Существуют различные библиотеки Python, которые могут помочь. Основные из них перечислены по адресу:
https://wiki.python.org/moin/DbusExamples
В примерах BlueZ используется библиотека dbus-python
. Однако для простых скриптов мне проще начать с библиотеки pydbus
.
Чтобы установить библиотеку pydbus
, вам необходимо установить на свой venv следующее:
pip install PyGObject
pip install pydbus
Пример того, как будет выглядеть переключение свойства Discoverable
с помощью скрипта Python:
import pydbus
bus_name = 'org.bluez'
sys_bus = pydbus.SystemBus()
dongle = sys_bus.get(bus_name, '/org/bluez/hci0')
print(dongle.Alias, dongle.Name)
print(dongle.Discoverable)
if dongle.Discoverable:
dongle.Discoverable = False
else:
dongle.Discoverable = True
print(dongle.Discoverable)
Чтобы узнать иерархию того, где BlueZ ищет имя устройства, посмотрите файл /etc/bluetooth/main.conf
для получения дополнительной информации.
В сценарии Python адаптер Name
доступен только для чтения, а адаптер Alias
— для чтения и записи. Часто достаточно изменить псевдоним, в зависимости от того, что вы хотите сделать. Примером этого является:
dongle.Alias = "MyNewName"