【发布时间】:2022-02-25 20:00:08
【问题描述】:
我正在对 BLE 设备进行编程,因此需要从 org.freedesktop.DBus.Properties 接口获取一些信息,但无法从 dbus python API 获取它。从控制台这没问题。例如,从dbus-send我可以成功调用以下方法调用(当然是正确的mac地址):
$ dbus-send --system --dest=org.bluez --print-reply "/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX" org.freedesktop.DBus.Properties.Get string:'org.bluez.Device1' string:'Paired'
>> method return time=1645780543.222377 sender=:1.7 -> destination=:1.329 serial=1113 reply_serial=2
variant boolean true
现在,我要做的实际上是这样的:
import dbus
bus = dbus.SystemBus()
connected = bus.call_blocking(
'org.bluez', #bus_name
'/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX', #object_path
'org.freedesktop.DBus.Properties', #dbus_interface
'Get', #method
signature='(ss)', #signature
args=['org.bluez.Device1', 'Connected'], #args
)
print(connected)
这给了我错误:ERROR:dbus.connection:Unable to set arguments ['org.bluez.Device1', 'Paired'] according to signature '(ss)': <class 'TypeError'>: Fewer items found in struct's D-Bus signature than in Python arguments
我也试过没有签名但没有成功。而且我还发现了一个类似的问题here,但对于 C-API。所以我试图让它适应python dbus API,但仍然无法让它工作。此外,官方documentation 也不是很有帮助,因为这里没有关于参数机制如何工作的明确声明或对此类解释的引用。这很烦人,因为我可以通过这种方式从org.freedesktop.DBus.ObjectManager 接口调用例如GetManagedObjects 方法上的阻塞调用,但那当然不需要任何参数...
任何帮助表示赞赏。
【问题讨论】:
标签: python bluetooth-lowenergy dbus bluez