dbus NetworkManager:在 Java 中提供“/”作为 DBusInterface 参数

Posted

技术标签:

【中文标题】dbus NetworkManager:在 Java 中提供“/”作为 DBusInterface 参数【英文标题】:dbus NetworkManager: supply "/" as DBusInterface parameter in Java 【发布时间】:2020-03-22 12:10:01 【问题描述】:

用于激活与ActivateConnection 的无线连接的documentation 表示您可以提供"/" 作为第二个和第三个参数,让dbus 为您选择合理的默认值。

由于Java 中函数的绑定类型为DBusInterface,你是如何做到的?你很难写(DBusInterface)"/",可以吗?

如果有人能回答以上问题,我将不胜感激。对于在该领域有更多时间或知识的人来说,我试图解决的真正问题是我对ActivateConnection 的调用失败了。这是我导致崩溃的代码。它引用了this interface。

            var nmIface = (NetworkManagerIface) instance.getRemoteObject(NetworkManagerIface._NM_IFACE, NetworkManagerIface._NM_PATH, NetworkManagerIface.class);
            System.out.println("Connect:" + connMatch.getObjectPath());
            System.out.println("Adaptor:" + adaptor.getObjectPath());
            System.out.println("AccessP:" + accessMatch.getObjectPath());
            for (DBusPath devName : nmIface.GetDevices()) 
                System.out.println("   Device:" + devName.getPath());
            
            nmIface.ActivateConnection(connMatch, adaptor, accessMatch);

并产生这个输出(由 SO 插入颜色):

Connect:/org/freedesktop/NetworkManager/Settings/4
Adaptor:/org/freedesktop/NetworkManager/Devices/3
AccessP:/org/freedesktop/NetworkManager/AccessPoint/248
   Device:/org/freedesktop/NetworkManager/Devices/1
   Device:/org/freedesktop/NetworkManager/Devices/2
   Device:/org/freedesktop/NetworkManager/Devices/3
Exception in thread "JavaFX Application Thread" org.freedesktop.dbus.exceptions.DBusExecutionException: Failed to construct D-Bus type: Not an object exported or imported by this connection at org.freedesktop.dbus.RemoteInvocationHandler.executeRemoteMethod(RemoteInvocationHandler.java:102)
        at org.freedesktop.dbus.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:228)
        at com.sun.proxy.$Proxy23.ActivateConnection(Unknown Source)
        at com.mycompany.Wifi.activateConnection(Wifi.java:322)

如果有人能指点一下可能有什么问题,我将更加感激。

【问题讨论】:

【参考方案1】:

您的绑定几乎肯定是错误的。如果我们查看Activate Connection 的文档,我们会看到它具有以下参数:

ActivateConnection (IN  o connection,
                    IN  o device,
                    IN  o specific_object,
                    OUT o active_connection);

本例中的 'o' 告诉您此参数类型是什么。类型在DBus specification 中指定,但出于我们的目的,我们只需要知道'o' 表示此参数是一个对象路径。这将对应于 dbus-java 中的类型 Path(如果您使用的是 2.7 绑定)或 DBusPath 如果您使用的是 hypfvieh 更新的 3.2 绑定。

当前类型是:

public DBusInterface ActivateConnection(DBusInterface connection, DBusInterface device, DBusInterface specific_object);

但考虑到“o”的实际含义,这应该是:

public DBusInterface ActivateConnection(DBusPath connection, DBusPath device, DBusPath specific_object);

更好的解决方案是使用 dbus-java 的 CreateInterface 程序(hypfvieh 的版本)来获取 introspection XML 并自动为您创建此类。

【讨论】:

我理解你所说的意思,我也有同样的想法,但是:* hypfvieh 的 org.freedesktop.dbus.utils.generator.InterfaceCodeGenerator (org.freedesktop.dbus.bin.CreateInterface已弃用)生成 o => DBusInterface * 在 GitHub 上搜索 ActivateConnection;它的参数总是DBusInterface。其中可能存在一定程度的回声室,但总是?我会尝试DBusPath,但这需要对我的代码进行一些调整。 您可能是对的,因为在我的 OP (for (DBusPath devName : nmIface.GetDevices())) 循环中,我最初编写了 for (DBusInterface devName : nmIface.GetDevices()),但出现运行时错误,提示无法将 DBusPath 强制转换为 DBusInterface。 GetDevices 的返回类型为 aoo 的数组),所以看起来无论 XML 有什么内省,o 可能真的是 DBusPath 我不敢相信,但你是对的,所有那些 repos 和代码示例都是错误的。 ActivateConnectionAddAndActivateConnection 都需要 DBusPath 参数而不是 DBusInterface;或者,更具体地说,如果它们被输入 DBusInterface 参数,则崩溃,但如果它们被输入 DBusPath 参数,则不会崩溃。

以上是关于dbus NetworkManager:在 Java 中提供“/”作为 DBusInterface 参数的主要内容,如果未能解决你的问题,请参考以下文章

e NetworkManager *** 连接的 dbus 信号处理程序

您如何真正使用 dbus 从 NetworkManager 获取可见 SSID 列表?

dbus NetworkManager:在 Java 中提供“/”作为 DBusInterface 参数

NetworkManager 和 Qt 问题

找不到 NetworkManager 的 getProperties 方法

linux进程管理杂记