Получить данные из DBUS org.freedesktop.dbus и java - org.freedesktop.DBus $ Error $ UnknownMethod: метод не существует - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь получить некоторые данные из службы 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();
    }
}

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 (), я получу следующее исключение:

[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?Но почему, например, как мне это сделать?Я только хочу получить эту информацию, а не предоставлять ее как сервер.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Интерфейс BusItem был создан CreateInterface-Script из https://dbus.freedesktop.org/doc/dbus-java/dbus-java/dbus-javase10.html и XML из Introspect ()

Но вы решили мою настоящую проблему.Я использовал аннотацию @DBusInterfaceName ("com.victronenergy.BusItem") сейчас.Больше никаких исключений, я получаю данные от моего солархаржера.Большое вам спасибо!

0 голосов
/ 15 октября 2018

Почему было сложно получить все зависимости?Библиотека dbus-java и ее зависимости доступны в maven central, поэтому правильный проект 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 и использовать тот, который указан вnnotation.

...