Ila*_*ste 25 command-line bluetooth
背景:我使用我的蓝牙耳机作为音频输出。我设法通过BluetoothHeadset 社区文档上的一长串说明使其工作,并且由于另一个问题,我已经自动将耳机作为默认音频输出激活到脚本中的过程。
但是,由于我将蓝牙耳机与手机和电脑(并且耳机不支持两个输入连接)一起使用,以便手机在打开听筒时不会“窃取”连接,因此我将耳机强制插入连接到计算机时的发现模式(手机会自动连接到它)。
因此,即使耳机配对正常并且会在“正常”情况下自动连接,我也必须始终使用通知区域中的小蓝牙图标来实际连接到我的设备(见截图)。
我想避免的是:这个用于连接到已知和配对蓝牙设备的GUI :

我想要的是:我想让蓝牙完全按照在 GUI 中单击连接项的方式执行,只需使用命令行即可。我想使用命令行,因此我可以为该操作创建一个按键快捷方式,并且每次我想与设备建立连接时都不需要导航 GUI。
问题:如何尝试从命令行连接到特定的、已知的和配对的蓝牙设备?
进一步的问题:如何判断连接是否成功?
Tak*_*kat 11
在默认安装中,守护进程(bluetoothd)在后台运行(从文件运行/etc/init.d/bluetooth)。这个守护进程负责识别和连接已知的蓝牙设备,并且可以与/etc/bluetooth. 对于自动连接耳机,audio.conf应取消注释以下行(删除#):
AutoConnect=true
Run Code Online (Sandbox Code Playgroud)
重新启动守护进程类型sudo /etc/init.d/bluetooth restart。
备注:sudo hcitool cc <MAC-Adress>当守护进程运行时,使用命令行工具无法稳定连接到测试环境中的已知设备。
为了连接断开连接但实际存在且已配对的耳机,我们可以使用脚本中的D-Bus。这是python中的一个例子:
#!/usr/bin/python
# Toggles headset connection
import dbus
from dbus.mainloop.glib import DBusGMainLoop
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
#Get dbus interface for headset
manager = bus.get_object('org.bluez', '/')
iface_m = dbus.Interface(manager, 'org.bluez.Manager')
adapterPath = iface_m.DefaultAdapter()
adapter = bus.get_object('org.bluez', adapterPath)
iface_a = dbus.Interface(adapter, 'org.bluez.Adapter')
devicePath = iface_a.ListDevices()[0] # assuming first device
device = bus.get_object('org.bluez', devicePath)
iface_h = dbus.Interface(device, 'org.bluez.Headset')
#Check state of connection
connected = iface_h.IsConnected()
print 'Toggling connection. Please wait'
# toggle connection
if not connected:
try:
iface_h.Connect()
print 'Connecting: ', devicePath
except:
print 'Device not found'
else:
iface_h.Disconnect()
print 'Disconnecting: ', devicePath
Run Code Online (Sandbox Code Playgroud)
当然,如果我们有多个蓝牙设备,我们将不得不进行devicePath适当的调整。上面的例子将连接一个Headset. 对于任何其他服务(例如AudioSink),将接口更改为不同的协议。
如果您知道蓝牙设备的 MAC 地址,您可以通过以下方式将其连接为pulseaudio的输出接收器:
pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx
Run Code Online (Sandbox Code Playgroud)
其中 xx_xx_xx_xx_xx_xx 是 MAC 地址(将 ':' 替换为 '_' 以便pulseaudio 识别它)。
另请参阅此答案以获取更多详细信息。
在尝试了上面的一些(脚本对我不起作用)之后,我找到了以下解决方案。
首先找出你要连接的设备的MAC地址
bluetoothctl
Run Code Online (Sandbox Code Playgroud)
这将进入一个 shell 并列出所有可用的设备地址。(“退出”退出外壳并返回提示)
然后连接到 XX:XX:XX:XX:XX:XX 蓝牙设备:
echo -e 'connect XX:XX:XX:XX:XX:XX' | bluetoothctl
Run Code Online (Sandbox Code Playgroud)
断开连接
echo -e 'disconnect XX:XX:XX:XX:XX:XX' | bluetoothctl
Run Code Online (Sandbox Code Playgroud)
一直在寻找这个 - 似乎没有任何效果,当我发现时感到如释重负。认为其他人可能也想知道它。:))
小智 6
我使用这个脚本来连接我的蓝牙音频设备。如果您的耳机已经配对,你应该能够将耳机连接使用相同的方式org.bluez.Headset.Connect /断开代替org.bluez.Audiosink.Connect /断开。
#!/bin/bash
MAC_ADD="C8:84:47:10:11:CD"
MAC_ADD="dev_${MAC_ADD//:/_}"
BT_ADAPTER=`dbus-send --system --print-reply --dest=org.bluez / \
org.bluez.Manager.DefaultAdapter|awk '/object path/ {print $3}'`
BT_ADAPTER="${BT_ADAPTER//\"/}/$MAC_ADD"
echo "Connecting to $BT_ADAPTER..."
if [ "$1" == "on" ]; then
dbus-send --print-reply --system --dest=org.bluez $BT_ADAPTER org.bluez.AudioSink.Connect
elif [ "$1" == "off" ]; then
dbus-send --print-reply --system --dest=org.bluez $BT_ADAPTER org.bluez.AudioSink.Disconnect
fi
Run Code Online (Sandbox Code Playgroud)
哼!