कमांड लाइन से ब्लूटूथ डिवाइस से कनेक्ट करें


22

पृष्ठभूमि: मैं अपने ब्लूटूथ हेडसेट को ऑडियो आउटपुट के रूप में उपयोग कर रहा हूं। मैं ब्लूटूथहेडसेट सामुदायिक दस्तावेज पर निर्देशों की लंबी सूची के द्वारा इसे प्राप्त करने में कामयाब रहा , और मैंने एक स्क्रिप्ट में डिफ़ॉल्ट ऑडियो आउटपुट के रूप में हेडसेट को सक्रिय करने की प्रक्रिया को स्वचालित कर दिया है, एक और प्रश्न के लिए धन्यवाद ।

हालाँकि, जब से मैं अपने फोन और कंप्यूटर (और हेडसेट दो इनपुट कनेक्शन का समर्थन नहीं करता है) के साथ ब्लूटूथ हेडसेट का उपयोग करता हूं, जब फोन चालू होता है तो कनेक्शन को "चोरी" नहीं करने के लिए, मैं हेडसेट को एक में मजबूर करता हूं कंप्यूटर से कनेक्ट करते समय डिस्कवरी मोड (फोन को अपने आप कनेक्ट होने के लिए मिलता है)।

भले ही हेडसेट को ठीक से रखा गया हो और "सामान्य" परिदृश्य में ऑटोकनेक्ट किया गया हो, फिर भी मुझे हमेशा अपने डिवाइस से कनेक्ट करने के लिए अधिसूचना क्षेत्र में थोड़ा ब्लूटूथ आइकन का उपयोग करना होगा (स्क्रीनशॉट देखें)।

मैं किससे बचना चाहता हूं: यह जीयूआई एक ज्ञात और युग्मित ब्लूटूथ डिवाइस से कनेक्ट करने के लिए :

आइकन का उपयोग करके ब्लूटूथ हेडसेट से कनेक्ट करना

इसके बजाय मैं क्या चाहता हूं: मैं ब्लूटूथ बनाना चाहता हूं कि जीयूआई में कनेक्टिंग आइटम पर क्लिक करना वास्तव में क्या है, केवल कमांड लाइन का उपयोग करके। मैं कमांड लाइन का उपयोग करना चाहता हूं, इसलिए मैं कार्रवाई के लिए एक एकल शॉर्टकट शॉर्टकट बना सकता हूं, और हर बार जब मैं डिवाइस से कनेक्शन स्थापित करना चाहता हूं तो जीयूआई नेविगेट करने की आवश्यकता नहीं होगी।

प्रश्न: मैं कमांड लाइन से एक विशिष्ट, ज्ञात और युग्मित ब्लूटूथ डिवाइस से कनेक्ट करने का प्रयास कैसे कर सकता हूं ?

आगे सवाल: मैं कैसे बताऊं कि क्या कनेक्शन सफल था या नहीं?


क्या ट्रे उपकरण है? क्या यह ब्लूमैन मैनेजर ट्रे आइकन है? ब्लूमैन प्रबंधक ट्रे एप्लेट सूची में ब्लूटूथ डिवाइस को जोड़ा जाना चाहिए?
सिप्रिकस

जवाबों:


10

ब्लूटूथ डेमॉन

