如何在Python中向DBUS公开信号?

时间:2018-12-14 18:41:14

标签: python-3.x dbus

我非常了解如何创建方法-但是,我希望使用Python公开一些信号,以便可以立即调用多个程序。

class Bildschirm(dbus.service.Object):
DBUS_NAME = 'hm.retro.Retro'
DBUS_OBJECT_PATH = '/hm/retro/Retro'
DBUS_INTERFACE = 'hm.retro.Retro'

def __init__(self, _Visio):
    self.Visio = _Visio
    self.bus = dbus.SessionBus()
    bus_name = dbus.service.BusName(self.DBUS_NAME, bus=self.bus)

    super().__init__(bus_name, self.DBUS_OBJECT_PATH)


@dbus.service.method(DBUS_INTERFACE, in_signature='i')
def delta(self, nr):
    weiter = self.Visio.akt_sender_nr
    weiter = (weiter+nr) % SENDER_AM
    self.Visio.akt_sender_nr = weiter
    self.Visio.update_sender_labels()

    self.Visio.screen.force_update()
    self.Visio.screen.draw_next_frame()

@dbus.service.signal(DBUS_INTERFACE)
def config_change_visio(self):
    self.Visio.load_config()
    self.Visio.update_sender_labels()
    self.Visio.update_preset_labels()

    self.Visio.screen.force_update()
    self.Visio.screen.draw_next_frame()

但是,如果我尝试使用dbus-send调用信号:

dbus-send --session --print-reply --dest=hm.retro.Retro /hm/retro/Retro hm.retro.Retro.config_change_visio

我收到一条错误消息:

    Error org.freedesktop.DBus.Error.UnknownMethod: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 654, in _message_cb
    (candidate_method, parent_method) = _method_lookup(self, method_name, interface_name)
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 246, in _method_lookup
    raise UnknownMethodException('%s is not a valid method of interface %s' % (method_name, dbus_interface))
dbus.exceptions.UnknownMethodException: org.freedesktop.DBus.Error.UnknownMethod: Unknown method: config_change_visio is not a valid method of interface hm.retro.Retro

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

如果将--print-reply传递给dbus-send,则表示您要发送的消息类型是方法调用,因为只有方法调用才能得到回复。 dbus-send手册页说:

   --print-reply
       Block for a reply to the message sent, and print any reply received in
       a human-readable form. It also means the message type (--type=) is
       method_call.

从您的--print-reply调用中删除dbus-send参数,并添加--type=signal,它应该可以工作。


请注意,尽管它不会影响此错误,但D-Bus信号名称使用CamelCase而不是underscore_case更为传统。 D-Bus specification说:

  

D-Bus上的会员名称通常由大写字母组成   没有标点的单词(“驼峰式”)。方法名称通常应   是动词,例如GetItems,信号名称通常应该是   事件的描述,例如ItemsChanged。

因此,也许应该将您的信号称为VisioConfigChanged。同样,也许应该将您的方法命名为AddDelta