명령 줄에서 블루투스 장치에 연결


22

배경 : Bluetooth 헤드셋을 오디오 출력으로 사용하고 있습니다. BluetoothHeadset 커뮤니티 설명서 에 대한 긴 지침 목록 으로 작동하게했으며 다른 질문으로 인해 헤드셋을 스크립트의 기본 오디오 출력으로 활성화하는 프로세스를 자동화했습니다 .

그러나 핸드셋을 켰을 때 전화가 연결을 "훔치지"않기 위해 전화기와 컴퓨터에 블루투스 헤드셋을 사용하고 헤드셋이 두 개의 입력 연결을 지원하지 않기 때문에 헤드셋을 컴퓨터에 연결할 때 검색 모드 (전화기가 자동으로 연결됩니다).

따라서 헤드셋이 정상적으로 페어링되고 "정상적인"시나리오 자동 연결 인 경우에도 알림 영역에서 작은 블루투스 아이콘을 사용하여 실제로 내 장치에 연결해야합니다 (스크린 샷 참조).

피하고 싶은 것 : 알려진 페어링 된 블루투스 장치 에 연결하기위한이 GUI :

아이콘을 사용하여 블루투스 헤드셋에 연결

내가 대신 원하는 것 : GUI에서 연결 항목을 클릭하면 명령 줄을 사용하여 블루투스가 정확하게 수행하도록하고 싶습니다. 명령 줄을 사용하여 작업에 대한 단일 키 누르기 바로 가기를 만들 수 있으며 장치에 연결하려고 할 때마다 GUI를 탐색 할 필요가 없습니다.

질문 : 명령 줄에서 특정의 알려진 페어링 된 Bluetooth 장치에 어떻게 연결을 시도 할 수 있습니까?

추가 질문 : 연결이 성공했는지 어떻게 알 수 있습니까?


그 트레이 도구는 무엇입니까? Blueman Manager 트레이 아이콘입니까? Blueman 관리자 트레이 애플릿에 페어링 된 Bluetooth 장치가 나열되어야합니까?
cipricus

답변:


10

블루투스 데몬

기본 설치에서 데몬 ( 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 를 사용할 수 있습니다 . 다음은 파이썬의 예입니다.

#!/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에는 물론 적절하게 조정해야합니다 . 위의 예는을 연결합니다 Headset. 다른 서비스 (예 :)와 다른 인터페이스로 인터페이스를 변경하십시오 AudioSink.


펄스 오디오

Bluetooth 장치의 MAC 주소를 알고 있으면 다음을 통해 펄스 오디오의 출력 싱크로 연결할 수 있습니다.

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.대문자와 소문자 만 시도했습니다.
Ilari Kajaste

1
그렇습니다. pulseaudio-module-bluetooth는 그다지 중요하지 않습니다. 아니, 아무것도 매칭 bt이상이 blue나열됩니다 pacmd list-sinks. (그것은 단지 1 가능한 싱크보고합니다.)
Ilari Kajaste

2
인식되지 않습니다. 이것은 명령 행으로 연결할 수있는 전제 조건입니다. BT를 다시 시작하거나 pulsaudio를 다시 시작하십시오. 나는 왜 때때로 그것이 분리되지 않는지 알지 못했습니다.
Takkat

응? 따라서 GUI에서는 연결할 수 있지만 CLI에서는 연결할 수없는 상태에있을 수 있습니까?
Ilari Kajaste

1
@Takkat 오, 네, 좋은 지적입니다. 내 잘못이야! 검색시 헤드셋을 더 많이 사용하므로 자동 연결되지 않습니다. 이것을 반영하기 위해 질문을 편집했습니다. 잘못된 길로 안내해서 미안합니다.
Ilari Kajaste 2016 년

6

이 스크립트를 사용하여 Bluetooth 오디오 장치를 연결합니다. 헤드셋이 이미 페어링 경우 사용하는 것과 동일한 방법으로 헤드셋을 연결할 수 있어야합니다 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

HTH!


이것도 나를 위해 일했습니다 16.04. 감사합니다! 다른 사람들은 on옵션을 스크립트 에 전달하는 것을 잊지 마십시오 !
MInner

2

내가 사용 I3 내가 블루투스 트레이 아이콘을 사용할 수를하지 않아도 윈도우 매니저로. 어떤 이유로 단일 설정의 확인 버튼은 민감하지 않으므로 헤드폰이 연결되지 않을 때 마다이 작업을 수행 할 수있는 방법이 필요합니다.

여기에 이미지 설명을 입력하십시오

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 패키지를 사용합니다 . 우분투 16.04에서 이것을 통해 설치했습니다 apt-get install python-dbus.

다른 기준과 일치 시키려면 이 문서 에 dbus를 통해 쿼리 할 수있는 속성 목록이 표시됩니다.

내가 저장이 스크립트가 ~/.local/bin/bt-connect-headset있는 것은에 내 PATH그래서 나는 I3 런처에서 실행할 수 있습니다. chmod +x bt-connect-headset명령으로 사용하려면 실행 파일 ( )로 만드십시오 .

이 스크립트는 2018 년 9 월 28 일 현재 최신 우분투 16.04에서만 테스트되었습니다.


1
Ubuntu 18.10에서 스크립트를 사용했습니다. 감사!
Brombomb

1
Super, 이것은 Linux Mint 19 Cinnamon에서 나를 위해 일했습니다. 그러나 나는 2360344대신에 장치 클래스를 사용했습니다 0x240404.
dom_watson

1
Mint Xfce 19.2에서와 같이 작동합니다. 그것이 Xubuntu에서 작동한다고 확신합니다. -블루투스 연결을 끊는 스크립트는 어떻습니까?
cipricus

1
@cipricus 맞습니다. 이미 답변에 언급되어 있습니다. 특정 이름의 장치와 일치하는 것과 같이 고급 기능이 필요한 경우 다른 기준을 일치시키는 방법에 대한 링크가 있습니다. 이 링크에는이 인터페이스에서 사용 가능한 메소드 목록도 포함되어 있습니다. 연결을 끊으려면 Disconnect()방법을 사용하는 것 같습니다. 나는 그것을 시도하지 않았지만 아마도 안전한 내기 일 것이다.).
체셔 코우

내가 틀렸어. 페어링 된 장치 목록에서 처음을 넘어서는 것은 아니라고 생각했지만 실제로는 그렇지 않습니다. 나는 당신이 말하는 사실을 놓쳤을 수도 있습니다 first unconnected bluetooth headset : 블루투스 스피커와 같은 다른 장치보다 ( 헤드셋 의 위치에 관계없이) 항상 헤드셋 (전원이 켜진 경우)을 사용합니까? 그것이 제 경우에 일어나는 일입니다. -또한 연결을 끊으려면 마지막 줄을으로 변경하여 해결할 수 없습니다 adapter.Disconnect().)
cipricus

1

위의 일부를 시도한 후 (스크립트가 작동하지 않음) 다음 해결책을 찾았습니다.

먼저 연결하려는 장치의 MAC 주소를 찾으십시오.

bluetoothctl

이것은 쉘로 들어가서 주소가있는 사용 가능한 모든 장치를 나열합니다. (쉘을 종료하고 프롬프트로 돌아가려면 "종료")

그런 다음 XX : XX : XX : XX : XX : XX 블루투스 장치에 연결하십시오.

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? 의 출력을 게시 할 수 있습니까? XX : XX : XX : XX : XX : XX 형식의 HEX 값 조합 인 장치의 MAC 주소를 사용하여 명령을 제공해야합니다. 여기서 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.