ডিবিস-মনিটর আউটপুট কীভাবে পড়বেন?


20

উবুন্টু পরিবেশে dbus কীভাবে কাজ করছে তা বোঝার জন্য আমি dbus- মনিটরের সাথে চারপাশে খেলছি । এই বিষয়ে আমার বেশ কয়েকটি প্রশ্ন রয়েছে:

  1. আপনি কি দয়া করে আমাকে নীচের সঠিকভাবে পড়বেন তা জানাতে পারেন? আমি বড় ধারণাটি বুঝতে পারি, তবে বিশদটি নয়।

    signal sender=:1.1948 -> dest=(null destination) serial=1829990 path=/org/ayatana/menu/DA00003; interface=org.ayatana.dbusmenu; member=ItemPropertyUpdated
    int32 23
    string "enabled"
    variant boolean true
    method call sender=:1.6 -> dest=org.freedesktop.Notifications serial=1399 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications;
    member=GetCapabilities
    

    আমি পেয়েছি যে প্রথমটি একটি সিগন্যাল এবং দ্বিতীয়টি একটি পদ্ধতি। গন্তব্য মানে কি কোনও সংকেতের জন্য নির্দিষ্ট প্রাপক / স্লট থাকতে পারে? সদস্য কী ? এবং তালিকার আইটেমগুলি কি সিগন্যালের পরে যুক্তিগুলি সিগন্যালে পাস হয়? কি কি প্রেরক এবং ধারাবাহিক ?

  2. আমি ভলিউম-নিয়ন্ত্রণ এবং বিজ্ঞপ্তিগুলির মধ্যে সম্পর্ক সম্পর্কে কিছু লক্ষ্য করেছি। আমি ডিবিস-মনিটর আউটপুট থেকে যা পড়েছি তা থেকে

    method call sender=:1.6 -> dest=org.freedesktop.Notifications serial=1400 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
    string "gnome-settings-daemon"
    uint32 0
    string "notification-audio-volume-medium"
    string " "
    string ""
    array [
    ]
    array [
    dict entry(
    string "value"
    variant int32 38
    )
    dict entry(
    string "x-canonical-private-synchronous"
    variant string "volume"
    )
    ]
    int32 -1
    

    দেখে মনে হচ্ছে যে বিজ্ঞপ্তিটি তার পদ্ধতি দ্বারা ট্রিগার করা হয়েছে। আমি কেন সত্যিই বুঝতে পারি না কেন এটি এইভাবে কাজ করে। আমার দৃষ্টিতে এটি যদি আরও সূচিত হয় যে "প্রজ্ঞাপন-অডিও-ভলিউম-মাঝারি" প্রেরণকারী একটি সংকেত উপস্থিত ছিল এবং বিজ্ঞপ্তিটি এই সংকেতটি শুনবে এবং সে অনুযায়ী প্রতিক্রিয়া জানাবে। যদি প্রেরণ / গ্রহণ ব্যক্তিগতের পরিবর্তে সর্বজনীন হয়, তবে এটি কি আরও নমনীয়তা এবং দক্ষতার অনুমতি দেবে না? উদাহরণস্বরূপ যদি "নোটিফিকেশন-অডিও-ভলিউম-মিডিয়াম" এর জন্য সর্বজনীন সংকেত থাকে তারপরে বেশ কয়েকটি অ্যাপ্লিকেশন এই সংকেতটি শুনতে পারে (যা প্রতিযোগিতামূলক বিজ্ঞপ্তি অ্যাপ্লিকেশনগুলিকে অস্তিত্বে আসার অনুমতি দেয়) এবং বিকাশকারীরা কেবল সিগন্যাল প্রেরণে উদ্বিগ্ন হতে হবে, যখন একটি সংকেত বাছাই করা এবং পরিচালনা করা হ'ল নোটিফিকেশন অ্যাপ্লিকেশনটির ব্যবসা (বা অন্য কোনও বিষয়) প্রোগ্রাম যা এই সংকেত প্রয়োজন)।

  3. আমি ডিবাসের জন্য কেবল নতুন এবং আমি পাইথনে ডিবাসের সাথে কাজ করছি, প্রধানত কিছু অ্যাপলেট বিকাশের জন্য আরও শিখতে চাই। আমি dbus-python টিউটোরিয়াল দেখেছি এবং এটি শিখিয়েছে কীভাবে সমস্ত সংকেত শুনতে হবে (ইন্টারফেস বা পাথ উভয়ই উল্লেখ না করে) তবে কীভাবে পদ্ধতিগুলি ডাকা হয় যখন ডাবাস-মনিটর করে?

