问题描述
我想在 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 (将#修改为@)