डिफॉल्ट इंस्टॉलेशन में बैकग्राउंड (फाइल से रन) में एक डेमॉन ( ब्लूटूथ ) चलता है /etc/init.d/bluetooth। यह डेमन ज्ञात ब्लूटूथ डिवाइसों को पहचानने और कनेक्ट करने पर ध्यान देता है और इनका विन्यास फाइल के साथ कोफ़िगर किया जा सकता है /etc/bluetooth। किसी हेडसेट को ऑटोकनेनेट करने के लिए निम्नलिखित लाइन को audio.confअनलॉक्ड (हटाना #) होना चाहिए :

AutoConnect=true

डेमन प्रकार को पुनरारंभ करने के लिए sudo /etc/init.d/bluetooth restart

टिप्पणी: कमांड लाइन टूल का उपयोग करने sudo hcitool cc <MAC-Adress>से परीक्षण वातावरण में एक ज्ञात डिवाइस के स्थिर कनेक्शन के लिए नेतृत्व नहीं किया गया जब डेमॉन चल रहा था।


DBus

डिस्कनेक्ट किए गए लेकिन शारीरिक रूप से मौजूद और युग्मित हेडसेट को जोड़ने के लिए हम एक स्क्रिप्ट से डी-बस का उपयोग कर सकते हैं । यहाँ अजगर में एक उदाहरण है:

#!/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) के लिए एक अलग प्रोटोकॉल में इंटरफ़ेस बदलें ।


पल्सऑडियो

यदि आप अपने ब्लूटूथ डिवाइस के मैक पता जानते हैं, तो आप इसे pulseaudio के आउटपुट सिंक के रूप में कनेक्ट कर सकते हैं:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

जहाँ xx_xx_xx_xx_xx_xx मैक एड्रेस है (इसे पहचानने के लिए pulseaudio के लिए '_' द्वारा प्रतिस्थापित करें)।

अधिक विवरण के लिए यह उत्तर भी देखें ।


मुझे पता नहीं है, और मैंने इसके साथ xx को बदल दिया। मैं केवल Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.अपरकेस और लोअरकेस दोनों की कोशिश करता हूं ।
इलारी काजस्ट

1
हाँ, pulseaudio-मॉड्यूल-ब्लूटूथ isntalle है। नहीं, कुछ भी मिलान btया blueमें सूचीबद्ध नहीं है pacmd list-sinks। (यह केवल 1 सिंक उपलब्ध होने की रिपोर्ट करता है।)
इलारी काजस्ट

2
इसलिए यह मान्यता प्राप्त नहीं है। यह कमांडलाइन द्वारा कनेक्ट करने में सक्षम होने के लिए एक शर्त है। BT को पुनरारंभ करने का प्रयास करें या pulsaudio को पुनः आरंभ करने का प्रयास करें। मुझे अभी तक यह पता नहीं चला है कि यह कभी-कभी अलग क्यों नहीं होता है।
ताकत

है ना? तो यह ऐसी स्थिति में हो सकता है कि GUI से कनेक्ट करना संभव है, लेकिन CLI से नहीं?
इलारी कजस्ट

1
@ तक्कत ओह, हाँ, अच्छी बात है। मेरी गलती! मैं खोज में हेडसेट का उपयोग अधिक कर रहा हूं, इसलिए यह ऑटोकनेक्ट नहीं करेगा। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न संपादित किया। आपको गलत रास्ते पर ले जाने के लिए क्षमा करें।
इलारी काजस्ट

6

मैं अपने ब्लूटूथ ऑडियो डिवाइस को कनेक्ट करने के लिए इस स्क्रिप्ट का उपयोग करता हूं। अपने हेडसेट पहले से ही बनती है, तो आप एक ही तरह का प्रयोग करने में अपने हेडसेट कनेक्ट करने के लिए सक्षम होना चाहिए 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स्क्रिप्ट के लिए विकल्प पारित करने के लिए मत भूलना !
मिन्नर

2

मैं विंडो प्रबंधक के रूप में i3 का उपयोग करता हूं, इसलिए मेरे पास ब्लूटूथ ट्रे आइकन उपलब्ध नहीं है। किसी कारण के लिए एकता सेटिंग्स में चेक बटन संवेदनशील नहीं है और इसलिए मुझे समय-समय पर ऐसा करने की आवश्यकता होती है जब मेरे हेडफ़ोन कनेक्ट नहीं होते हैं।

यहाँ छवि विवरण दर्ज करें

ऐसा लगता है कि उनके dbus एपीआईbluez को बदल दिया हैorg.bluez.Managerअब उपयोग करने वाला उत्तर काम नहीं करता है। इसके बजाय, इसका उपयोग करने की सिफारिश की जाती है ObjectManager

यहां एक अद्यतन अजगर स्क्रिप्ट है जो पहले असंबद्ध ब्लूटूथ हेडसेट को कनेक्ट करेगा जो इसे पाता है (संभवतः सूची में सभी युग्मित डिवाइस शामिल हैं?)।

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

यह उदाहरण, इस थ्रेड पर अन्य उदाहरण की तरह, dbusअजगर पैकेज का उपयोग करता है । Ubuntu 16.04 पर मैंने इसके माध्यम से स्थापित किया apt-get install python-dbus

यदि आप अन्य मानदंडों से मेल खाना चाहते हैं, तो यह दस्तावेज़ उन संपत्तियों की एक सूची दिखाता है, जिन्हें dbus पर दिखाया जा सकता है।

मेरे पास यह स्क्रिप्ट बची हुई है, ~/.local/bin/bt-connect-headsetजो मेरे पास है PATHइसलिए मैं इसे i3 लांचर से निष्पादित कर सकता हूं। chmod +x bt-connect-headsetयदि आप इसे एक कमांड के रूप में उपयोग करने की योजना बनाते हैं, तो इसे निष्पादन योग्य ( ) बनाएं ।

इस लिपि को केवल 09/28/2018 तक एक अप-टू-डेट ubuntu 16.04 पर परीक्षण किया गया है।


1
Ubuntu 10.10 पर अपनी स्क्रिप्ट का उपयोग किया। धन्यवाद!
ब्रॉमबॉम्ब

1
सुपर, इसने मेरे लिए लिनक्स मिंट 19 दालचीनी में काम किया। हालाँकि, मैंने 2360344इसके बजाय एक उपकरण वर्ग का उपयोग किया 0x240404
dom_watson

1
मिंट Xfce 19.2 में इस तरह के रूप में काम करता है। मुझे यकीन है कि यह Xubuntu में काम करता है। - ब्लूटूथ को डिस्कनेक्ट करने के लिए एक स्क्रिप्ट के बारे में क्या?
सिप्रिकस

1
@cipricus यह सही है, और पहले से ही उत्तर में उल्लिखित है। यदि आपको कुछ और उन्नत करने की आवश्यकता है (जैसे किसी विशेष नाम के उपकरण से मिलान करना) तो अन्य मानदंडों का मिलान कैसे करें, इसके जवाब में एक लिंक है। उस लिंक में इस इंटरफ़ेस पर उपलब्ध विधियों की एक सूची भी शामिल है। डिस्कनेक्ट करने के लिए, मेरा अनुमान Disconnect()विधि का उपयोग करना है। मैंने इसकी कोशिश नहीं की है, लेकिन यह शायद एक सुरक्षित शर्त है;)।
चेशायरकोव

