जब कोई ब्लूटूथ डिवाइस कनेक्ट होता है तो मैं एक स्क्रिप्ट कैसे चला सकता हूं?


16

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

जवाबों:


12

मुझे मतदान का तरीका पसंद नहीं आया, इसलिए मैंने ब्लूज़ और डीबस पर कुछ खुदाई की। मैंने निम्नलिखित स्क्रिप्ट लिखना समाप्त किया:

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

import subprocess

# ID of the device we care about
DEV_ID = '00_1D_54_AB_DC_72'

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()

headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
    # ^^^ I'm not sure if that's kosher. But it works.

def cb(iface=None, mbr=None, path=None):

    if ("org.bluez.Headset" == iface and path.find(DEV_ID) > -1):
        print 'iface: %s' % iface
        print 'mbr: %s' % mbr
        print 'path: %s' % path
        print "\n"
        print "matched"

        if mbr == "Connected":
            subprocess.call(["clementine", "--play"])
            print 'conn'

        elif mbr == "Disconnected":
            subprocess.call(["clementine", "--stop"])
            print 'dconn'

headset.connect_to_signal("Connected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')
headset.connect_to_signal("Disconnected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')

loop = gobject.MainLoop()
loop.run()

बेशक Bluez, और PulseAudio मतदान DBus के माध्यम से काम करते हैं। जब तक आपका हेडसेट डिफ़ॉल्ट एडेप्टर है, तब तक यह ज्यादातर मामलों में ठीक काम करेगा। सुनिश्चित करें कि यदि आप कुछ सुनना चाहते हैं तो आप हेडसेट से PulseAudio को भी कनेक्ट करें। अपना समाधान साझा करने के लिए धन्यवाद :)
Takkat

यह बहुत अच्छा है यदि आप DEV_IDकनेक्शन से पहले जानते हैं .. लेकिन क्या होगा यदि आप सभी कनेक्शन घटनाओं से सूचित होना चाहते हैं?
पैंसेंटन

4

सफलतापूर्वक स्थापित ब्लूटूथ कनेक्शन की खोज के लिए हम चला सकते हैं

sdptool browse xx:xx:xx:xx:xx:xx

इसके द्वारा एसडीबी कनेक्शन को दिए गए मैक पते के कनेक्शन के लिए परीक्षण किया जाएगा। यह एक त्रुटि की तरह बार ब्राउज़ करने तक काफी समय लग सकता है

Failed to connect to SDP server on 00:0C:78:4F:B6:B5: Host is down

हम आपकी स्क्रिप्ट का सही उद्देश्य नहीं जानते हैं, लेकिन सबसे अधिक संभावना है कि आप हेडसेट से कनेक्ट होने पर क्लेमेंटाइन के माध्यम से ऑडियो चलाना चाहते हैं।

तब हम देख सकते थे कि क्या ब्लूटूथ ऑडियो सिंक है

pacmd list-sinks | grep xx_xx_xx_xx_xx_xx

xx_xx_xx_xx_xx_xxमैक एड्रेस कहां है (इसके :साथ बदलने की जरूरत है _)। आउटपुट तब आपको बताएगा कि क्या ब्लूटूथ ऑडियो सिंक उपलब्ध है या नहीं तो कुछ नहीं।

ऑडियो को इस सिंक में कैसे स्विच करें, इस पर इसका उत्तर देखें ।


Stream2ip

स्ट्रीम 2ip के साथ हम एक कनेक्शन स्थापित होने के बाद चलने के लिए शेल कमांड या स्क्रिप्ट को परिभाषित कर सकते हैं। एक कनेक्शन स्थापित होने के बाद एक समर्थित मीडिया प्लेयर को स्वचालित रूप से शुरू करने का विकल्प भी है:

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

यदि कनेक्शन बाधित हो जाता है, तो Stream2ip वर्तमान में चल रहे प्लेबैक स्ट्रीम को ब्लूटूथ ऑडियो डिवाइस से फिर से कनेक्ट करने का प्रयास करेगा।


आपके उत्तर के लिए धन्यवाद। आप सुझाव दे रहे हैं कि मुझे sdptool browse <device-id>0 रिटर्न कोड मिलने तक मतदान करना चाहिए और फिर अपनी स्क्रिप्ट को बंद करना चाहिए, है ना? क्या मतदान के बिना ऐसा करने का कोई तरीका है?
एरिगामी

Sdptool धीमी है। मैं pulseaudio के लिए जाऊँगा। आपको एक लूप की आवश्यकता है क्योंकि हम नहीं जानते कि आपका डिवाइस कब है।

2

@ इरिगामी आपके उत्तर ने बहुत मदद की लेकिन यह काम करने के लिए मुझे कुछ बदलाव करने हैं। मैं ubuntu 14.04 का उपयोग कर रहा हूं।

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

import subprocess

# ID of the device we care about
DEV_ID = 'CC:C3:EA:A5:16:90'.replace(":", "_")

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()

print(adapterPath + '/dev_' + DEV_ID)
headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
# ^^^ I'm not sure if that's kosher. But it works.

def cb(*args, **kwargs):
    is_connected = args[-1]
    if isinstance(is_connected, dbus.Boolean) and is_connected:
        print("Connected")
    elif isinstance(is_connected, dbus.Boolean) and not is_connected:
        print("Disconnected")

headset.connect_to_signal("PropertyChanged", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')

loop = gobject.MainLoop()
loop.run()

फिर भी अगर यह काम नहीं करता है तो सिस्टम डब का उपयोग करें और निगरानी करें।

dbus-monitor --system

d-feetआगे इस्तेमाल किया जा सकता है। यह dbus वस्तुओं को देखने के लिए GUI उपकरण है।


1
यदि आप कोई अन्य उत्तर सुधारना चाहते हैं, तो कृपया उसे संपादित करने का सुझाव दें और नया उत्तर न बनाएं।
डेविड फ़ॉस्टर

1

सभी ब्लूटूथ डिवाइसों की निगरानी के लिए यहां एक और उदाहरण दिया गया है। इसे एक विशिष्ट मैक पते को निर्दिष्ट करने की आवश्यकता नहीं है। यह तरीका लॉगिन / आउट, सस्पेंड / वेक करने और अपने ब्लूटूथ डिवाइस को कनेक्ट / डिस-कनेक्ट करने पर भी xinput सेटिंग को लगातार बना देता है।

मेरे पास एक थिंकपैड कॉम्पैक्ट ब्लूटूथ कीबोर्ड है, और जब भी कीबोर्ड ट्रैकप्वाइंट की गति को समायोजित करने के लिए जुड़ा होता है, तो मैं एक xinput कमांड चलाना चाहता हूं। यहाँ कदम हैं।

  1. Github ब्लूटूथ-रूबल से कोड डाउनलोड करें । यहाँ दिए गए क्रेडिट जिन्होंने पहली बार रास्पबेरी पाई के लिए यह लिखा था। कोड के निम्नलिखित भाग को संशोधित करके अपने कस्टम कॉममैंड्स चलाएं।

    subprocess.call(['xinput', 'set-prop',
                     'ThinkPad Compact Bluetooth Keyboard with TrackPoint',
                     'Device Accel Constant Deceleration', '0.6'])

    मेरे मामले में, यह टर्मिनल से कॉल करने के बराबर है।

    $ xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
  2. संशोधन सहेजें। द्वारा अपनी स्क्रिप्ट चलाने का प्रयास करें

    $ python bluetooth-runner.py

    अपने ब्लूथूथ डिवाइस को कनेक्ट करें और डिस्कनेक्ट करें। आपको स्क्रीन पर मुद्रित संबंधित संदेश देखना चाहिए।

  3. अब, अपनी फ़ाइल को निष्पादन योग्य बनाएं और इसे अपने में निर्देशिका में से एक में कॉपी करें $PATH, कहें ~/bin/

    $ chmod +x bluetooth-runner.py
    $ mkdir ~/bin # if you dont have it yet
    $ cp bluetooth-runner.py ~/bin
  4. अब, सुनिश्चित करें कि आप स्क्रिप्ट को टर्मिनल में कहीं से भी चला सकते हैं (सुनिश्चित करें कि यह आपके खोज पथ में है)।

  5. Startup ApplicationsUbuntu मेनू से आग । स्टार्टअप में अपनी स्क्रिप्ट जोड़ें।

    स्टार्टअप एप्लिकेशन जोड़ें

  6. अब, केवल एक ही समस्या बाकी है, उस समय जब आप लॉगिन करते हैं, स्क्रिप्ट बहुत पहले ब्लूटूथ ईवेंट को नहीं पकड़ सकती है । ऐसा इसलिए है क्योंकि बैकग्राउंड में आपकी स्क्रिप्ट शुरू होने से पहले आपका ब्लूटूथ डिवाइस कनेक्ट हो सकता है।

    इसे हल करने के लिए, सीधे अपने कस्टम कमांड को इसमें जोड़ें Startup Applications। मेरे मामले में, यह निम्नलिखित आदेश है:

     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6

और अब आप उबंटू के साथ अपने ब्लूटूथ डिवाइस का आनंद ले पाएंगे।


अजगर स्क्रिप्ट ब्लूटूथ कनेक्शन की निगरानी नहीं की।
पाउलो पेड्रोसो

0

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

bluetooth-connect && pactl set-default-sink bluez_sink.0C_A6_94_9A_37_4D

कहाँ bluetooth-connectइस तरह दिखता है: https://github.com/sblask/dotfiles/blob/c39d37ad67947b358b4a079cb41ae6f9e4a081d8/.bin/bluetooth-connect.symlink यह सब कुछ यु्ग्मित हो गया है हो जाती है और कनेक्ट करने के लिए तैयार है। आप मैक पते को ब्लूमैन में या pacmd list-sinks | grep -e 'name:' -e 'index'ब्लूटूथ डिवाइस से कनेक्ट होने पर चलाकर पाते हैं । तुम दौड़ना चाहोगे bluetooth-connect && your-scriptyour-scriptकेवल तभी चलाया जाएगा जब कनेक्शन सफलतापूर्वक स्थापित किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.