ruby-dbus を使う (1)

ruby-dbus を使ってみた。Ubuntu 11.04 で試した。

http://trac.luon.net/data/ruby-dbus/tutorial/intro.html にチュートリアルがある。

ruby-dbus のインストール

gem install ruby-dbus

でインストールしておく。

単純な例

test_string.rb

次のようなファイル test_string.rb を作る。

require 'dbus'

bus = DBus.session_bus
service = bus.request_service("test.dbus.service")

class DBusTest < DBus::Object
  dbus_interface "test.dbus.SampleInterface" do
    dbus_method :test_string, "in str:s, out str:s" do |name|
      "receive: #{name}"
    end
  end
end

obj = DBusTest.new("/test/dbus/MyInstance")
service.export(obj)

main = DBus::Main.new
main << bus
main.run

service を定義して interface を持つ object をセットする。 interface には test_string メソッドが定義されていて、 文字列を受け取り、文字列を返す。 dbus_method にはメソッド名、プロトタイプ、処理を記述するブロックを与える。

ruby test_string.rb

でサーバーを実行しておく。

dbus-send でメソッドを実行する

端末で dbus-send を使うと dbus のサーバーに接続してメソッドを実行できる。

dbus-send --print-reply --dest=test.dbus.service --type=method_call \
    /test/dbus/MyInstance test.dbus.SampleInterface.test_string string:"hello world"

type には method_call か signal が指定できる。 http://dbus.freedesktop.org/doc/dbus-tutorial.html を読むと、メソッドはオブジェクトの操作で シグナルはオブジェクトからオブザーバに対するブロードキャストとあり、 test_string メソッドを呼び出したいのでここでは method_call を指定する。 (signal をサーバーからクライアントに送るため? 逆は用途が想像できない。)

method return sender=:1.124 -> dest=:1.128 reply_serial=2
   string "receive: hello world"

のような実行結果になる。

introspection

org.freedesktop.DBus.Introspectable.Introspect メソッドが定義されていて interface の定義を見ることができる。

dbus-send --session --type=method_call --print-reply --dest=test.dbus.service /test/dbus/MyInstance org.freedesktop.DBus.Introspectable.Introspect

ソースコードを見たところ ruby-dbus の dbus_method のプロトタイプは このメソッドの返り値に利用されているが、 別の方のデータを送ったとしてもプロトタイプと合っているかどうかをチェックすることはしないようだ。

参考

Tags of current page

, ,