কীভাবে এটি কাজ করে তা শেখানোর ধৈর্য যদি আপনার হয় তবে আপনাকে স্বাগতম।

উত্তর:


24

ডি-বাস পরিচয়

  • ডি-বাস পরিষেবাগুলির মধ্যে যোগাযোগের জন্য উপায় সরবরাহ করে । পরিষেবাদিগুলি বেনামে থাকতে পারে (একমাত্র বাসের ঠিকানার মাধ্যমে সনাক্ত করা যায়: যেমন: 1.6) এবং পরিষেবাগুলি সুপরিচিত নামগুলি পছন্দ করতে পারে org.freedesktop.Notificationsবা পছন্দ করতে পারে org.freedesktop.NetworkManager। প্রেরক এবং গন্তব্য যা আপনি লগগুলিতে দেখতে পাচ্ছেন সেগুলি হ'ল পরিষেবা। "নাল গন্তব্য" এর অর্থ ব্রডকাস্ট: সমস্ত পরিষেবাতে সরবরাহ।

  • একটি পরিষেবা বাসে এক বা একাধিক বস্তু রফতানি করতে পারে। অবজেক্টগুলিকে অবজেক্ট পাথ দেওয়া হয় , যেমন /org/freedesktop/NetworkManager/ActiveConnection/1বা /org/ayatana/menu/DA00003। অবজেক্ট পাথগুলি ফাইল সিস্টেমের পাথের মতো বিভাজক হিসাবে স্ল্যাশ ব্যবহার করে।

  • প্রতিটি বস্তু এক বা একাধিক ইন্টারফেস সমর্থন করতে পারে । একটি ইন্টারফেস পদ্ধতি এবং সিগন্যালের একটি সেট ছাড়া আর কিছুই নয়, স্বতঃস্ফূর্তভাবে সদস্য হিসাবে পরিচিত ( ওওপি ইন্টারফেসের সাথে খুব মিল)। পদ্ধতি এবং সংকেতের স্থির স্বাক্ষর রয়েছে। সদস্যরা সর্বদা সুপরিচিত ইন্টারফেসের নামগুলির মধ্যে নাম স্পেস থাকে।

  • একবার প্রকাশিত হলে সুপরিচিত নাম কখনও পরিবর্তন হয় না

  • যে কোনও পরিষেবা অন্য পরিষেবার সিগন্যালের সাথে সংযুক্ত হতে পারে এবং অ্যাসিঙ্ক্রোনিকভাবে এর পদ্ধতিগুলি কল করতে পারে। যে কোনও পরিষেবা সংকেত নির্গত করতে পারে।

সংকেত

এখন আপনার নির্দিষ্ট প্রশ্ন।

সংকেত প্রেরক =: 1.1948 -> গন্তব্য = (নাল গন্তব্য) সিরিয়াল = 1829990 পাথ = / org / আয়না / মেনু / DA00003; ইন্টারফেস = org.ayatana.dbusmenu; সদস্য = ItemPropertyUpdated
int32 23
স্ট্রিং "সক্ষম"
বৈকল্পিক বুলিয়ান সত্য

হ্যাঁ, আপনি ঠিক বলেছেন, এটি একটি সংকেত। এটি পরিষেবা দ্বারা সম্প্রচারিত :1.1948, এবং "স্ব" অবজেক্টটি /org/ayatana/menu/DA00003। সিগন্যালের নাম রয়েছে ItemPropertyUpdatedযা ইন্টারফেসে সংজ্ঞায়িত করা হয় org.ayatana.dbusmenu( org.ayatana.dbusmenu::ItemPropertyUpdatedসি ++ এর মতো)। আমার ধারণা, সিরিয়ালটি বাসের ইভেন্টের এক ধরণের অনন্য পরিচয়দাতা।

তারপরে আমরা সংকেত যুক্তিগুলি দেখতে পাই। ইন্টারফেস ডকুমেন্টেশন অনুসারে , প্রথম ইন্ট 32 আর্গুমেন্টটি কোনও আইটেমের আইডি, দ্বিতীয় স্ট্রিংটি তার সম্পত্তির নাম এবং তৃতীয় রূপটি সম্পত্তি মান। সুতরাং, /org/ayatana/menu/DA00003বস্তুটি আমাদের অবহিত করছে যে আইডি # 23 আইডিটি তার enabledসম্পত্তিটিকে সত্যে পরিবর্তন করেছে ।


সিগন্যালের উপর আরেকটি উদাহরণ:

