Terhubung ke perangkat bluetooth dari baris perintah


22

Latar Belakang: Saya menggunakan headset bluetooth saya sebagai output audio. Saya berhasil membuatnya bekerja dengan daftar panjang instruksi pada dokumentasi komunitas BluetoothHeadset , dan saya telah mengotomatiskan proses mengaktifkan headset sebagai output audio default ke dalam skrip, berkat pertanyaan lain .

Namun, karena saya menggunakan headset bluetooth dengan ponsel dan komputer saya (dan headset tidak mendukung dua koneksi input) agar ponsel tidak "mencuri" koneksi ketika handset dihidupkan, saya memaksa headset menjadi Mode penemuan saat menghubungkan ke komputer (telepon dapat terhubung secara otomatis).

Jadi meskipun headset sudah dipasangkan ok dan akan terhubung otomatis dengan skenario "normal", saya harus selalu menggunakan ikon bluetooth kecil di area notifikasi untuk benar-benar terhubung ke perangkat saya (lihat tangkapan layar).

Yang ingin saya hindari: GUI ini untuk menghubungkan ke perangkat bluetooth yang dikenal dan dipasangkan :

Menghubungkan ke headset Bluetooth menggunakan ikon

Apa yang saya inginkan sebagai gantinya: Saya ingin membuat bluetooth melakukan persis seperti mengklik item terhubung di GUI, hanya dengan menggunakan baris perintah. Saya ingin menggunakan baris perintah sehingga saya dapat membuat pintasan tombol tunggal untuk tindakan, dan tidak perlu menavigasi GUI setiap kali saya ingin membuat koneksi ke perangkat.

Pertanyaannya: Bagaimana saya bisa mencoba menyambung ke perangkat bluetooth khusus, yang diketahui dan dipasangkan dari baris perintah?

Pertanyaan selanjutnya: Bagaimana saya tahu apakah koneksi berhasil atau tidak?


Alat baki apa itu? apakah itu ikon baki Blueman Manager? Haruskah daftar applet baki manajer Blueman memasangkan perangkat bluetooth?
cipricus

Jawaban:


10

Daemon Bluetooth

Dalam instalasi default, daemon ( bluetoothd ) berjalan di latar belakang (dijalankan dari file /etc/init.d/bluetooth). Daemon ini berhati-hati dalam mengenali dan menghubungkan ke perangkat bluetooth yang dikenal dan dapat dikonfigurasikan dengan file konfigurasi di /etc/bluetooth. Untuk menghubungkan headset secara otomatis, baris berikut ini audio.confharus dihapus komentarnya (hapus #):

AutoConnect=true

Untuk me-restart jenis daemon sudo /etc/init.d/bluetooth restart.

Catatan: Menggunakan alat baris perintah sudo hcitool cc <MAC-Adress>tidak mengarah ke koneksi yang stabil ke perangkat yang dikenal di lingkungan pengujian di sini ketika daemon sedang berjalan.


DBus

Untuk menghubungkan headset yang terputus tetapi secara fisik ada dan berpasangan, kita dapat menggunakan D-Bus dari sebuah skrip. Berikut ini contoh dalam 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

Jika kita memiliki lebih dari satu perangkat Bluetooth, kita harus beradaptasi dengan devicePathtepat, tentu saja. Contoh di atas akan menghubungkan a Headset. Ubah antarmuka ke protokol lain untuk layanan lain (mis AudioSink.).


Pulseaudio

Jika Anda tahu alamat MAC perangkat Bluetooth Anda, Anda dapat menghubungkannya sebagai wastafel keluaran untuk pulseaudio dengan:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Di mana xx_xx_xx_xx_xx_xx adalah alamat MAC (ganti ':' dengan '_' untuk pulseaudio untuk mengenalinya).

Lihat juga jawaban ini untuk lebih jelasnya.


Saya tahu alamatnya, dan saya mengganti xx dengannya. Saya hanya Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.mencoba Mencoba huruf besar dan kecil.
Ilari Kajaste

1
Ya, pulseaudio-module-bluetooth tidak dapat digunakan. Tidak, tidak ada yang cocok btatau blueterdaftar di pacmd list-sinks. (Ini melaporkan hanya 1 wastafel tersedia.)
Ilari Kajaste

2
Jadi tidak dikenali. Ini adalah prasyarat untuk dapat terhubung dengan commandline. Coba mulai ulang BT atau coba mulai ulang audioudio. Saya belum tahu mengapa terkadang tidak terdeteksi.
Takkat

Hah? Jadi bisa dalam keadaan yang memungkinkan untuk terhubung dari GUI, tetapi tidak dari CLI?
Ilari Kajaste

1
@ Takkat Oh, ya, bagus. Salahku! Saya menggunakan headset dalam penemuan lebih banyak, sehingga tidak akan terhubung secara otomatis. Saya mengedit pertanyaan untuk mencerminkan hal ini. Maaf karena membawamu ke jalan yang salah.
Ilari Kajaste

6

Saya menggunakan skrip ini untuk menghubungkan Perangkat Audio Bluetooth saya. Jika headset Anda sudah dipasangkan, Anda harus dapat menghubungkan headset Anda dengan cara yang sama menggunakan org.bluez.Headset.Connect / Disconnect sebagai ganti org.bluez.Audiosink.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!


ini juga berhasil untuk saya 16.04, terima kasih! yang lain, jangan lupa untuk memberikan onopsi ke skrip!
MInner

2

Saya menggunakan i3 sebagai window manager jadi saya tidak memiliki ikon baki bluetooth yang tersedia. Untuk beberapa alasan tombol centang dalam pengaturan kesatuan tidak sensitif dan jadi saya perlu cara untuk melakukan ini dari waktu ke waktu ketika headphone saya tidak terhubung.

masukkan deskripsi gambar di sini

Tampaknya blueztelah mengubah API dbus mereka . Jawaban menggunakan org.bluez.Managertidak lagi berfungsi. Sebagai gantinya, disarankan untuk menggunakan ObjectManager.

Berikut ini adalah skrip python yang diperbarui yang akan menghubungkan headset bluetooth pertama yang tidak terhubung yang ditemukannya (mungkin daftar ini mencakup semua perangkat yang dipasangkan?):

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

contoh ini, seperti contoh lain pada utas ini, menggunakan dbuspaket python. Di ubuntu 16.04 saya menginstal ini melalui apt-get install python-dbus.

Jika Anda ingin mencocokkan kriteria lain, dokumen ini tampaknya menunjukkan daftar properti yang dapat ditanyakan lebih dari dbus.

Saya memiliki skrip ini disimpan di ~/.local/bin/bt-connect-headsetmana saya PATHsehingga saya dapat menjalankannya dari launcher i3. Jadikan itu executable ( chmod +x bt-connect-headset) jika Anda berencana untuk menggunakannya sebagai perintah.

Skrip ini hanya diuji pada ubuntu 16.04 terbaru pada 09/28/2018.


1
Menggunakan skrip Anda di Ubuntu 18.10. Terima kasih!
Brombomb

1
Super, ini bekerja untuk saya di Linux Mint 19 Cinnamon. Namun, saya menggunakan kelas perangkat 2360344alih-alih 0x240404.
dom_watson

1
bekerja seperti itu di Mint Xfce 19.2. Saya yakin itu berfungsi di Xubuntu. - Bagaimana dengan skrip untuk memutuskan koneksi bluetooth?
cipricus

1
@cipricus Itu benar, dan sudah disebutkan dalam jawabannya. Ada tautan dalam jawaban tentang cara mencocokkan kriteria lain jika Anda membutuhkan sesuatu yang lebih canggih (seperti mencocokkan perangkat dengan nama tertentu). Tautan itu juga mencakup daftar metode yang tersedia di antarmuka ini. Untuk memutuskan sambungan, tebakan saya adalah menggunakan Disconnect()metode. Saya belum mencobanya, tapi mungkin ini taruhan yang aman;).
cheshirekow

