Kết nối với thiết bị bluetooth từ dòng lệnh


22

Bối cảnh: Tôi đang sử dụng tai nghe bluetooth làm đầu ra âm thanh. Tôi đã quản lý để làm cho nó hoạt động theo danh sách dài các hướng dẫn về tài liệu cộng đồng BluetoothHeadset và tôi đã tự động quá trình kích hoạt tai nghe làm đầu ra âm thanh mặc định thành tập lệnh, nhờ một câu hỏi khác .

Tuy nhiên, vì tôi sử dụng tai nghe bluetooth với cả điện thoại và máy tính (và tai nghe không hỗ trợ hai kết nối đầu vào) để điện thoại không "đánh cắp" kết nối khi bật điện thoại, tôi buộc tai nghe vào chế độ khám phá khi kết nối với máy tính (điện thoại được kết nối với máy tự động).

Vì vậy, mặc dù tai nghe được ghép nối ổn và trong chế độ tự động kết nối "bình thường", tôi phải luôn sử dụng biểu tượng bluetooth nhỏ trong vùng thông báo để thực sự kết nối với thiết bị của mình (xem ảnh chụp màn hình).

Điều tôi muốn tránh: GUI này để kết nối với thiết bị bluetooth đã biết và được ghép nối :

Kết nối với tai nghe Bluetooth bằng biểu tượng

Thay vào đó, điều tôi muốn: Tôi muốn làm cho bluetooth thực hiện chính xác những gì việc nhấp vào mục kết nối trong GUI, chỉ bằng cách sử dụng dòng lệnh. Tôi muốn sử dụng dòng lệnh để có thể tạo một phím tắt nhấn cho hành động và không cần điều hướng GUI mỗi khi tôi muốn thiết lập kết nối với thiết bị.

Câu hỏi: Làm cách nào tôi có thể kết nối với một thiết bị bluetooth cụ thể, đã biết và được ghép nối từ dòng lệnh?

Câu hỏi thêm: Làm thế nào để tôi biết nếu kết nối thành công hay không?


Công cụ khay nào vậy? Có phải biểu tượng khay Blueman Manager không? Danh sách applet khay quản lý Blueman có nên ghép nối các thiết bị bluetooth không?
cipricus

Câu trả lời:


10

Daemon Bluetooth

Trong cài đặt mặc định, một daemon ( bluetoothd ) chạy trong nền (chạy từ tệp /etc/init.d/bluetooth). Trình nền này quan tâm đến việc nhận dạng và kết nối với các thiết bị bluetooth đã biết và có thể được đồng bộ hóa với các tệp cấu hình trong /etc/bluetooth. Để tự động kết nối tai nghe, dòng sau audio.confsẽ không bị xóa (xóa #):

AutoConnect=true

Để khởi động lại loại daemon sudo /etc/init.d/bluetooth restart.

Lưu ý: Sử dụng công cụ dòng lệnh sudo hcitool cc <MAC-Adress>không dẫn đến kết nối ổn định với thiết bị đã biết trong môi trường thử nghiệm ở đây khi trình nền đang chạy.


DBus

Để kết nối một tai nghe bị ngắt kết nối nhưng hiện tại và thực tế, chúng ta có thể sử dụng D-Bus từ một tập lệnh. Đây là một ví dụ trong 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

Trong trường hợp chúng ta có nhiều hơn một thiết bị Bluetooth devicePath, tất nhiên chúng ta sẽ phải điều chỉnh phù hợp. Ví dụ trên sẽ kết nối a Headset. Thay đổi giao diện sang một giao thức khác cho bất kỳ dịch vụ nào khác (ví dụ AudioSink).


Pulseaudio

Nếu bạn biết địa chỉ MAC của thiết bị Bluetooth của mình, bạn có thể kết nối nó dưới dạng một đầu ra cho pulseaudio bằng cách:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Trong đó xx_xx_xx_xx_xx_xx là địa chỉ MAC (thay thế ':' bằng '_' để pulseaudio nhận ra nó).

Xem thêm câu trả lời này để biết thêm chi tiết.


Tôi biết địa chỉ và tôi đã thay thế xx bằng nó. Tôi chỉ nhận được Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.Tried cả chữ hoa và chữ thường.
Ilari Kajaste

1
Vâng, pulseaudio-module-bluetooth là không phải. Không, không có gì phù hợp bthoặc blueđược liệt kê trong pacmd list-sinks. (Nó báo cáo chỉ có 1 bồn rửa có sẵn.)
Ilari Kajaste

2
Vì vậy, nó không được công nhận. Đây là điều kiện tiên quyết để có thể kết nối bằng dòng lệnh. Hãy thử khởi động lại BT hoặc thử khởi động lại pulsaudio. Tôi vẫn chưa tìm ra lý do tại sao đôi khi nó không bị phát hiện.
Takkat

Huh? Vì vậy, nó có thể ở trạng thái có thể kết nối từ GUI, nhưng không phải từ CLI?
Ilari Kajaste

1
@Takkat Ồ, vâng, điểm tốt. Lỗi của tôi! Tôi đang sử dụng tai nghe để khám phá thêm, vì vậy nó sẽ không tự động kết nối. Tôi đã chỉnh sửa câu hỏi để phản ánh điều này. Xin lỗi vì đã dẫn bạn xuống một con đường sai.
Ilari Kajaste

6

Tôi sử dụng tập lệnh này để kết nối Thiết bị âm thanh Bluetooth của mình. Nếu tai nghe của bạn đã được ghép nối, bạn sẽ có thể kết nối tai nghe của mình theo cùng một cách sử dụng org.bluez.Headset.Cconnectect / Ngắt kết nối thay cho org.bluez.Audiosink.Cconnectect / Ngắt kết nối .

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


điều này làm việc cho tôi quá 16.04, cảm ơn bạn! những người khác, đừng quên chuyển ontùy chọn cho kịch bản!
MInner

2

Tôi sử dụng i3 làm trình quản lý cửa sổ vì vậy tôi không có sẵn biểu tượng khay bluetooth. Vì một số lý do, nút kiểm tra trong cài đặt thống nhất không nhạy cảm và vì vậy tôi cần một cách để làm điều này theo thời gian khi tai nghe của tôi không kết nối.

nhập mô tả hình ảnh ở đây

Có vẻ như điều đó bluezđã thay đổi API dbus của họ . Câu trả lời sử dụng org.bluez.Managerkhông còn xuất hiện để làm việc. Thay vào đó, nó được khuyến khích sử dụng ObjectManager.

Dưới đây là tập lệnh python được cập nhật sẽ kết nối tai nghe bluetooth chưa được kết nối đầu tiên mà nó tìm thấy (có lẽ danh sách bao gồm tất cả các thiết bị được ghép nối?):

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

ví dụ này, giống như ví dụ khác trên luồng này, sử dụng dbusgói python. Trên Ubuntu 16.04 tôi đã cài đặt nó thông qua apt-get install python-dbus.

Nếu bạn muốn phù hợp với các tiêu chí khác, tài liệu này xuất hiện để hiển thị một danh sách các thuộc tính có thể được truy vấn qua dbus.

Tôi có tập lệnh này được lưu trong ~/.local/bin/bt-connect-headsetđó PATHđể tôi có thể thực thi nó từ trình khởi chạy i3. Làm cho nó thực thi ( chmod +x bt-connect-headset) nếu bạn có kế hoạch sử dụng nó như một lệnh.

Kịch bản này mới chỉ được thử nghiệm trên phiên bản cập nhật ubfox 16.04 kể từ ngày 28/9/2018.


1
Đã sử dụng tập lệnh của bạn trên Ubuntu 18.10. Cảm ơn!
Brombomb

1
Siêu, điều này làm việc cho tôi trong Linux Mint 19 Cinnamon. Tuy nhiên, tôi đã sử dụng một lớp thiết bị 2360344thay vì 0x240404.
dom_watson

1
hoạt động như vậy trong Mint Xfce 19.2. Tôi chắc chắn rằng nó hoạt động trong Xubfox. - Điều gì về một kịch bản để ngắt kết nối bluetooth?
cipricus

1
@cipricus Điều đó đúng, và đã được đề cập trong câu trả lời. Có một liên kết trong câu trả lời về cách khớp các tiêu chí khác nếu bạn cần thứ gì đó cao cấp hơn (như khớp với một thiết bị có tên cụ thể). Liên kết đó cũng bao gồm một danh sách các phương thức có sẵn trên giao diện này. Để ngắt kết nối, tôi đoán là sử dụng Disconnect()phương pháp. Tôi đã không thử nó, nhưng nó có thể là một vụ cá cược an toàn;).
cheshirekow

