用Python脚本控制树莓派蓝牙

问题描述 投票:0回答:1

我有一个 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

有没有更优雅的解决方案来做到这一点,也可能允许更多功能?

python raspberry-pi bluetooth raspberry-pi4
1个回答
0
投票

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"
© www.soinside.com 2019 - 2024. All rights reserved.