列出来自 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)

D-Bus 信号和 D-Bus 属性有啥区别

.Service 文件 D-Bus

DBUS入门与C编程

DBUS入门与C编程

DBUS入门与C编程