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

How can I define a parametric signal on d-bus?

我目前正在 系统中开发一个 传感器信息分发器 。我通过提供许多传感器信息的 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 编写的

Even though I can define all the +200 sensor into the introspection XML by hand, I do not find it elegant. Is there a way to define a signal such a way that it can be reused to define multiple signals?

无法在 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,以便它只接收它感兴趣的传感器的信号。