我正在尝试使用树莓派为我的汽车设置蓝牙音频。我从手机上播放音乐,并设置了2个GPIO按钮,使用DBus消息向前或向后移动曲目。我想在屏幕上播放当前的歌曲,但我遇到了一个障碍。
使用dbus,我可以发出以下命令:
dbus send--system--type=method_call--print reply--dest=org.bluez/org/bluez/hci0/dev_DC_41_5F_17_4C_79/player0 org.freedesktop.dbus.Properties.Get-string:org.bluez/MediaPlayer1 string:跟踪
返回此"变体">
variant array [
dict entry(
string "Item"
variant object path "/org/bluez/hci0/dev_DC_41_5F_17_4C_79/player0/NowPlaying/item751498629074736430"
)
dict entry(
string "Album"
variant string "Horse Of A Different Color"
)
dict entry(
string "TrackNumber"
variant uint32 1
)
dict entry(
string "Genre"
variant string "Country"
)
dict entry(
string "Duration"
variant uint32 173061
)
dict entry(
string "NumberOfTracks"
variant uint32 50
)
dict entry(
string "Title"
variant string "Drinkin' 'Bout You"
)
dict entry(
string "Artist"
variant string "Big & Rich"
)
]
我想做的是只归还歌曲的标题。我试着输入单词"Title"而不是"Track",还在命令"string:Title"的末尾添加了另一个运算符,希望它能缩小信息范围。但是我没有运气。
有人能告诉我如何只展示标题吗?感谢
我不确定是否有办法在程序之外读取变体。如果没有,你将需要建立一个小程序来实现你想要做的事情
变体是一个容器,你所寻求的信息就在这个变体中。您的变体类型为{sv},这意味着它是一个字典{key,value},其中键是字符串,值是变体(v)。
以下C代码将解析变体(使用GLib GDBus api):
/* Call the method that will return your variant dictionary */
GVariant *returnValue = MethodCallThatWillReturnTheDictionary();
/* This will be used to iterate through the dict */
GVariantIter *iter_dict;
/* These two will be used to store the key and value pair in the dict */
const gchar *key;
GVariant value;
/* Init the iterator */
g_variant_get(returnValue, "a{sv}", &iter_dict);
/* Iterate through the dict */
while(g_variant_iter_loop(iter_dict, "{&sv}", &key, &value)){
/* Each time we iterate, check if the key is "Title" */
if( ! strcmp(key, "Title")){
/* You now know that the Title is inside the "value" variant
We still have to extract it */
int title_length /* This will receive the Title length */
const gchar *yourTitle = g_variant_get_string(value, &title_length);
}
}
g_variant_iter_free(iter_dict); /* We don't need it anymore */
你可以在这里获得更多关于变体的信息:
https://developer.gnome.org/glib/stable/glib-GVariant.html
这里:
https://developer.gnome.org/glib/stable/gvariant-format-strings.html
如果您不确定DBus和GDBus(DBus的GLib绑定),可以在下面的链接中阅读更多内容,寻找低级别和高级别的D-Bus支持。在您的情况下,您需要GDBusConnection和GDBusProxy:
创建到总线的连接,然后使用dbus-send中使用的名称、路径和接口名称构建代理。然后使用我给你的代码示例来提取标题。
https://developer.gnome.org/gio/stable/