コマンドラインからBluetoothデバイスに接続します


22

背景: Bluetoothヘッドセットをオーディオ出力として使用しています。BluetoothHeadsetコミュニティのドキュメントに記載されている長いリストによって機能するようになり、別の質問のおかげで、ヘッドセットをデフォルトのオーディオ出力としてスクリプトにアクティベートするプロセスを自動化しました。

ただし、携帯電話の電源を入れたときに電話が接続を「盗む」ことのないように、携帯電話とコンピューターの両方でBluetoothヘッドセットを使用します(ヘッドセットは2つの入力接続をサポートしません)。コンピューターに接続するときの検出モード(電話は自動的に接続します)。

そのため、ヘッドセットのペアリングは問題なく、「通常の」シナリオでは自動接続されますが、実際にデバイスに接続するには、通知領域にある小さなBluetoothアイコンを常に使用する必要があります(スクリーンショットを参照)。

避けたいこと:既知のペアリングされた Bluetoothデバイスに接続するためのこのGUI :

アイコンを使用してBluetoothヘッドセットに接続する

代わりに欲しいもの:コマンドラインを使用することによってのみ、GUIで接続項目をクリックするのとまったく同じようにbluetoothに実行させたいと思います。コマンドラインを使用してアクションのショートカットキーを1つ作成できるようにします。また、デバイスへの接続を確立するたびにGUIをナビゲートする必要はありません。

質問:コマンドラインから特定の既知のペアリングされた Bluetoothデバイスに接続するにはどうすればよいですか?

さらに質問:接続が成功したかどうかを確認するにはどうすればよいですか?


回答:


10

Bluetoothデーモン

デフォルトのインストールでは、デーモン(bluetoothd)がバックグラウンドで実行されます(ファイルから実行されます/etc/init.d/bluetooth)。このデーモンは、既知のbluetoothデバイスの認識と接続に注意を払い、の構成ファイルで構成できます/etc/bluetooth。ヘッドセットを自動接続するには、次の行のaudio.confコメントを解除する必要があります(削除#)。

AutoConnect=true

デーモンを再起動するには、と入力しsudo /etc/init.d/bluetooth restartます。

注:コマンドラインツールを使用してもsudo hcitool cc <MAC-Adress>、デーモンの実行中に、テスト環境で既知のデバイスに安定した接続ができませんでした。


DBus

切断されているが物理的に存在しペアリングされたヘッドセットを接続するには、スクリプトから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

devicePathもちろん、複数のBluetoothデバイスがある場合は、適切に適合させる必要があります。上記の例では、を接続しHeadsetます。他のサービス(たとえばAudioSink)のインターフェイスを別のプロトコルに変更します。


パルスオーディオ

BluetoothデバイスのMACアドレスがわかっている場合は、次の方法でpulseaudioの出力シンクとして接続できます。

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

ここで、xx_xx_xx_xx_xx_xxはMACアドレスです(pulseaudioで認識するには、「:」を「_」で置き換えます)。

詳細については、この回答も参照してください。


私は住所を知っていて、xxをそれに置き換えました。私は取得のみSink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.大文字と小文字の両方を試してみました。
イラリカジャステ

1
はい、pulseaudio-module-bluetoothはisntalleです。いいえ、一致するbtものblueはありませんpacmd list-sinks。(利用可能なシンクは1つだけであると報告されています。)
Ilari Kajaste

2
そのため、認識されません。これは、コマンドラインで接続できるようにするための前提条件です。BTを再起動するか、pulsaudioを再起動してください。私はまだそれが時々検出されない理由をまだ見つけていません。
Takkat

え?では、GUIからは接続できるが、CLIからは接続できない状態になるのでしょうか?
イラリカジャステ

1
@Takkatああ、そうですね。私の悪い!ディスカバリーでヘッドセットを使用しているため、自動接続されません。これを反映するように質問を編集しました。間違った道にあなたを導くために残念。
イラリカジャステ

6

このスクリプトを使用して、Bluetoothオーディオデバイスを接続します。ヘッドセットが既にペアリングされている場合、org.bluez.Audiosink.Connect / Disconnectの代わりにorg.bluez.Headset.Connect / Disconnectを使用して同じ方法でヘッドセットを接続できるはずです。

#!/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

HTH!


これも私のために働いた16.04、ありがとう!その他、onスクリプトにオプションを渡すことを忘れないでください!
ミナー

2

i3をウィンドウマネージャーとして使用しているため、Bluetoothトレイアイコンを使用できません。何らかの理由で、統一設定のチェックボタンは敏感ではないため、ヘッドフォンが接続されていないときに時々これを行う方法が必要です。

ここに画像の説明を入力してください

dbus APIbluez変更されたようです。利用する答えorg.bluez.Managerはもはや機能していないようです。代わりに、を使用することをお勧めしますObjectManager

これは、検出された最初の未接続のBluetoothヘッドセットを接続する更新されたpythonスクリプトです(おそらく、リストにはすべてのペアリングされたデバイスが含まれていますか?):

#!/usr/bin/env python
# Toggles headset connection

from __future__ import print_function
from __future__ import unicode_literals

import dbus
from dbus.mainloop.glib import DBusGMainLoop

def find_headset(bus):
  manager = dbus.Interface(bus.get_object("org.bluez", "/"),
                           "org.freedesktop.DBus.ObjectManager")
  objects = manager.GetManagedObjects()

  for path, ifaces in objects.items():
    if ("org.bluez.Device1" in ifaces and
        "org.freedesktop.DBus.Properties" in ifaces):
      iprops = dbus.Interface(
          bus.get_object("org.bluez", path),
          "org.freedesktop.DBus.Properties")
      props = iprops.GetAll("org.bluez.Device1")
      # Looking for a headset. Could also match on other properties like
      # "Name". See bluez docs for whats available.
      if props.get("Class") == 0x240404:
        if props.get("Connected"):
          print("Found headset {} ({}) but it is already connected"
                .format(props.get("Name"), props.get("Address")))
          continue
        return path

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
hpath = find_headset(bus)

if hpath:
  adapter = dbus.Interface(
      bus.get_object("org.bluez", hpath), "org.bluez.Device1")
  adapter.Connect()

この例は、このスレッドの他の例と同様に、dbuspythonパッケージを使用しています。ubuntu 16.04でこれをインストールしましたapt-get install python-dbus

他の基準に一致させたい場合、このドキュメントには、dbusでクエリできるプロパティのリストが表示されます。

このスクリプトは保存され~/.local/bin/bt-connect-headsetておりPATH、i3ランチャーから実行できます。chmod +x bt-connect-headsetコマンドとして使用する場合は、実行可能にします()。

このスクリプトは、2018年9月28日の最新のubuntu 16.04でのみテストされています。


1
Ubuntu 18.10でスクリプトを使用しました。ありがとう!
ブロムボム

1
スーパー、これはLinux Mint 19 Cinnamonでうまくいきました。ただし、の2360344代わりにのデバイスクラスを使用しました0x240404
dom_watson

1
Mint Xfce 19.2でそのように動作します。Xubuntuで動作すると確信しています。-Bluetoothを切断するスクリプトはどうですか?
cipricus

1
@cipricusそれは正しいことであり、すでに答えで言及されています。より高度なもの(特定の名前のデバイスのマッチングなど)が必要な場合に、他の基準にどのように一致するかについての回答のリンクがあります。このリンクには、このインターフェイスで使用できるメソッドのリストも含まれています。切断するために、私の推測ではDisconnect()メソッドを使用しています。私はそれを試していませんが、おそらく安全な賭けです;)。
cheshirekow

