如何同时使用 A2DP 和 RFCOMM 协议?

问题描述

我想在 Android Studio 中开发一个应用程序,使用一个带有 Android Kit-Kat 4.4.4 的 HUAWEI T1-A21L,可以将音频流式传输到带有 Raspbian 的 Raspberry PI 3B+,还可以发送特定命令,因此 Raspberry 可以打开/关闭一个 LED 灯条并移动一个电机。

起初我设法使用 RFCOMM 蓝牙协议发送命令,然后我将 Raspberry 设置为 AD2P 接收器,但我无法让应用程序创建 A2DP 连接,我必须手动连接它之前执行应用程序。因此,当我使用该应用程序时,我无法发送命令,因为它使用的是 A2DP 协议而不是 RFCOMM。而且我已经看到您无法使用 A2DP 协议发送特定命令,它只能传输音频。

我以为可以用AVRCP协议,貌似和A2DP类似,但是功能更强大,于是找了一个python的例子,可以在树莓派上监听特殊命令,但是只能发送多媒体命令,如播放、恢复、暂停、下一首歌曲、上一首歌曲等。但是,无论何时按下屏幕上的一个特定按钮,都不允许发送“5”(例如)作为命令。而且我不知道如何在 Android Studio 中使用 AVRCP,例如 A2DP。

我在应用中使用的代码:

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.macro_layout);
        my_image= findViewById(R.id.my_image);
        paired= findViewById(R.id.paired);
        discover= findViewById(R.id.discover);
        on= findViewById(R.id.on);
        off= findViewById(R.id.off);
        my_text= findViewById(R.id.texto);
        lights = findViewById(R.id.luces);
        colores= findViewById(R.id.colores);
        pantalla= (ConstraintLayout) findViewById(R.id.pantalla);


      
        my_adapter= BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice pi = my_adapter.getRemoteDevice("B8:27:EB:9E:CB:A0");
        System.out.println("dispositive: " + pi.getName());


        try {
            if(!my_adapter.isEnabled()){
                my_adapter.enable();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        int counter = 0;
        do {
            try {
                btSocket = pi.createInsecureRfcommSocketToServiceRecord(mUUID);
                System.out.println("socket: "+btSocket);
                btSocket.connect();
                System.out.println("connected: " +btSocket.isConnected());
                outputStream = btSocket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            counter++;
        } while (!btSocket.isConnected() && counter < 3);



        if (my_adapter==null){
            Toast.makeText(MainActivity.this,"bluetooth not available",Toast.LENGTH_SHORT).show();
        }
        else{
            Toast.makeText(MainActivity.this,"bluetooth is available",Toast.LENGTH_SHORT).show();
        }

lights.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String valor="5";
                    int c = (int) valor.charAt(0);
                    System.out.println("I send 5");
                    System.out.println("in decimal: "+ c);
                    outputStream.write(c);

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });
}

还有我在树莓派上使用的代码:

import dbus,dbus.mainloop.glib,sys
from gi.repository import GLib

def on_property_changed(interface,changed,invalidated):
    if interface != 'org.bluez.MediaPlayer1':
        return
    for prop,value in changed.items():
        if prop == 'Status':
            print('Playback Status: {}'.format(value))
        elif prop == 'Track':
            print('Music Info:')
            for key in ('Title','Artist','Album'):
                print('   {}: {}'.format(key,value.get(key,'')))

def on_playback_control(fd,condition):
    str = fd.readline()
    if str.startswith('play'):
        player_iface.Play()
    elif str.startswith('pause'):
        player_iface.Pause()
    elif str.startswith('next'):
        player_iface.Next()
    elif str.startswith('prev'):
        player_iface.Previous()
    elif str.startswith('vol'):
        vol = int(str.split()[1])
        if vol not in range(0,128):
            print('Possible Values: 0-127')
            return True
        transport_prop_iface.Set(
                'org.bluez.MediaTransport1','Volume',dbus.UInt16(vol))
    return True

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()
    obj = bus.get_object('org.bluez',"/")
    mgr = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
    player_iface = None
    transport_prop_iface = None
    for path,ifaces in mgr.GetManagedObjects().items():
        if 'org.bluez.MediaPlayer1' in ifaces:
            player_iface = dbus.Interface(
                    bus.get_object('org.bluez',path),'org.bluez.MediaPlayer1')
        elif 'org.bluez.MediaTransport1' in ifaces:
            transport_prop_iface = dbus.Interface(
                    bus.get_object('org.bluez','org.freedesktop.DBus.Properties')
    if not player_iface:
        sys.exit('Error: Media Player not found.')
    if not transport_prop_iface:
        sys.exit('Error: DBus.Properties iface not found.')

    bus.add_signal_receiver(
            on_property_changed,bus_name='org.bluez',signal_name='PropertiesChanged',dbus_interface='org.freedesktop.DBus.Properties')
    GLib.io_add_watch(sys.stdin,GLib.IO_IN,on_playback_control)
    GLib.MainLoop().run()

我可以在同一个应用中实现 2 个蓝牙协议吗?所以我可以使用 RFCOMM 发送特定命令和 A2DP 来流式传输音频。如果可能,我该怎么做?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...