Saya salah. Saya pikir itu tidak pernah melampaui yang pertama dalam daftar perangkat yang dipasangkan, tetapi tidak. Saya mungkin juga melewatkan fakta yang Anda katakan first unconnected bluetooth headset : apakah akan selalu menggunakan headset (jika diaktifkan) sebelum perangkat lain seperti speaker bluetooth (tidak peduli posisi dalam daftar)? Itulah yang terjadi dalam kasus saya. - Juga, untuk memutuskan sambungan saya tidak bisa melakukannya dengan hanya mengubah baris terakhir ke adapter.Disconnect().)
cipricus

1

Setelah mencoba beberapa hal di atas (skrip tidak berfungsi untuk saya), saya menemukan solusi berikut.

Pertama cari tahu MAC-Adress perangkat yang ingin Anda sambungkan

bluetoothctl

ini akan memasuki shell dan daftar semua perangkat yang tersedia dengan alamat. ("keluar" untuk keluar dari shell & kembali ke prompt)

Kemudian hubungkan ke perangkat bluetooth XX: XX: XX: XX: XX: XX: XX:

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

untuk memutuskan sambungan

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

sudah mencari ini cukup lama - tidak ada yang berhasil, merasa sangat lega ketika saya tahu. Kupikir orang lain mungkin ingin tahu tentang itu juga. :))


Bisakah Anda mengedit jawaban Anda untuk menambahkan cara mendapatkan alamat perangkat, sehingga jawabannya lebih lengkap?
user3140225

1
@ user3140225 baru saja melakukannya.
Joseph

Saya mengerti ~$ bluetoothctl Agent registered [UE BOOM 2]#. Lalu disconnect "UE BOOM 2" Device UE BOOM 2 not available.
cipricus

@cipricus @ user3140225 Bisakah Anda memposting output bluetoothctl? Anda perlu memberi makan perintah dengan alamat MAC perangkat - yang merupakan kombinasi dari Nilai HEX dalam format XX: XX: XX: XX: XX: XX: XX: XX, di mana X adalah huruf atau angka.
Joseph

Saya bisa melihat MAC seperti yang dikatakan di sini . Kemudian, berusaha echo -e 'connect CC:AF:78:AF:59:03' | bluetoothctlsaya dapatkan:Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
cipricus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.