私は間違っていた。ペアリングされたデバイスのリストの最初を超えることは決してないと思いましたが、それはあります。また、あなたが言うという事実を見逃したかもしれませんfirst unconnected bluetooth headset :Bluetoothスピーカーのような他のデバイスの前に(リスト内の位置に関係なく)常にヘッドセット(電源が入っている場合)を使用しますか?それが私の場合に起こることです。-また、切断するために、最後の行をadapter.Disconnect()。に変更するだけではできません)
cipricus

1

上記のいくつかを試した後(スクリプトはうまくいきませんでした)、次の解決策を見つけました。

まず、接続したいデバイスのMACアドレスを見つけます

bluetoothctl

これによりシェルが開き、使用可能なすべてのデバイスがアドレス付きでリストされます。(「終了」してシェルを終了し、プロンプトに戻ります)

次に、XX:XX:XX:XX:XX:XX Bluetoothデバイスに接続します:

echo -e 'connect XX:XX:XX:XX:XX:XX' | bluetoothctl

切断する

echo -e 'disconnect XX:XX:XX:XX:XX:XX' | bluetoothctl

かなり長い間これを探していました-何も機能していないようで、私が見つけたときとても安心しました。他の人もそれについて知りたいと思うかもしれません。:))


回答を編集して、デバイスのアドレスを取得する方法を追加して、回答をより完全なものにできますか?
user3140225

1
@ user3140225がやった。
ジョセフ

私は得る~$ bluetoothctl Agent registered [UE BOOM 2]#。それからdisconnect "UE BOOM 2" Device UE BOOM 2 not available
cipricus

@cipricus @ user3140225の出力を投稿できます bluetoothctlか?デバイスのMACアドレスをコマンドに入力する必要があります。これは、XX:XX:XX:XX:XX:XXの形式のHEX値の組み合わせです。Xは文字または数字です。
ジョセフ

ここで言ったようにMACを見ることができます。次に、しようとecho -e 'connect CC:AF:78:AF:59:03' | bluetoothctl私が手に:Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
cipricus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.