সংকেত প্রেরক =: 1.1602 -> গন্তব্য = (নাল গন্তব্য) সিরিয়াল = 20408 পাথ = / আইএম / পিডগিন / বেগুনি / বেগুনি অবজেক্ট; ইন্টারফেস = im.pidgin.purple.PurpleInterface; সদস্য = SendingChatMsg
   int32 47893
   স্ট্রিং "পরীক্ষা"
   uint32 1
সিগন্যাল প্রেরক =: 1.1602 -> গন্তব্য = (নাল গন্তব্য) সিরিয়াল = 20409 পাথ = / আইএম / পিডজিন / বেগুনি / বেগুনি অবজেক্ট; ইন্টারফেস = im.pidgin.purple.PurpleInterface; সদস্য = IrcSendingText
   int32 64170
   স্ট্রিং "PRIVMSG # চ্যাট: পরীক্ষা

আমি একটি আইআরসি চ্যানেলে পিডগিন ব্যবহার করে একটি পাঠ্য বার্তা "পরীক্ষা" প্রেরণ করেছি, এবং ইন্টারফেসের /im/pidgin/purple/PurpleObjectঅধীনে দুটি সংকেত নির্গত করেছি im.pidgin.purple.PurpleInterface: প্রথমে একটি সাধারণ SendingChatMsg, তারপরে আরও নির্দিষ্ট IrcSendingText

পদ্ধতি

এখন পদ্ধতি। পদ্ধতিগুলি হ'ল ডি-বাস অবজেক্টকে কিছু করার জন্য জিজ্ঞাসা করা, বা কিছু জিজ্ঞাসা করা এবং ডেটা ফেরানোর উপায়। এগুলি ডি-বাস পদ্ধতিগুলিকে অবিচ্ছিন্নভাবে বলা ছাড়া ক্লাসিক ওওপি পদ্ধতির সাথে বেশ মিল।

আসুন প্রোগ্রামিংভাবে একটি ডি-বাস পদ্ধতি কল করি।

import dbus, dbus.proxies

#-- connect to the session bus (as opposed to the system bus)
session = dbus.SessionBus()

#-- create proxy object of D-Bus object
obj_proxy = dbus.proxies.ProxyObject(conn=session,
         bus_name="org.freedesktop.Notifications",     #-- name of the service we are retrieving object from
         object_path="/org/freedesktop/Notifications") #-- the object path

#-- create proxy object of the D-Bus object wrapped into specific interface
intf_proxy = dbus.proxies.Interface(obj_proxy, "org.freedesktop.Notifications")

#-- lastly, create proxy object of the D-Bus method
method_proxy = intf_proxy.get_dbus_method("Notify")

#-- ... and call the method
method_proxy("test from python",
             dbus.UInt32(0),
             "bluetooth",     #-- icon name
             "Notification summary",
             "Here goes notification body",
             [], {},
             5) #-- timeout

যুক্তিগুলি বিশেষত আইকনের নামটি নোট করুন। আপনার উদাহরণে "notification-audio-volume-medium"মাঝারি শক্তি চালিত ভলিউম স্পিকারের আইকন ছিল।

কাস্টম সেবা

আপনার নিজস্ব ডি-বাস পরিষেবা চালানো, আপনার নিজস্ব ডি-বাস অবজেক্টগুলি রফতানি করা এবং আপনার নিজস্ব পদ্ধতি এবং সংকেত দিয়ে আপনার নিজস্ব ডি-বাস ইন্টারফেস সংজ্ঞায়িত করা একেবারেই সম্ভব। সামগ্রিক ধারণাটি উপলব্ধি করার পরে এবং dbusমডিউল ডকুমেন্টেশন পড়ার পরে পাইথনে এটি খুব সহজেই করা যায় ।:)


আলোচনাটি স্বাগত, যদিও আমি দু'একদিনের মধ্যে নাও পেতাম।
ulidtko

ধন্যবাদ :) এটি অনেক স্পষ্ট করে। এটি একরকম মজার বিষয় যে প্রেরকরা বেনামে থাকতে পারে, যখন আমি ডিফিট ব্যবহার করি, প্রতিটি প্রেরকের সাথে সম্পর্কিত একটি প্রক্রিয়া নাম রয়েছে, তবে এটি ডিবিস-মনিটরের আউটপুটটিতে প্রতিফলিত হয় না। প্রক্রিয়াগুলি সনাক্ত করা যাবে? পাইথনের সাহায্যে আমি দেখেছি আমি সিগন্যাল পাঠাতে বা পদ্ধতি সরবরাহ করতে বা অন্যান্য পক্ষের পদ্ধতিগুলিকে ট্রিগার করতে পারি। পদ্ধতিগুলি বাধা দেওয়া কি সম্ভব? ধরুন আমি দেখতে চাই প্রোগ্রাম A বি এর Dbus পদ্ধতিটি ট্রিগার করে এবং এটি দিয়ে কিছু করে?
বেনিয়ামিন

