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

问题描述

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

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

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

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

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

Application A订阅 signal_10signal_15,它们分别包含来自传感器 10 和 15 的 data1,datan,而 Application B 只会订阅 {{1} }.

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

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

signal_10

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

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

尽管我可以手动将所有 +200 传感器定义到自省 XML 中,但我觉得它并不优雅。 有没有一种方法可以定义一个信号,使其可重复用于定义多个信号?类似于 C 编程中的 <signal name="changed_value_%ID%"> <arg type="s" name="change_source_name" direction="out"/> </signal> 或通过任何其他方式。

注意事项:

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

解决方法

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

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

如果所有信号签名都相同,只有名称会有所不同,我会考虑只使用一个信号并在该信号中提供传感器 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,以便它只接收它感兴趣的传感器的信号。