উত্তর:
আমি ভোটদানের পদ্ধতির পছন্দ করি না, তাই আমি ব্লুজ এবং ডিবাসে কিছু খনন করেছি। আমি নিম্নলিখিত স্ক্রিপ্ট লিখে শেষ করেছি:
#!/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
সংযোগের পূর্বের বিষয়টি জানেন তবে তা দুর্দান্ত but তবে যদি আপনি সমস্ত সংযোগের ইভেন্ট সম্পর্কে অবহিত হতে চান তবে কী হবে?
একটি সফলভাবে প্রতিষ্ঠিত ব্লুটুথ সংযোগটি আবিষ্কার করতে আমরা চালাতে পারি
sdptool browse xx:xx:xx:xx:xx:xx
এর দ্বারা প্রদত্ত MAC ঠিকানার সংযোগের জন্য এসডিবি সংযোগ পরীক্ষা করা হবে। ব্রাউজ করার সময় যেমন কোনও ত্রুটি রয়েছে তা না হওয়া পর্যন্ত এটি যথেষ্ট সময় নিতে পারে
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 বর্তমানে চলমান প্লেব্যাক স্ট্রিমটিকে ব্লুটুথ অডিও ডিভাইসে পুনরায় সংযোগ দেওয়ার চেষ্টা করবে।
sdptool browse <device-id>
0 টি রিটার্ন কোড না পাওয়া পর্যন্ত আমার সাথে পোল করা উচিত এবং তারপরে আমার স্ক্রিপ্টটি বন্ধ করব, তাই না? পোলিং না করে কী করার উপায় আছে?
@ এরিগামি আপনার উত্তরটি অনেক সাহায্য করেছে তবে এটি কার্যকর করতে আমি কিছু পরিবর্তন করতে চাই। আমি উবুন্টু 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
আরও ব্যবহার করা যেতে পারে। এটি ডিবিএস অবজেক্টগুলি দেখার জন্য জিইউআই সরঞ্জাম।
সমস্ত ব্লুটুথ ডিভাইস নিরীক্ষণের জন্য এখানে আরেকটি উদাহরণ। এটি নির্দিষ্ট ম্যাক ঠিকানা নির্দিষ্ট করার প্রয়োজন হয় না। আপনার ব্লুটুথ ডিভাইসটি লগইন / আউট, স্থগিত / জাগ্রত এবং সংযোগ / সংযোগ-সংযোগ করার পরেও এই পদ্ধতিরটি এক্সপুট সেটিংসকে স্থির করে তোলে।
আমার কাছে একটি থিঙ্কপ্যাড কমপ্যাক্ট ব্লুটুথ কীবোর্ড রয়েছে এবং আমি যখনই কীবোর্ডটিকে ট্র্যাকপয়েন্টের গতি সামঞ্জস্য করতে সংযুক্ত করা হয় তখনই একটি এক্সপিন্ট কমান্ড চালাতে চাই। পদক্ষেপগুলি এখানে।
গিথুব ব্লুটুথ-রুনার থেকে কোড ডাউনলোড করুন । ক্রেডিটগুলি এখানে দেওয়া হয়েছিল কে প্রথমে এটি রাস্পবেরি পাই এর জন্য লিখেছিল। আপনার কাস্টম কোম্যান্ডস চালাতে কোডের নিম্নলিখিত বিভাগটি সংশোধন করুন।
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
উবুন্টু মেনু থেকে আগুন জ্বলুন। আপনার স্ক্রিপ্টগুলি শুরুতে যুক্ত করুন Add
এখন, কেবলমাত্র একটি সমস্যা বাকি আছে, আপনি লগইন করার সময়, স্ক্রিপ্টগুলি সম্ভবত প্রথম ব্লুটুথ ইভেন্টটি ধরতে পারে না । এটি কারণ আপনার স্ক্রিপ্টটি পটভূমিতে আরম্ভ করার আগে আপনার ব্লুটুথ ডিভাইস সংযুক্ত থাকতে পারে।
এটি সমাধানের জন্য আপনার কাস্টম কমান্ডটি সরাসরি এতে যুক্ত করুন Startup Applications
। আমার ক্ষেত্রে এটি অনুসরণ আদেশটি:
xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
এবং এখন আপনি উবুন্টু দিয়ে আপনার ব্লুটুথ ডিভাইস উপভোগ করতে পারবেন।
আপনি যখন লিখেন "যখন আপনার হেডসেটটি আপনার কম্পিউটারের সাথে সংযুক্ত হয়"। কীভাবে এটি স্বয়ংক্রিয়ভাবে হয়? যখন আপনাকে এটিকে ম্যানুয়ালি ট্রিগার করতে হবে, আপনি সম্ভবত এটি একটি স্ক্রিপ্ট তৈরি করতে পারেন এবং তারপরে সংযোগ স্থাপনের পরে আপনার স্ক্রিপ্টটি চালান run আমি আমার ব্লুটুথ রিসিভারে ডিফল্ট আউটপুট ডিভাইস সেট করতে এটিই করেছি (যাতে আমি হার্ডওয়্যার কীগুলির সাহায্যে ভলিউমটি পরিবর্তন করতে পারি):
bluetooth-connect && pactl set-default-sink bluez_sink.0C_A6_94_9A_37_4D
যেখানে bluetooth-connect
দেখতে এটির মতো দেখায়: https://github.com/sblask/dotfiles/blob/c39d37ad67947b358b4a079cb41ae6f9e4a081d8/.bin/bluetuth-connect.symlink এটি ধরেছে যে সবকিছু জুটিবদ্ধ হয়েছে এবং সংযোগের জন্য প্রস্তুত। আপনি ব্ল্যাকম্যানে বা pacmd list-sinks | grep -e 'name:' -e 'index'
ব্লুটুথ ডিভাইস সংযুক্ত হওয়ার পরে দৌড়ে ম্যাকের ঠিকানাটি খুঁজে পান । আপনি রান চান bluetooth-connect && your-script
। your-script
সংযোগটি সফলভাবে প্রতিষ্ঠিত হলেই চালানো হবে।