首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从DBUS org.freedesktop.dbus和java -org.freedesktop.DBus$Error$UnknownMethod获取数据:方法不存在

从DBUS org.freedesktop.dbus和java -org.freedesktop.DBus$Error$UnknownMethod获取数据:方法不存在
EN

Stack Overflow用户
提问于 2018-10-07 17:48:05
回答 2查看 504关注 0票数 0

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

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

代码语言:javascript
复制
dbus-send --print-reply --system --dest=com.victronenergy.solarcharger.ttyUSB0 /Dc/0/Voltage com.victronenergy.BusItem.GetValue

结果是:

代码语言:javascript
复制
method return time=1538903662.321580 sender=:1.14 -> destination=:1.806 serial=335692 reply_serial=2
variant       double 13.43

我尝试用Java获取这些数据的方法是:

读了几个小时后,我创建了一个界面。

代码语言:javascript
复制
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()。

代码语言:javascript
复制
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();
    }
}

private String getData(String item) {
    BusItem bi;
    String data = null;
    Variant vData = null;
    try {
        bi = (BusItem)conn.getRemoteObject("com.victronenergy.solarcharger." + this.port, item, BusItem.class);
        vData = bi.GetValue();
        //data = bi.GetText();
    } catch (DBusException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return data;
}
...
}

解析所有依赖项并编译代码是一项艰巨的任务。但最终我还是做到了。所以,javac现在可以正常运行了。

但是如果我尝试调用方法GetValue(),我会得到以下异常:

代码语言:javascript
复制
[Sender] INFO org.freedesktop.dbus.MessageWriter - <= MethodCall(0,1) { Path=>/org/freedesktop/DBus, Interface=>org.freedesktop.DBus, Member=>Hello, Destination=>org.freedesktop.DBus } { }
[Sender] INFO org.freedesktop.dbus.MessageWriter - <= MethodCall(0,3) { Path=>/Dc/0/Voltage, Interface=>javadbus.BusItem, Member=>GetValue, Destination=>com.victronenergy.solarcharger.ttyUSB0 } { }
Exception in thread "main" org.freedesktop.DBus$Error$UnknownMethod: Method "GetValue" with signature "" on interface "javadbus.BusItem" doesn't exist
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.freedesktop.dbus.Error.getException(Error.java:141)
        at org.freedesktop.dbus.Error.throwException(Error.java:171)
        at org.freedesktop.dbus.RemoteInvocationHandler.executeRemoteMethod(RemoteInvocationHandler.java:158)
        at org.freedesktop.dbus.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:222)
        at com.sun.proxy.$Proxy1.GetValue(Unknown Source)
        at javadbus.VictronEnergyDBusSolarCharger.getData(VictronEnergyDBusSolarCharger.java:28)
        at javadbus.VictronEnergyDBusSolarCharger.getDcV(VictronEnergyDBusSolarCharger.java:38)
        at javadbus.MainClass.main(MainClass.java:7)

是否有必要将此方法的实现设为GetValue?但是为什么呢,比如我该怎么做呢?我只想得到这个信息,而不是像服务器一样提供它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-15 13:30:29

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

返回主题:

您不必实现GetValue(),但需要为BusItem提供一个合适的java接口。

据我所知,在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包/类名,并使用注释中提供的名称。

票数 0
EN

Stack Overflow用户

发布于 2018-10-16 04:46:15

接口脚本是由来自https://dbus.freedesktop.org/doc/dbus-java/dbus-java/dbus-javase10.html的CreateInterface- BusItem和来自Introspect()的XML创建的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52687291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档