列出来自 Java 的 d-bus 注册对象
Posted
技术标签:
【中文标题】列出来自 Java 的 d-bus 注册对象【英文标题】:List d-bus registered objects from Java 【发布时间】:2018-12-19 14:19:39 【问题描述】:我想通过 Java 与正在运行的 ModemManager(使用 D-Bus)进行通信。由于 Java 不是开源等原因,搜索显示了很多火焰战争。好吧,这不是我的问题,是吗?由于缺乏使用 Java 总线的示例,我无法启动这个项目。我很高兴至少有一种方法可以例如列出已注册的对象(在系统总线上)及其方法。从这样的起始品脱开始,我将尝试更深入地了解 ModemManager 对象。这是我目前所拥有的:
public interface DummyInterface extends DBusInterface
public static class Connect extends DBusSignal
public final String address;
public Connect(String path, String address)
throws DBusException
super(path, address);
this.address = address;
public static class Disconnect extends DBusSignal
public final String address;
public Disconnect(String path, String address)
throws DBusException
super(path, address);
this.address = address;
package com.emcatron.dbus_test;
import org.freedesktop.dbus.DBusConnection;
import org.freedesktop.dbus.DBusSigHandler;
import org.freedesktop.dbus.DBusSignal;
import org.freedesktop.dbus.exceptions.DBusException;
public class Client implements DBusSigHandler
public void handle(DBusSignal s)
if (s instanceof DummyInterface.Connect)
System.out.println("Got a connect for "
+ ((DummyInterface.Connect) s).address);
else if (s instanceof DummyInterface.Disconnect)
System.out.println("Got a disconnect for "
+ ((DummyInterface.Disconnect) s).address);
public static void main(String[] args)
System.out.println("Creating Connection");
DBusConnection conn = null;
try
conn = DBusConnection
.getConnection(DBusConnection.SYSTEM);
catch (DBusException DBe)
System.out.println("Could not connect to bus");
System.exit(1);
System.out.println("Connected to system DBUS: " + DBusConnection.SYSTEM);
int i = 0;
for (String name: conn.getNames())
System.out.format("name: %d: %s\n", i, name);
try
conn.addSigHandler(DummyInterface.Connect.class,
new Client());
conn.addSigHandler(DummyInterface.Disconnect.class,
new Client());
catch (DBusException DBe)
conn.disconnect();
System.exit(1);
所以我确实得到了一个连接,输出类似于: 连接到系统 DBUS:0 名称:0::1.700
下次我运行它时,它将是 1.701 但是:深入注册对象的下一步是什么????
【问题讨论】:
顺便说一下,据我记忆,OpenJDK 自 2006 年以来一直处于 GPL 版本 2 下,但存在类路径异常。 【参考方案1】:getNames
调用正在返回您自己的 d-bus 连接的名称,因此在这里没有用处。
在 d-bus 中,每个服务都有一个 busname,在该总线名下有一个 objects 列表,每个对象都有一个 interfaces 列表>。您可以使用d-feet
等工具来探索您机器上的总线名称、对象和接口。
要访问特定接口,您可以调用getRemoteObject
并指定总线名称、objectPath 和接口类。例如
dbus = conn.getRemoteObject("org.freedesktop.DBus", "/", DBus.class)
这个特定的接口是用来获取所有总线名称列表的接口:
dbus.ListNames()
获取对象列表要困难得多,需要在根对象/
上使用org.freedesktop.Introspectable
接口,然后解析XML 以确定子节点是什么。但大多数服务都有众所周知的对象和接口,因此您应该能够使用getRemoteObject
直接访问它们。
【讨论】:
以上是关于列出来自 Java 的 d-bus 注册对象的主要内容,如果未能解决你的问题,请参考以下文章
编译rv1.8 app/dbserve时报错:No package ‘dbus-1‘ found(D-Bus是什么?)(如何安装和使用D-Bus?)(缺少librkdb.so)