0

私はしばらくの間、Dbus 2.7 と Java をいじっていましたが、必要なものはほぼ手に入れましたが、最終的には新たに立ち往生しました。私が必要としているのは、SYSTEM バス、特に org.freedesktop.UDisks インターフェイス信号をリッスンする Java プログラムです。これは、一部のデバイス (ほとんどの場合、ブロック デバイス) がマシンに追加または削除されたときを検出するためです (私にとっては、「デバイスを抜き差しした」)。これらの信号を検出する必要があるだけで、信号と共に移動する情報は検出しないことに注意してください。

私が具体的に興味を持っている dbus 信号は、DeviceAdded と DeviceRemoved です。

[dbus-monitor output]

signal sender=:1.45 -> dest=(null destination) serial=186 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceAdded
object path "/org/freedesktop/UDisks/devices/sdb"

signal sender=:1.45 -> dest=(null destination) serial=230 path=/org/freedesktop/UDisks; interface=org.freedesktop.UDisks; member=DeviceRemoved
object path "/org/freedesktop/UDisks/devices/sdb"

Java でこのタスクを実行するために、次のクラス [1] と [2] を作成しました。

[1] org.freedesktop.UDisks.java

/** Created with 'createinterface' utility on org.freedesktop.UDisks system bus interface**/

package org.freedesktop;

import java.util.List;
import org.freedesktop.dbus.DBusInterface;
import org.freedesktop.dbus.DBusSignal;
import org.freedesktop.dbus.UInt32;
import org.freedesktop.dbus.UInt64;
import org.freedesktop.dbus.exceptions.DBusException;

public interface UDisks extends DBusInterface
{
/** ... **/

public static class DeviceRemoved extends DBusSignal
{
  public final DBusInterface a;
  public DeviceRemoved(String path, DBusInterface a) throws DBusException
  {
     super(path, a);
     this.a = a;
  }
}

public static class DeviceAdded extends DBusSignal
{
  public final DBusInterface a;
  public DeviceAdded(String path, DBusInterface a) throws DBusException
  {
     super(path, a);
     this.a = a;
  }
}

public void Uninhibit(String cookie);
public String Inhibit();
public DBusInterface LinuxMdCreate(List<DBusInterface> components, String level, UInt64 stripe_size, String name, List<String> options);
...
/** ... Remaining code removed for the sake of post length**/
}

[2] org.freedesktop.ListenHWDBusSignal.java

package org.freedesktop;

import org.freedesktop.dbus.DBusConnection;
import org.freedesktop.dbus.DBusSigHandler;
import org.freedesktop.dbus.exceptions.DBusException;

public class ListenHWDBusSignal {

public static void main(String[] args) throws DBusException, ParseException {

    System.out.println("Creating Connection");        
    DBusConnection conn=DBusConnection.getConnection(DBusConnection.SYSTEM);

    conn.addSigHandler(UDisks.DeviceAdded.class,new DBusSigHandler<UDisks.DeviceAdded>() {
          @Override
          public void handle(
            UDisks.DeviceAdded added) {               
             System.out.println("Device added!");
          }
        });

    conn.addSigHandler(UDisks.DeviceRemoved.class,new DBusSigHandler<UDisks.DeviceRemoved>() {
          @Override
          public void handle(
            UDisks.DeviceRemoved removed) {               
             System.out.println("Device removed!");
          }
        });
    System.out.println("Waiting for signals...");
   }

}

[2] を実行すると、すべてがうまくいき、プログラムはシグナルを待ちます。

Creating Connection
Waiting for signals...

USB デバイスを手動で追加すると、次の行が表示されます: デバイスが追加されました! しかし、USBを手動で取り外すと、安全に取り外すのではなく、差し込むだけでは何も得られません。

また、バス信号を dbus-monitor でチェックし、DeviceRemoved 信号が実際に org.freedesktop.UDisks によってシステム バスに送信されていることを確認したので、Java 側に問題があると思います。「デバイスが削除されました!」という行が表示されないのはなぜですか? コードに何か問題がありますか?

どんな助けでも本当に感謝します、ありがとう!

4

0 に答える 0