Komut satırından bluetooth cihazına bağlan


22

Arka plan: Bluetooth kulaklığımı ses çıkışı olarak kullanıyorum. BluetoothHeadset topluluğu belgelerine ilişkin uzun talimatlar listesiyle çalışmayı başardım ve başka bir soru sayesinde kulaklığı varsayılan ses çıkışı olarak etkinleştirme işlemini otomatikleştirdim .

Ancak, telefonun açık olduğu sırada telefonun bağlantısını "çalmaması" için, kulaklıklı mikrofon setimi hem telefonum hem de bilgisayarımla kullandığımdan (ve kulaklıklı mikrofon seti iki giriş bağlantısını desteklemediğinden) kullandığım için bilgisayara bağlanırken keşif modu (telefon otomatik olarak bağlanır).

Bu yüzden kulaklıklı mikrofon seti eşleştirilmiş olsa ve "normal" senaryo otomatik bağlantıda olsa bile, cihazıma bağlanmak için her zaman bildirim alanındaki küçük bluetooth simgesini kullanmam gerekir (ekran görüntüsüne bakın).

Kaçınılması gerekenler: Bilinen ve eşleştirilmiş bir bluetooth cihazına bağlanmak için bu GUI :

Simgesini kullanarak Bluetooth kulaklığa bağlama

Onun yerine ne istersem: Bluetooth'un GUI'deki connect öğesine tıklayarak sadece komut satırını kullanarak tam olarak yapmasını istiyorum. Komut satırı kullanmak istiyorum, böylece işlem için tek bir tuş basma kısayolu oluşturabilirim ve cihazla bağlantı kurmak istediğimde GUI'de gezinmek zorunda kalmayacağım.

Soru: Belirli, bilinen ve eşleştirilmiş bir bluetooth cihazına komut satırından nasıl bağlanmaya çalışabilirim ?

Daha fazla soru: Bağlantının başarılı olup olmadığını nasıl anlarım?


Yanıtlar:


10

Bluetooth arka plan programı

