Raspberry Pi + Bluez + A2DP + AVRCP - PullRequest
       85

Raspberry Pi + Bluez + A2DP + AVRCP

0 голосов
/ 07 сентября 2018

В последние 2 дня я искал способ управления воспроизведением мультимедиа с моего iPhone через динамик Raspiberry pi без головы.

Я успешно настроил пи с помощью следующего урока: Потоковое аудио без поддержки A2DP на растяжке Raspbian и теперь я ищу способ управления воспроизведением аудиопотока с моего Raspberry Pi.

Я изучал MediaTransport1, MediaPlayer1, MediaControl1, но, к сожалению, мне не удалось.

, чтобы дать вам несколько примеров проб и ошибок, которые я выполнил:

для:

dbus-send --system --print-reply --dest=org.bluez /org/bluez/hci0/dev_C8_85_50_B1_C8_6B org.bluez.MediaPlayer1.Pause

я получил:

Error org.freedesktop.DBus.Error.UnknownMethod: Method "Pause" with signature "" on interface "org.bluez.MediaPlayer1" doesn't exist

для

qdbus --system org.bluez /org/bluez/hci0/dev_C8_85_50_B1_C8_6B/fd0 org.freedesktop.DBus.Properties.Set org.bluez.MediaTransport1 Volume 127

я получил

Error: org.freedesktop.DBus.Error.InvalidSignature
Invalid signature for 'Volume'

Кроме того, я нашел плеер, который, как я думал, мог бы использовать для создания собственного сценария в качестве примера Здесь , но у меня есть ошибка:

pi@raspberrypi:~/blueutils $ python simpleplayer.py


Available commands:
        PropertiesChanged(interface, properties)
        help(cmd)

Use python syntax to pass arguments to available methods.
E.g.: PropertiesChanged({'Metadata' : {'Title': 'My title',             'Album': 'my album' }})

>>> <Interface <ProxyObject wrapping <dbus._dbus.SystemBus (system) at 0xb61968d0> :1.13 /org/bluez/hci0 at 0xb619db70> implementing 'org.bluez.Media1' at 0xb619dc50>
Traceback (most recent call last):
  File "simpleplayer.py", line 197, in <module>
    media.RegisterPlayer(dbus.ObjectPath(path), player.properties)
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 70, in __call__
    return self._proxy_method(*args, **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 145, in __call__
    **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking
    message, timeout)
dbus.exceptions.DBusException: org.bluez.Error.NotSupported: Operation is not supported

когда я делаю самоанализ

dbus-send --system --print-reply --dest=org.bluez /org/bluez/hci0 org.freedesktop.DBus.Introspectable.Introspect

я получаю его:

