डब-मॉनिटर आउटपुट कैसे पढ़ें?


20

मैं dbus- मॉनीटर के साथ खेलने की कोशिश कर रहा हूं और समझने की कोशिश कर रहा हूं कि Ubuntu के वातावरण में 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. मैंने वॉल्यूम-नियंत्रण और सूचनाओं के बीच संबंध के बारे में कुछ देखा। मैं dbus- मॉनीटर आउटपुट से जो भी पढ़ता हूं

    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 ट्यूटोरियल देखा है और यह सिखाता है कि सभी संकेतों को कैसे सुनना है (न तो इंटरफ़ेस और न ही पथ आदि को निर्दिष्ट करके) लेकिन कैसे तरीकों को ट्रैक करना है जब उन्हें बुलाया जाता है, जैसे dbus-monitor करता है?

यदि आपके पास यह सिखाने का धैर्य है कि यह कैसे काम करता है, तो आपका स्वागत है।

जवाबों:


24

डी-बस परिचय

  • डी-बस सेवाओं के बीच संचार के लिए साधन प्रदान करता है । सेवाएँ अनाम हो सकती हैं (बस पते द्वारा पूरी तरह से पहचानी जाती हैं, जैसे: 1.6), और सेवाएँ प्रसिद्ध नामों को पसंद org.freedesktop.Notificationsकर सकती हैं , जैसे या org.freedesktop.NetworkManager। प्रेषक और गंतव्य जो आप लॉग में देख सकते हैं वे सेवाएं हैं। "नल गंतव्य" का अर्थ है प्रसारण: सभी सेवाओं के लिए वितरण।

  • एक सेवा बस में एक या कई वस्तुओं का निर्यात कर सकती है । ऑब्जेक्ट को ऑब्जेक्ट पथ दिए जाते हैं , जैसे /org/freedesktop/NetworkManager/ActiveConnection/1या /org/ayatana/menu/DA00003। ऑब्जेक्ट पथ स्लैश को विभाजक के रूप में उपयोग करते हैं, जैसे फाइल सिस्टम पथ।

  • प्रत्येक वस्तु एक या कई इंटरफेस का समर्थन कर सकती है । एक इंटरफ़ेस विधियों और संकेतों के एक सेट से अधिक कुछ भी नहीं है, आम तौर पर सदस्यों के रूप में जाना जाता है (बहुत ओओपी इंटरफ़ेस के समान)। विधियों और संकेतों के पास निश्चित हस्ताक्षर हैं। सदस्यों को हमेशा प्रसिद्ध इंटरफ़ेस नामों के नाम दिए गए हैं।

  • एक बार प्रकाशित होने के बाद, प्रसिद्ध नाम कभी नहीं बदलते हैं

  • कोई भी सेवा किसी अन्य सेवा के संकेतों से जुड़ सकती है और एसिंक्रोनस रूप से इसके तरीकों को कॉल कर सकती है। कोई भी सेवा संकेतों का उत्सर्जन कर सकती है।

सिग्नल

अब आपके विशिष्ट प्रश्नों के लिए।

संकेत भेजने वाला =: 1.1948 -> भाग्य = (शून्य गंतव्य) धारावाहिक = 1829990 पथ = / org / ayatana / menu / DA00003; इंटरफ़ेस = org.ayatana.dbusmenu; सदस्य = ItemPropertyUpdated
int32 23
स्ट्रिंग "सक्षम"
वेरिएंट बूलियन सच

हां, आप सही हैं, यह एक संकेत है। यह सेवा द्वारा प्रसारित किया जाता है :1.1948, और "स्व" ऑब्जेक्ट है /org/ayatana/menu/DA00003। संकेत का नाम है ItemPropertyUpdatedजो इंटरफ़ेस में परिभाषित किया गया है org.ayatana.dbusmenu(जैसे org.ayatana.dbusmenu::ItemPropertyUpdatedC ++)। मुझे लगता है कि धारावाहिक, बस में इस घटना का एक अनूठा पहचानकर्ता है।

तब हम संकेत तर्क देखते हैं। इंटरफ़ेस प्रलेखन के अनुसार , पहला इंट 32 तर्क एक आइटम आईडी है, दूसरा स्ट्रिंग इसकी संपत्ति का नाम है, और तीसरा संस्करण संपत्ति मूल्य है। इसलिए, /org/ayatana/menu/DA00003ऑब्जेक्ट हमें सूचित कर रहा है कि आइटम आईडी # 23 ने अपनी enabledसंपत्ति को सच में बदल दिया ।


संकेतों पर एक और उदाहरण:

संकेत प्रेषक =: 1.1602 -> गंतव्य = (शून्य गंतव्य) धारावाहिक = 20408 पथ = / im / pidgin / बैंगनी / PurpleObject; इंटरफ़ेस = im.pidgin.purple.PurpleInterface; सदस्य = SendingChatMsg
   int32 47893
   स्ट्रिंग "परीक्षण"
   uint32 १
संकेत प्रेषक =: 1.1602 -> गंतव्य = (शून्य गंतव्य) धारावाहिक = 20409 पथ = / im / pidgin / बैंगनी / PurpleObject; इंटरफ़ेस = im.pidgin.purple.PurpleInterface; सदस्य = IrcSendingText
   int32 64170
   string "PRIVMSG #chat: परीक्षण

मैंने एक IRC चैनल को Pidgin का उपयोग करके एक पाठ संदेश "परीक्षण" भेजा, और इंटरफ़ेस के /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

धन्यवाद :) यह बहुत कुछ स्पष्ट करता है। यह किसी तरह मज़ेदार है कि प्रेषक गुमनाम हो सकते हैं, जब मैं DFeet का उपयोग करता हूं, तो प्रत्येक प्रेषक के अनुरूप एक प्रक्रिया नाम होता है, लेकिन यह dbus- मॉनिटर आउटपुट में प्रतिबिंबित नहीं होता है। क्या प्रक्रियाओं का पता लगाया जा सकता है? अब पायथन के साथ मैंने देखा है कि मैं सिग्नल भेज सकता हूं या विधियां प्रदान कर सकता हूं या अन्य पार्टियों के तरीकों को ट्रिगर कर सकता हूं। क्या तरीकों को रोकना भी संभव है? मान लीजिए कि मैं यह देखना चाहता हूं कि क्या प्रोग्राम A, B की 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()

आशा है कि यह किसी की मदद करता है, क्योंकि ऐसा लगता है कि dbus संदेशों की निगरानी से संबंधित कई सरल अजगर उदाहरण नहीं हैं।


1
यह निश्चित रूप से मेरी मदद की! आपका बहुत बहुत धन्यवाद! आपके लिए कुछ सुझाव: "type = 'method_call'" आवश्यक नहीं है, क्योंकि सूचनाएँ केवल मेथड कॉल का उपयोग करती हैं। युक्ति में कोई संकेत नहीं। इसके अलावा, "सदस्य = 'सूचित करें'" भी आवश्यक नहीं है, क्योंकि आप पहले से ही अपने फ़ंक्शन में फ़िल्टर कर रहे हैं (और, जैसा कि आपने सही कहा, आप पहले NameAquiredसंदेश के कारण इससे बच नहीं सकते )
MestreLion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.