Управление Bluetooth Raspberry Pi с помощью скрипта Python

У меня 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

Есть ли более элегантное решение для этого, которое также может обеспечить большую функциональность?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Официальным стеком 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"

Другие вопросы по теме