如何通过 DBus 用 java 发送 sv?

Posted

技术标签:

【中文标题】如何通过 DBus 用 java 发送 sv?【英文标题】:How to send asv with java through DBus?如何通过 DBus 用 java 发送 sv? 【发布时间】:2019-01-10 04:47:26 【问题描述】:

我的目标是在 DBus 上发送一个键值字典,接收并处理它。

我创建了字典并添加了一些值:

        Map<String, Variant<?>> argumentsToSend = new HashMap<String, Variant<?>>();        
        argumentsToSend.put("arg1", new Variant<Integer>(111));
        argumentsToSend.put("arg2", new Variant<Integer>(222));

        proxy.getObject().useTheseArgs(argumentsToSend);

字典已发送,但在接收端它被视为 sv 而不是 sv。

(process:10144): GLib-CRITICAL **: GVariant 格式字符串“asv”的类型为“asv”,但给定值的类型为“sv”

我错过了什么?

【问题讨论】:

【参考方案1】:

要确定您发送的消息的类型,您需要解码签名(您拥有的asv)。下面是一个快速细分:

a = 数组(列表)

sv = 字符串字典

因此,由于我们将 asv 作为我们的签名,并且 dbus-javajava.util.list 转换为 DBus 数组,因此您只需将代码更改为如下所示:

    List<Map<String, Variant<?>>> argumentsToSend = new ArrayList<>();
    argumentsToSend.add( new HashMap<String, Variant<?>>() );
    argumentsToSend.add( new HashMap<String, Variant<?>>() );
    argumentsToSend.get(0).put("arg1", new Variant<Integer>(111));
    argumentsToSend.get(1).put("arg2", new Variant<Integer>(222));

    proxy.getObject().useTheseArgs(argumentsToSend);

关于类型的更多信息(其中还包括一个asv 示例):https://rm5248.com/d-bus-tutorial/

【讨论】:

以上是关于如何通过 DBus 用 java 发送 sv?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 dbus-send 发送方法调用?

如何通过 dbus 调用 varargs 函数?

如何从 Python 将无符号值发送到 dBus

如何接收使用 dbus 作为信号发送的结构?

Bluez(蓝牙)在连接时没有发送 DBUS method_call SelectConfiguration 吗?如果是这样,我该如何抓住它?

如何在 python-dbus 中将类作为数据类型处理