जवाबों:
मुझे मतदान का तरीका पसंद नहीं आया, इसलिए मैंने ब्लूज़ और डीबस पर कुछ खुदाई की। मैंने निम्नलिखित स्क्रिप्ट लिखना समाप्त किया:
#!/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()
DEV_ID
कनेक्शन से पहले जानते हैं .. लेकिन क्या होगा यदि आप सभी कनेक्शन घटनाओं से सूचित होना चाहते हैं?
सफलतापूर्वक स्थापित ब्लूटूथ कनेक्शन की खोज के लिए हम चला सकते हैं
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
मैक एड्रेस कहां है (इसके :
साथ बदलने की जरूरत है _
)। आउटपुट तब आपको बताएगा कि क्या ब्लूटूथ ऑडियो सिंक उपलब्ध है या नहीं तो कुछ नहीं।
ऑडियो को इस सिंक में कैसे स्विच करें, इस पर इसका उत्तर देखें ।
स्ट्रीम 2ip के साथ हम एक कनेक्शन स्थापित होने के बाद चलने के लिए शेल कमांड या स्क्रिप्ट को परिभाषित कर सकते हैं। एक कनेक्शन स्थापित होने के बाद एक समर्थित मीडिया प्लेयर को स्वचालित रूप से शुरू करने का विकल्प भी है:
यदि कनेक्शन बाधित हो जाता है, तो Stream2ip वर्तमान में चल रहे प्लेबैक स्ट्रीम को ब्लूटूथ ऑडियो डिवाइस से फिर से कनेक्ट करने का प्रयास करेगा।
sdptool browse <device-id>
0 रिटर्न कोड मिलने तक मतदान करना चाहिए और फिर अपनी स्क्रिप्ट को बंद करना चाहिए, है ना? क्या मतदान के बिना ऐसा करने का कोई तरीका है?
@ इरिगामी आपके उत्तर ने बहुत मदद की लेकिन यह काम करने के लिए मुझे कुछ बदलाव करने हैं। मैं 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 उपकरण है।
सभी ब्लूटूथ डिवाइसों की निगरानी के लिए यहां एक और उदाहरण दिया गया है। इसे एक विशिष्ट मैक पते को निर्दिष्ट करने की आवश्यकता नहीं है। यह तरीका लॉगिन / आउट, सस्पेंड / वेक करने और अपने ब्लूटूथ डिवाइस को कनेक्ट / डिस-कनेक्ट करने पर भी xinput सेटिंग को लगातार बना देता है।
मेरे पास एक थिंकपैड कॉम्पैक्ट ब्लूटूथ कीबोर्ड है, और जब भी कीबोर्ड ट्रैकप्वाइंट की गति को समायोजित करने के लिए जुड़ा होता है, तो मैं एक xinput कमांड चलाना चाहता हूं। यहाँ कदम हैं।
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
संशोधन सहेजें। द्वारा अपनी स्क्रिप्ट चलाने का प्रयास करें
$ python bluetooth-runner.py
अपने ब्लूथूथ डिवाइस को कनेक्ट करें और डिस्कनेक्ट करें। आपको स्क्रीन पर मुद्रित संबंधित संदेश देखना चाहिए।
अब, अपनी फ़ाइल को निष्पादन योग्य बनाएं और इसे अपने में निर्देशिका में से एक में कॉपी करें $PATH
, कहें ~/bin/
।
$ chmod +x bluetooth-runner.py
$ mkdir ~/bin # if you dont have it yet
$ cp bluetooth-runner.py ~/bin
अब, सुनिश्चित करें कि आप स्क्रिप्ट को टर्मिनल में कहीं से भी चला सकते हैं (सुनिश्चित करें कि यह आपके खोज पथ में है)।
Startup Applications
Ubuntu मेनू से आग । स्टार्टअप में अपनी स्क्रिप्ट जोड़ें।
अब, केवल एक ही समस्या बाकी है, उस समय जब आप लॉगिन करते हैं, स्क्रिप्ट बहुत पहले ब्लूटूथ ईवेंट को नहीं पकड़ सकती है । ऐसा इसलिए है क्योंकि बैकग्राउंड में आपकी स्क्रिप्ट शुरू होने से पहले आपका ब्लूटूथ डिवाइस कनेक्ट हो सकता है।
इसे हल करने के लिए, सीधे अपने कस्टम कमांड को इसमें जोड़ें Startup Applications
। मेरे मामले में, यह निम्नलिखित आदेश है:
xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
और अब आप उबंटू के साथ अपने ब्लूटूथ डिवाइस का आनंद ले पाएंगे।
आप लिखते हैं "जब आपका हेडसेट आपके कंप्यूटर से जुड़ता है"। यह कैसे करता है, स्वचालित रूप से? जब आपको इसे मैन्युअल रूप से ट्रिगर करना होगा, तो आप इसे स्क्रिप्ट बना सकते हैं और कनेक्शन स्थापित होने के बाद अपनी स्क्रिप्ट चला सकते हैं। यह मैंने अपने ब्लूटूथ रिसीवर के लिए डिफ़ॉल्ट आउटपुट डिवाइस को सेट करने के लिए किया था (इसलिए मैं हार्डवेयर कुंजी के साथ वॉल्यूम बदल सकता हूं):
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-script
। your-script
केवल तभी चलाया जाएगा जब कनेक्शन सफलतापूर्वक स्थापित किया गया था।