如何在 d-bus 上定义参数信号?

Posted

技术标签:

【中文标题】如何在 d-bus 上定义参数信号?【英文标题】:How can I define a parametric signal on d-bus? 【发布时间】:2021-03-31 03:03:49 【问题描述】:

我目前正在linux系统中开发传感器信息分发器。我通过 UART 接口接收序列化消息,该接口提供许多传感器的信息,这些信息被分发到在同一系统上运行的各种应用程序。

每个传感器提供相同的信息,但来自不同的地方。

因此从我收到的每个传感器; ID, data1,data2,dataN

运行的应用程序只需要一些特定传感器的信息。这意味着Applications A 可能对传感器 10 和 15 感兴趣,而Application B 可能对传感器 10 感兴趣。

我计划通过 d-BUS 将信息从我的“分销商”发送到应用程序。这意味着

Application A 将订阅 signal_10signal_15,其中分别包含来自传感器 10 和 15 的 data1,data2,dataN,而 Application B 将仅订阅 signal_10

这将允许每个应用程序仅接收相关信息并避免在每个应用程序中解析相关信号。此外,它将允许添加新应用程序并订阅传感器的任何组合。

从我在 dbus 规范中看到的信号名称需要明确定义。

<signal name="changed_value_10">
      <arg type="s" name="change_source_name" direction="out"/>
</signal>

因此定义参数信号是不可能的。我想定义一个通用信号并将其重用于所有传感器。作为概念:

<signal name="changed_value_%ID%">
      <arg type="s" name="change_source_name" direction="out"/>
</signal>

尽管我可以手动将所有 +200 传感器定义到自省 XML 中,但我觉得它并不优雅。 有没有办法定义一个信号,以便可以重复使用它来定义多个信号?类似于 C 编程中的 MACRO 或任何其他方式。

注意事项:

我决定使用 d-bus,因为我对它有点熟悉,并将在系统上运行的其他应用程序中使用它。不过,我愿意接受任何反馈或其他选择。 应用程序是用 C 编写的

【问题讨论】:

【参考方案1】:

尽管我可以手动将所有 +200 传感器定义到自省 XML 中,但我觉得它并不优雅。有没有一种方法可以定义一个信号,以便可以重复使用它来定义多个信号?

没有办法在 GDBus 内省 XML 格式本身中执行宏。您可以使用自定义预处理程序生成 XML 文件,然后将生成的输出传递给 gdbus-codegen

如果所有信号签名都相同,并且只有名称会有所不同,我会考虑只使用一个信号并在该信号中提供传感器 ID 作为参数:

<signal name="changed_value">
      <arg type="s" name="sensor_id" direction="out"/>
      <arg type="s" name="change_source_name" direction="out"/>
</signal>

您的客户端代码可以在其信号订阅中使用arg0 matching,以便它只接收它感兴趣的传感器的信号。

【讨论】:

正是我想要的。不知道这个功能。

以上是关于如何在 d-bus 上定义参数信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有控制台的 Windows 上运行 D-Bus?

D-Bus 信号和 D-Bus 属性有啥区别

如何找到在 D-Bus 接口中公开的方法

从 ObServer 发出的选择性 D-BUS 信号(单播信号)

Qt信号槽如何附带自定义参数

linux 信号如何传递两个参数