我正在尝试在 Ubuntu Desktop 23.10 中使用 DBus 调用 BLE 设备。
这是bluez中设备的DBus定义:
user@machine-desktop:~$ sudo busctl introspect org.bluez /org/bluez/hci0/dev_00_12_05_FF_13_A0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.bluez.Device1 interface - - -
.CancelPairing method - - -
.Connect method - - -
.ConnectProfile method s - -
.Disconnect method - - -
.DisconnectProfile method s - -
.Pair method - - -
.Adapter property o "/org/bluez/hci0" emits-change
.Address property s "00:1C:05:FF:13:A0" emits-change
.AddressType property s "public" emits-change
.Alias property s "Nonin3230_502726737" emits-change writable
.Appearance property q 3137 emits-change
.Blocked property b false emits-change writable
.Bonded property b true emits-change
.Class property u - emits-change
.Connected property b false emits-change
.Icon property s - emits-change
.LegacyPairing property b false emits-change
.ManufacturerData property a{qv} - emits-change
.Modalias property s - emits-change
.Name property s "Nonin3230_502726737" emits-change
.Paired property b true emits-change
.RSSI property n - emits-change
.ServiceData property a{sv} - emits-change
.ServicesResolved property b false emits-change
.Sets property a{oa{sv}} - emits-change
.Trusted property b true emits-change writable
.TxPower property n - emits-change
.UUIDs property as 6 "00001800-0000-1000-8000-00805f9b34fb… emits-change
.WakeAllowed property b - emits-change writable
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
我正在尝试使用 : 获取 ServiceData
属性值user@machine-desktop:~$ dbus-send --system --dest=org.bluez --print-reply /org/bluez/hci0/dev_00_1C_05_FF_13_A0 org.freedesktop.DBus.Properties.Get string:org.bluez.Device1 string:ServiceData
Error org.freedesktop.DBus.Error.InvalidArgs: No such property 'ServiceData'
我不应该能够调用属性并获取值吗?
问候。
编辑:忘记说 archis arm64。树莓派 4b
浏览 BlueZ 源代码 (src/device.c) 后,似乎当相应的结构字段为 null 时,该服务会报告属性不存在。
它们在静态定义的“内省”XML 中保持可见,但 BlueZ 有自己的 Get() 方法处理程序,如果字段为 null,它将“手动”返回 D-Bus 错误。
(这样做的原因很可能是因为 D-Bus 既没有可为 null 的类型,也没有“可能”的类型,因此 BlueZ 开发人员可能希望避免在使用 null 属性时返回
0
或 ""
时可能发生的混乱。又空了?)
因此,您似乎应该考虑预期的错误并在代码中处理它 - 或者,使用 GetAll() 获取包含“存在”的所有属性的字典。