Tôi đã sai. Tôi nghĩ rằng nó không bao giờ vượt quá đầu tiên trong danh sách các thiết bị được ghép nối, nhưng nó có. Tôi cũng có thể đã bỏ lỡ thực tế mà bạn nói first unconnected bluetooth headset : nó sẽ luôn sử dụng tai nghe (nếu được cấp nguồn) trước các thiết bị khác như loa bluetooth (bất kể vị trí trong danh sách)? Đó là những gì xảy ra trong trường hợp của tôi. - Ngoài ra, để ngắt kết nối, tôi không thể làm điều đó bằng cách chỉ thay đổi dòng cuối cùng thành adapter.Disconnect().)
cipricus

1

Sau khi thử một số cách trên (kịch bản không phù hợp với tôi) tôi đã tìm ra giải pháp sau.

Trước tiên hãy tìm địa chỉ MAC của thiết bị bạn muốn kết nối

bluetoothctl

cái này sẽ nhập shell và liệt kê tất cả các thiết bị có sẵn với địa chỉ. ("Thoát" để thoát khỏi trình bao & quay lại dấu nhắc)

Sau đó kết nối với thiết bị bluetooth XX: XX: XX: XX: XX: XX:

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

để ngắt kết nối

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

đã tìm kiếm điều này khá lâu - dường như không có gì hoạt động, tôi cảm thấy rất nhẹ nhõm khi tôi phát hiện ra. Nghĩ rằng những người khác cũng có thể muốn biết về nó. :))


Bạn có thể chỉnh sửa câu trả lời của mình để thêm cách lấy địa chỉ của thiết bị, để câu trả lời hoàn chỉnh hơn không?
dùng3140225

1
@ user3140225 vừa làm.
Giuse

Tôi nhận được ~$ bluetoothctl Agent registered [UE BOOM 2]#. Sau đó disconnect "UE BOOM 2" Device UE BOOM 2 not available.
cipricus

@cipricus @ user3140225 Bạn có thể đăng kết quả đầu ra bluetoothctlkhông? Bạn cần cung cấp các lệnh bằng địa chỉ MAC của thiết bị - là sự kết hợp của Giá trị HEX theo định dạng XX: XX: XX: XX: XX: XX, trong đó X là một chữ cái hoặc một số.
Joseph

Tôi có thể thấy MAC như đã nói ở đây . Sau đó, thử echo -e 'connect CC:AF:78:AF:59:03' | bluetoothctltôi nhận được:Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
cipricus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.