मैं गलत था। मैंने सोचा कि यह युग्मित उपकरणों की सूची में पहले से आगे नहीं जाता है, लेकिन यह करता है। मैं इस तथ्य को भी याद कर सकता हूं कि आप कहते हैं first unconnected bluetooth headset : क्या यह हमेशा ब्लूटूथ स्पीकर (जैसे कि सूची में कोई फर्क नहीं पड़ता) जैसे अन्य डिवाइस से पहले हेडसेट (यदि संचालित होता है) का उपयोग करेगा ? मेरे मामले में ऐसा ही होता है। - इसके अलावा, डिस्कनेक्ट करने के लिए मैं इसे केवल अंतिम पंक्ति को बदलकर नहीं कर सकता adapter.Disconnect()।)
सिप्रिकस

1

उपरोक्त में से कुछ की कोशिश करने के बाद (स्क्रिप्ट मेरे लिए काम नहीं करती थी) मुझे निम्नलिखित समाधान मिला।

पहले उस डिवाइस के मैक-एड्रेस का पता लगाएं जिसे आप कनेक्ट करना चाहते हैं

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 @ user3140225 क्या आप इसका आउटपुट पोस्ट कर सकते हैं bluetoothctl? आपको डिवाइस के मैक-एड्रेस के साथ कमांड्स को खिलाने की आवश्यकता है - जो कि प्रारूप एक्सएक्सएक्स: एक्सएक्सएक्स: एक्सएक्सएक्स: एक्सएक्सएक्स: एक्सएक्सएक्स: एक्सएक्सएक्स: एक्सएक्सएक्सएक्स में एक्सएक्सएक्सएक्सएक्स, जहां एक्स या तो एक पत्र या एक नंबर है।
यूसुफ

मैं देख सकता हूँ 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
सिप्रिकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.