为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容708150 2021-11-03 14:48:20
我尝试从 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=2variant       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?但是为什么例如我应该怎么做呢?我只想获取此信息,而不是像服务器一样提供它。
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

为什么获取所有依赖项是一项艰巨的任务?dbus-java 库和依赖项都可以在 maven 中心获得,所以一个合适的 maven 项目应该是开箱即用的。

回到主题:

您不必实现GetValue(),但您需要一个合适的 java 接口用于BusItem.

据我在 victronenergy ( https://www.victronenergy.com/live/open_source:ccgx:d-bus )的文档中看到,您的界面不正确。

您提供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 包/类名并使用注释中提供的名称。


查看完整回答
反对 回复 2021-11-03
?
慕容森

TA贡献1853条经验 获得超18个赞

Inteface BusItem 由来自https://dbus.freedesktop.org/doc/dbus-java/dbus-java/dbus-javase10.html的 CreateInterface-Script和来自 Introspect() 的 XML创建

但是你解决了我真正的问题。我现在使用了 @DBusInterfaceName("com.victronenergy.BusItem") 注释。没有例外,我从我的太阳能充电器获取数据。非常感谢!


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 399 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信