Raspberry pi 覆盆子皮&x2B;Bluez+;A2DP和x2B;AVRCP

Raspberry pi 覆盆子皮&x2B;Bluez+;A2DP和x2B;AVRCP,raspberry-pi,dbus,a2dp,avrcp,mediaplayback,Raspberry Pi,Dbus,A2dp,Avrcp,Mediaplayback,在过去的两天里,我一直在谷歌上寻找一种方法,通过我的Raspiberry pi无头扬声器控制iPhone的媒体播放 我已使用以下教程成功设置pi: 现在我正在寻找一种方法来控制我的raspberry pi中音频流的播放 我一直在研究MediaTransport1、MediaPlayer1和MediaControl1,但不幸的是我没有成功 给你举几个我所做的尝试和错误的例子: 用于: 我收到: Error org.freedesktop.DBus.Error.UnknownMethod: Meth

在过去的两天里,我一直在谷歌上寻找一种方法,通过我的Raspiberry pi无头扬声器控制iPhone的媒体播放

我已使用以下教程成功设置pi: 现在我正在寻找一种方法来控制我的raspberry pi中音频流的播放

我一直在研究MediaTransport1、MediaPlayer1和MediaControl1,但不幸的是我没有成功

给你举几个我所做的尝试和错误的例子:

用于:

我收到:

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

我收到

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
我得到他的:

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

因为我无法看到/playerX(在我的例子中为0)。在编译源代码之前,我做了一点额外的工作(不确定它是否相关,但它不会造成伤害),我添加了
.auto\u connect=true

avrcp配置文件如下所示:


希望这能帮助所有可能面临我的问题的人

您需要指定签名来设置音量,如下所示

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
这是因为,如中所述,在使用set时需要指定三个参数

  • 接口名
  • 属性名
  • 属性值作为变量
  • 对于暂停方法,请使用“
    org.freedesktop.DBus.Introspectable.Introspect
    ”浏览设备的“
    org.bluez.MediaPlayer1
    ”界面。用于访问“暂停”方法的对象路径错误。如上所述,您需要使用“
    [变量前缀]/{hci0,hci1,…}/dev_XX_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需要被你的设备播放器替换的地方(你可以通过内省或观看“InterfaceEded”来获得)信号。

    谢谢您的回答,Pause命令可以找到,但是当我尝试设置卷级别时,我得到以下错误:
    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字符串:“org.bluez.MediaTransport1”字符串:“卷”uint16:127“”错误org.freedesktop.DBus.Error.UnknownMethod:接口“org.freedesktop.DBus.Properties”上签名为“ssq”的方法“Set”不存在
    @ady_e_n:我不确定为什么“Set”方法在这里不可用。请检查对象路径/org/bluez/hci0/dev_C8_85_50_B1_C8_6B/fd0中的“内省”。如果不存在,请尝试使用“/org/bluez/hci0/dev_C8_85_50_B1_C8_6B"。我不确定MediaTransport接口的层次结构是如何组织的。我已经这样做了:方法将位于那里:
    它只返回一个error@ady_e_n:明白了:试试这个
    dbus发送--system--print reply--type=method_调用--dest='org.bluez'/org/bluez/hci0/dev_C8_85_50_B1_C8_6B/fd0'org.freedesktop.dbus.Properties。设置字符串:“org.bluez.MediaTransport1”字符串:“Volume”变量:uint16:127!
    
    <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>
    
    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-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