从命令行连接到蓝牙设备

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 识别它)。

另请参阅此答案以获取更多详细信息。

  • 所以不被认可。这是能够通过命令行连接的先决条件。尝试重新启动 BT 或尝试重新启动 pulsaudio。我还没有发现为什么它有时没有被检测到。 (2认同)

Jos*_*eph 7

在尝试了上面的一些(脚本对我不起作用)之后,我找到了以下解决方案。

首先找出你要连接的设备的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)

哼!

  • 看起来不错,但遗憾的是,不起作用:$扬声器出现错误org.freedesktop.DBus.Error.UnknownMethod:接口“org.bluez.Manager”上带有签名“”的方法“DefaultAdapter”不存在正在连接到/dev_30_21_26_69_51_DE。 ..错误org.freedesktop.DBus.Error.UnknownObject:接口“org.bluez.AudioSink”上带有签名“”的方法“Connect”不存在 (2认同)