2017-01-07 25 views
1

Я пытаюсь настроить звук bluetooth для своего автомобиля, используя мой малиновый пи. I музыка, передаваемая с моего телефона, и две кнопки 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 строка: Track

который возвращает этот "вариант"

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

Я не уверен, что есть способ прочитать вариант вне программы. Если нет, вам нужно будет создать небольшую программу для достижения того, что вы хотите сделать.

Вариант - это контейнер, информация, которую вы ищете, находится внутри этого варианта. Ваш вариант имеет тип a {sv}, что означает, что это dictionnary {key, value}, где ключи являются строками, а значения - вариантами (v).

Следующий код C будет разбирать вариант (с использованием API GLib GDBus):

/* 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 (привязки GLib для DBus), вы можете прочитать больше в приведенной ниже ссылке, найти поддержку D-Bus на низком уровне и высоком уровне. В вашем случае вам понадобятся GDBusConnection и GDBusProxy:

Создайте соединение с шиной, затем создайте прокси-сервер, используя имя, путь и имя интерфейса, которые вы использовали в dbus-send. Затем используйте пример кода, который я вам предоставил, чтобы извлечь Title.

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

 Смежные вопросы

  • Нет связанных вопросов^_^