亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 437 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號