从 DBUS org.freedesktop.dbus 和 java 获取数据

我尝试从 dbus 服务获取一些数据并在 Java 中使用它。


我可以使用以下命令在 cli 中获取信息:


dbus-send --print-reply --system --dest=com.victronenergy.solarcharger.ttyUSB0 /Dc/0/Voltage com.victronenergy.BusItem.GetValue

结果是:


method return time=1538903662.321580 sender=:1.14 -> destination=:1.806 serial=335692 reply_serial=2

variant       double 13.43

我试图用 Java 获取这些数据的是:


经过数小时的阅读,我创建了一个界面。


package javadbus;


import java.util.Map;

import org.freedesktop.dbus.DBusInterface;

import org.freedesktop.dbus.DBusSignal;

import org.freedesktop.dbus.Variant;

import org.freedesktop.dbus.exceptions.DBusException;

public interface BusItem extends DBusInterface

{

   public static class PropertiesChanged extends DBusSignal

   {

      public final Map<String,Variant> changes;

      public PropertiesChanged(String path, Map<String,Variant> changes) throws DBusException

      {

         super(path, changes);

         this.changes = changes;

      }

   }


  public String GetDescription(String language, int length);

  public Variant GetValue();

  public String GetText();

  public int SetValue(Variant value);

  public Variant GetMin();

  public Variant GetMax();

  public int SetDefault();

  public Variant GetDefault();


}

在这里,我成功调用了 getConnection() 和 getRemoteObject()。


package javadbus;

import org.freedesktop.dbus.DBusConnection;

import org.freedesktop.dbus.exceptions.DBusException;

import org.freedesktop.dbus.Variant;


public class VictronEnergyDBusSolarCharger {


private String port;

private DBusConnection conn;


public VictronEnergyDBusSolarCharger(String port) {

    this.port = port;

    try {

        this.conn = DBusConnection.getConnection(DBusConnection.SYSTEM);

    } catch (DBusException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

是否有必要实现此方法 GetValue?但是为什么例如我应该怎么做呢?我只想获取此信息,而不是像服务器一样提供它。


慕容708150
浏览 400回答 2
2回答

BIG阳

为什么获取所有依赖项是一项艰巨的任务?dbus-java 库和依赖项都可以在 maven 中心获得,所以一个合适的 maven 项目应该是开箱即用的。回到主题:您不必实现GetValue(),但您需要一个合适的 java 接口用于BusItem.据我在 victronenergy (&nbsp;https://www.victronenergy.com/live/open_source:ccgx:d-bus&nbsp;)的文档中看到,您的界面不正确。您提供SetDefault()/GetDefault()方法,这些方法仅适用于com.victronenergy.settings对象,但您想检索一个com.victronenergy.BusItem(不是com.victronenergy.settings包的一部分)。这是一个错误。第二个错误是:您为BusItem类使用了错误的包名。在您的情况下,DBus 将尝试javadbus.BusItem使用连接的 BusAddress 未提供的路径解析对象com.victronenergy.solarcharger.ttyUSB0。本BusItem类必须在包装com.victronenergy或你必须使用注解@DBusInterfaceName("com.victronenergy.BusItem")。注释将告诉 DBus 库忽略 java 包/类名并使用注释中提供的名称。

慕容森

Inteface BusItem 由来自https://dbus.freedesktop.org/doc/dbus-java/dbus-java/dbus-javase10.html的 CreateInterface-Script和来自 Introspect() 的 XML创建但是你解决了我真正的问题。我现在使用了 @DBusInterfaceName("com.victronenergy.BusItem") 注释。没有例外,我从我的太阳能充电器获取数据。非常感谢!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java