<node>
    <interface name="org.freedesktop.DBus.Introspectable">
        <method name="Introspect">
            <arg name="xml" type="s" direction="out"/>
        </method>
    </interface>
    <interface name="org.bluez.Adapter1">
        <method name="StartDiscovery"></method>
        <method name="SetDiscoveryFilter">
            <arg name="properties" type="a{sv}" direction="in"/>
        </method>
        <method name="StopDiscovery"></method>
        <method name="RemoveDevice">
            <arg name="device" type="o" direction="in"/>
        </method>
        <property name="Address" type="s" access="read"></property>
        <property name="Name" type="s" access="read"></property>
        <property name="Alias" type="s" access="readwrite"></property>
        <property name="Class" type="u" access="read"></property>
        <property name="Powered" type="b" access="readwrite"></property>
        <property name="Discoverable" type="b" access="readwrite"></property>
        <property name="DiscoverableTimeout" type="u" access="readwrite"></property>]

        <property name="Pairable" type="b" access="readwrite"></property>
        <property name="PairableTimeout" type="u" access="readwrite"></property>
        <property name="Discovering" type="b" access="read"></property>
        <property name="UUIDs" type="as" access="read"></property>
        <property name="Modalias" type="s" access="read"></property>
    </interface>
    <interface name="org.freedesktop.DBus.Properties">
        <method name="Get">
            <arg name="interface" type="s" direction="in"/>
            <arg name="name" type="s" direction="in"/>
            <arg name="value" type="v" direction="out"/>
        </method>
        <method name="Set">
            <arg name="interface" type="s" direction="in"/>
            <arg name="name" type="s" direction="in"/>
            <arg name="value" type="v" direction="in"/>
        </method>
        <method name="GetAll">
            <arg name="interface" type="s" direction="in"/>
            <arg name="properties" type="a{sv}" direction="out"/>
        </method>
        <signal name="PropertiesChanged">
            <arg name="interface" type="s"/>
            <arg name="changed_properties" type="a{sv}"/>
            <arg name="invalidated_properties" type="as"/>
        </signal>
    </interface>
    <interface name="org.bluez.GattManager1">
        <method name="RegisterApplication">
            <arg name="application" type="o" direction="in"/>
            <arg name="options" type="a{sv}" direction="in"/>
        </method>
        <method name="UnregisterApplication">
            <arg name="application" type="o" direction="in"/>
        </method>
    </interface>
    <interface name="org.bluez.Media1">
        <method name="RegisterEndpoint">
            <arg name="endpoint" type="o" direction="in"/>
            <arg name="properties" type="a{sv}" direction="in"/>
        </method>
        <method name="UnregisterEndpoint">
            <arg name="endpoint" type="o" direction="in"/>
        </method>
        <method name="RegisterPlayer">
            <arg name="player" type="o" direction="in"/>
            <arg name="properties" type="a{sv}" direction="in"/>
        </method>
        <method name="UnregisterPlayer">
            <arg name="player" type="o" direction="in"/>
        </method>
    </interface>
    <node name="dev_40_9C_28_07_63_DD"/>
    <node name="dev_C8_85_50_B1_C8_6B"/>
</node>

Кто-нибудь может мне помочь разобраться в этой проблеме, или кто-нибудь знает процедуру управления воспроизведением музыки на телефоне с помощью Raspberry Pi?

Привет.

Обновление 1: Большое спасибо @Parthiban за то, что он отлично работает.

Кроме того, я должен сказать, что я переустановил версию bluez до 5.50, следуя инструкции здесь: Установите bluez на Raspberry Pi , так как я не смог увидеть / playerX (0 в моем случае ). Перед тем, как скомпилировать исходники, я сделал немного больше (не уверен, что это актуально, но это не больно), я добавил .auto_connect = true

профили avrcp, как указано:

Здесь

надеюсь, это поможет всем, кто может столкнуться с моей проблемой

1 Ответ

0 голосов
/ 07 сентября 2018

Вам нужно указать подпись, чтобы установить громкость, как показано ниже,

dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/org/bluez/hci0/dev_C8_85_50_B1_C8_6B/fd0' org.freedesktop.DBus.Properties.Set string:"org.bluez.MediaTransport1" string:"Volume" variant:uint16:127

Это потому, что, как указано в спецификации dbus , вам нужно указать три аргумента при использовании set,

  1. Имя интерфейса
  2. Название недвижимости
  3. Значение свойства как вариант

Для метода паузы исследуйте интерфейс "org.bluez.MediaPlayer1" вашего устройства, используя "org.freedesktop.DBus.Introspectable.Introspect". Путь к объекту, который вы использовали для доступа к методу «Пауза», неверен. Как указано здесь , вам необходимо использовать «[variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX».

Так что в вашем случае так и должно быть,

dbus-send --system --print-reply --type=method_call --dest='org.bluez' '/org/bluez/hci0/dev_C8_85_50_B1_C8_6B/playerX' org.bluez.MediaPlayer1.Pause

Там, где playerX должен быть заменен проигрывателем вашего устройства (вы можете получить это в Introspect или посмотреть на «InterfaceAdded» Сигнал.

...