2017-01-07 54 views
1

我想用我的覆盆子pi为我的车设置蓝牙音频。我从我的手机播放音乐,并设置了2个GPIO按钮,它们使用DBus消息向前或向后移动曲目。我想要一个显示当前歌曲播放的屏幕,但我遇到了麻烦。是否有可能“超载”dbus获取属性命令?

使用DBUS我可以发出此命令:

的dbus-发送--system --type = method_call --print回复--dest = org.bluez /组织/ bluez的/ hci0/dev_DC_41_5F_17_4C_79/player0 org.freedesktop.DBus.Properties.Get字符串:org.bluez.MediaPlayer1字符串:跟踪

它返回这个 “变异体”

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" 
    ) 
    ] 

我想什么做的是只歌曲的标题将被退回。我尝试输入“标题”而不是“轨道”,还在命令'string:Title'的末尾添加了另一个运算符,希望它能缩小信息范围。但我没有运气。

任何人都可以阐明我如何去显示标题吗? 谢谢

回答

0

我不确定有一种方法可以读取程序外的变体。如果没有,你需要建立一个小程序来实现你想要做的事情。

变体是一个容器,你寻求的信息是在这个变体中。你的变体的类型是{sv},这意味着它是一个字典{键,值},其中键是字符串,值是变体(v)。

下面的代码将解析变种(使用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/

相关问题