Varsayılan kurulumda arka planda bir daemon ( bluetoothd ) çalışıyor (dosyadan çalıştırılıyor /etc/init.d/bluetooth). Bu arka plan programı bilinen bluetooth cihazlarını tanımaya ve bunlara bağlanmaya özen gösterir ve içindeki yapılandırma dosyalarıyla birlikte yapılandırılabilir /etc/bluetooth. Bir kulaklıklı mikrofon setinin otomatik bağlanması için şu satırdakiler audio.confgirilmemelidir (kaldır #):

AutoConnect=true

Daemon tipini yeniden başlatmak için sudo /etc/init.d/bluetooth restart.

Not: Komut satırı aracını kullanmak sudo hcitool cc <MAC-Adress>, arka plandaki program çalışırken, test ortamında bilinen bir cihazla sağlam bir bağlantıya yol açmadı.


DBus

Bağlantısız fakat fiziksel olarak mevcut ve eşleştirilmiş bir kulaklığı bağlamak için D-Bus'ı bir komut dosyasından kullanabiliriz. İşte python'da bir örnek:

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

Birden fazla Bluetooth cihazımız olması devicePathdurumunda elbette uygun şekilde uyarlamamız gerekecektir . Yukarıdaki örnek a Headset. Arabirimi başka bir hizmet için farklı bir protokolle değiştirin (örn. AudioSink).


Pulseaudio

Bluetooth cihazınızın MAC adresini biliyorsanız, aşağıdakileri yaparak pulseaudio için bir çıkış havuzu olarak bağlayabilirsiniz:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Burada xx_xx_xx_xx_xx_xx MAC adresidir (pulseaudio'nun onu tanıması için ':' yerine '_' yazınız).

Daha fazla bilgi için bu cevaba bakınız.


Adresi biliyorum ve onunla xx'i değiştirdim. Sadece Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.hem büyük hem de küçük harfleri denedim.
Ilari Kajaste

1
Evet, pulseaudio modülü-bluetooth isntalleşti. Hayır, eşleşen bir şey yok btveya bluelistede yok pacmd list-sinks. (Sadece 1 lavabo olduğunu bildiriyor.)
Ilari Kajaste

2
Yani tanınmadı. Bu, komut satırına bağlanabilmek için bir önkoşuldur. BT'yi yeniden başlatmayı veya pulsaudio'yu yeniden başlatmayı deneyin. Neden bazen algılanmadığını henüz anlamadım.
Takkat

Ha? Öyleyse, GUI'den bağlanmanın mümkün olduğu bir durumda olabilir, ancak CLI'den değil?
Ilari Kajaste

1
@Takkat Oh, evet, iyi nokta. Benim hatam! Kulaklığı daha fazla keşfediyorum, bu yüzden otomatik olarak bağlanmayacak. Bunu yansıtması için soruyu değiştirdim. Seni yanlış yola yönlendirdiğim için üzgünüm.
Ilari Kajaste

6

Bluetooth Ses Cihazımı bağlamak için bu betiği kullanıyorum. Senin kulaklık zaten eşlenirse, kullandığınız aynı şekilde kulaklığı bağlamak gerekir org.bluez.Headset.Connect / Bağlantıyı kes yerine org.bluez.Audiosink.Connect / kes .

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


Bu da benim için çalıştı 16.04, teşekkür ederim! diğerleri, onsenaryoya seçeneği iletmeyi unutmayın !
Minner

2

İ3'ü pencere yöneticisi olarak kullanıyorum , bu yüzden mevcut bluetooth tepsisi simgesi yok. Nedense birlik ayarlarındaki kontrol butonu hassas değildir ve bu yüzden kulaklıklarım bağlanmadığında zaman zaman bunu yapmak için bir yol bulmalıyım.

görüntü tanımını buraya girin

O görünüyor bluezetmiştir onların dbus API değiştirdi . Kullanan cevap org.bluez.Managerartık işe görünmüyor. Bunun yerine kullanılması tavsiye edilir ObjectManager.

İşte bulduğu ilk bağlanmamış bluetooth kulaklığını bağlayacak güncellenmiş bir python betiği (muhtemelen liste tüm eşleştirilmiş aygıtları içeriyor mu?):

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

bu örnek, bu konudaki diğer örnek gibi dbuspython paketini kullanır . Ubuntu'da 16.04'te bunu yükledim apt-get install python-dbus.

Diğer kriterleri eşleştirmek istiyorsanız, bu belge dbus üzerinden sorgulanabilecek özelliklerin bir listesini gösteriyor gibi görünüyor.

Ben kaydedilen bu komut dosyası var ~/.local/bin/bt-connect-headsethangi is my PATHyüzden i3 başlatıcıdan çalıştırmak. chmod +x bt-connect-headsetBir komut olarak kullanmayı planlıyorsanız, çalıştırılabilir ( ) yapın .

Bu komut sadece 09.08.2018 tarihinden itibaren 16.04 tarih ve 16.04 tarihinde test edilmiştir.


1
Komut dosyanızı Ubuntu 18.10'da kullandı. Teşekkürler!
Brombomb

1
Süper, bu benim için Linux Mint 19 Cinnamon'te işe yaradı. Ancak, 2360344bunun yerine bir aygıt sınıfı kullandım 0x240404.
dom_watson

1
Mint Xfce 19.2'de olduğu gibi çalışır. Eminim Xubuntu'da çalışır. - Bluetooth bağlantısını kesmek için bir komut dosyası ne olacak?
cipricus

1
@cipricus Bu doğru ve cevapta zaten belirtilmiş. Daha gelişmiş bir şeye ihtiyacınız varsa (belirli bir isimdeki cihazı eşleştirmek gibi) cevabında diğer kriterleri nasıl eşleştireceğinize dair bir link var. Bu bağlantı aynı zamanda bu arayüzde mevcut olan yöntemlerin bir listesini içerir. Bağlantıyı kesmek için benim tahminim Disconnect()yöntemi kullanmak . Denemedim, ama muhtemelen güvenli bir bahis;).
cheshirekow

Ben hatalıydım. Eşleşmiş cihazlar listesindeki hiçbir zaman birincinin ötesine geçmeyeceğini düşünmüştüm ama öyle. Ayrıca şunu söylemenizi de özlemiş olabilirim first unconnected bluetooth headset : her zaman kulaklığı bluetooth hoparlörü gibi diğer cihazlardan önce mi kullanır (listedeki konumu ne olursa olsun)? Benim durumumda olan budur. - Ayrıca, bağlantıyı kesmek için sadece son satırı değiştirerek adapter.Disconnect()
yapamam

1

Yukarıdakilerin bazılarını denedikten sonra (scriptler benim için işe yaramadı) aşağıdaki çözümü buldum.

Öncelikle bağlanmak istediğiniz cihazın MAC Adresini öğrenin.

bluetoothctl

bu, bir kabuk girecek ve adresin mevcut tüm cihazları listeleyecektir. (Kabuktan çıkmak ve isteme geri dönmek için "çık")

Ardından XX: XX: XX: XX: XX: XX bluetooth cihazına bağlanın:

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

bağlantıyı kesmek için

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

Uzun zamandır bunu araştırıyordum - hiçbir şey işe yaramadı, öğrendiğimde çok rahatlamıştı. Başkalarının da bilmek isteyebileceğini düşündüm. :))


Yanıtınızı daha eksiksiz olması için cihazın adresini nasıl alacağınızı eklemek için cevabınızı düzenleyebilir misiniz?
user3140225

1
@ user3140225 az önce yaptı.
Joseph,

Ben olsun ~$ bluetoothctl Agent registered [UE BOOM 2]#. Öyleyse disconnect "UE BOOM 2" Device UE BOOM 2 not available.
cipricus

@cipricus @ user3140225 çıktısını gönderir misiniz bluetoothctl? Komutları cihazın MAC adresi ile beslemeniz gerekir - bu, XX: XX: XX: XX: XX: XX: XX formatındaki HEX Değerlerinin birleşimidir; burada X, bir harf veya bir sayıdır.
Joseph

MAC burada belirtildiği gibi görebiliyorum . Sonra, echo -e 'connect CC:AF:78:AF:59:03' | bluetoothctlalıyorum çalışırken :Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
cipricus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.