বিজ্ঞপ্তিগুলি সম্পর্কে: নোটিফাই-ওএসডি সক্রিয়ভাবে সংকেত সন্ধানের পরিবর্তে অন্যান্য অ্যাপ্লিকেশনগুলির দ্বারা প্যাসিভলি ট্রিগার করা হয়। এটি কি অবাস্তব নয় বা আমি ডাবাস সম্পর্কে কিছু ভুল বুঝি না? আমি এমন একটি অ্যাপ্লিকেশন তৈরি করতে চাই যা বিজ্ঞপ্তি-ওএসডি প্রতিস্থাপন করবে এবং এক ধরণের ইনবক্সে বিজ্ঞপ্তি সংগ্রহ করবে। আমি কি তখন সিগন্যাল শুনে বিজ্ঞপ্তিগুলি বাধা দিতে পারি?
বেনিয়ামিন

@ বেঞ্জামিন, ভাল, যখন আপনি বিদেশী পরিষেবাগুলিতে নির্দেশিত পদ্ধতি কলগুলি বন্ধ করতে চান, আপনি খুব সম্ভবত একটি ভাঙ্গা নকশার কথা ভাবেন। নোটিফাই-ওএসডি প্রতিস্থাপনের জন্য আপনার যা করা উচিত তা হ'ল একটি প্রোগ্রাম লিখুন যা পরিষেবা সরবরাহ করে org.freedesktop.Notifications। এই পরিষেবাটিতে সমস্ত পদ্ধতি কলগুলি এইভাবে আপনার কোড দ্বারা পরিচালিত হবে।
ulidtko

"স্ব" অবলম্বন কী?
কাওয়িং-চিউ

10

আমি পাইথন স্ক্রিপ্ট দিয়ে ডাবাসের মাধ্যমে ডেস্কটপ বিজ্ঞপ্তিগুলি সংগ্রহ করার সমাধানও খুঁজছিলাম। গুগলিংয়ের সাথে এই প্রশ্নটি আমার কাছে সবচেয়ে কাছের ছিল, তবে বিজ্ঞপ্তি-ওএসডি-র প্রতিস্থাপন লেখাকে ওভারকিলের মতো মনে হয়েছিল :)

এ খুঁজছি সাম্প্রতিক-বিজ্ঞপ্তিগুলি অ্যাপলেট সূত্র আমি কিছু নির্দেশ কিভাবে dbus, বার্তা নজর পেয়েছিলাম এবং এখানে পাইথন বাস্তবায়ন আমি নিয়ে এসেছেন হয়:

import gtk
import dbus
from dbus.mainloop.glib import DBusGMainLoop

def filter_cb(bus, message):
    # the NameAcquired message comes through before match string gets applied
    if message.get_member() != "Notify":
        return
    args = message.get_args_list()
    # args are
    # (app_name, notification_id, icon, summary, body, actions, hints, timeout)
    print("Notification from app '%s'" % args[0])
    print("Summary: %s" % args[3])
    print("Body: %s", args[4])


DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string(
    "type='method_call',interface='org.freedesktop.Notifications',member='Notify'")
bus.add_message_filter(filter_cb)
gtk.main()

আশা করি এটি কাউকে সহায়তা করবে, কারণ মনে হয় ডিবিএস বার্তাগুলি পর্যবেক্ষণের সাথে সম্পর্কিত খুব সাধারণ পাইথন উদাহরণ নেই।


1
এটা অবশ্যই আমাকে সাহায্য করেছে! আপনাকে অনেক ধন্যবাদ! আপনার জন্য কয়েকটি পরামর্শ: "টাইপ = 'মেথড_ক্যাল'" প্রয়োজনীয়তা নয়, যেহেতু বিজ্ঞপ্তিগুলি কেবল মেথড কল ব্যবহার করে। অনুমান কোন সংকেত। এছাড়াও, "সদস্য = 'বিজ্ঞপ্তি'" প্রয়োজনীয় নয়, যেহেতু আপনি ইতিমধ্যে আপনার ফাংশনে এটি ফিল্টার করছেন (এবং যেমনটি আপনি ঠিক বলেছেন, প্রথম NameAquiredবার্তার কারণে আপনি তা এড়াতে পারবেন না )
মাস্ট্রেলিয়ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.