我有一个 raspberry pi 4 model b,运行 raspbian-lite 64 位,操作系统:Debian GNU/Linux 12 (bookworm) 和内核:Linux 6.6.20+rpt-rpi-v8。 我必须用 python 脚本控制树莓派的蓝牙。 该脚本必须能够启用/禁用蓝牙并重命名树莓派。
目前,我使用
os.system(f"sudo hostnamectl set-hostname '{name}'")
重命名设备,并使用 os.system(f"sudo systemctl restart bluetooth")
重新启动蓝牙。
这仅在某些时候有效,而且很多时候我必须在控制台中手动输入更多命令:
pi@One:~ $ bluetoothctl
[bluetooth]# discoverable on
[bluetooth]# exit
有没有更优雅的解决方案来做到这一点,也可能允许更多功能?
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 脚本能够与 RPi 的蓝牙守护程序进行通信。如果您以前没有使用过,这可能会有一个陡峭的学习曲线。
BlueZ 提供了使用 API 的示例:
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test
有各种可以提供帮助的 Python 库。主要列出在:
https://wiki.python.org/moin/DbusExamples
示例使用
dbus-python
库。但是,对于简单的脚本,我发现 pydbus
库更容易上手。
要安装
pydbus
库,您需要将以下内容安装到您的 venv 中:
pip install PyGObject
pip install pydbus
使用 Python 脚本切换
Discoverable
属性的示例:
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"