2017-01-07 3 views
1

Ich versuche mit meinem Raspberry Pi Bluetooth Audio für mein Auto einzurichten. Ich Musik streaming von meinem Telefon und 2 GPIO-Tasten eingerichtet, die DBus Nachrichten verwenden, um die Titel vor oder zurück zu bewegen. Ich hätte gerne einen Bildschirm, auf dem der aktuelle Song angezeigt wird, aber ich habe einen Haken.Ist es möglich, den dbus-Befehl "Get Properties" zu "überladen"?

Mit dbus kann ich diesen Befehl:

dbus-senden --system --type = method_call --print-Antwort --dest = org.bluez/org/bluez/hci0/dev_DC_41_5F_17_4C_79/player0 org.freedesktop.DBus.Properties.Get string: org.bluez.MediaPlayer1 string: Spur

, welche diese "Variante" gibt

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

Was ich möchte, ist zu tun haben, nur die Titel des Songs zurückgegeben werden. Ich habe versucht, das Wort "Title" anstelle von "Track" einzugeben und am Ende des Befehls "string: Title" einen weiteren Operator hinzuzufügen, in der Hoffnung, dass dadurch die Informationen eingegrenzt werden. Aber ich habe kein Glück.

Kann jemand etwas Licht darauf werfen, wie ich den Titel nur anzeigen könnte? Danke

Antwort

0

Ich bin mir nicht sicher, es gibt eine Möglichkeit, eine Variante außerhalb eines Programms zu lesen. Wenn nicht, müssen Sie ein kleines Programm erstellen, um zu erreichen, was Sie tun möchten.

Eine Variante ist ein Container, die Informationen, die Sie suchen, ist in dieser Variante. Ihre Variante ist vom Typ a {sv}, was bedeutet, dass es sich um ein Dictionary {Schlüssel, Wert} handelt, wobei die Schlüssel Zeichenfolge (n) sind und die Werte Varianten (v) sind.

Der folgende C-Code wird die Variante analysiert (die GLib GDBus api verwenden):

https://developer.gnome.org/glib/stable/glib-GVariant.html

und hier:

/* 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 */ 

Sie weitere Informationen über Varianten hier bekommen

https://developer.gnome.org/glib/stable/gvariant-format-strings.html

Wenn Sie sich über DBus und GDBus (die GLib-Bindungen für DBus) nicht im Klaren sind, können Sie mehr im folgenden Link lesen, suchen Sie nach der Low-Level- und High-Level-D-Bus-Unterstützung. In Ihrem Fall benötigen Sie GDBusConnection und GDBusProxy:

Erstellen Sie eine Verbindung zum Bus und erstellen Sie dann einen Proxy mit dem Namen, Pfad und Schnittstellennamen, den Sie in dbus-send verwendet haben. Dann benutze das Codebeispiel, das ich dir gegeben habe, um den Titel zu extrahieren.

https://developer.gnome.org/gio/stable/

Verwandte Themen