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 のプロトタイプは このメソッドの返り値に利用されているが、 別の方のデータを送ったとしてもプロトタイプと合っているかどうかをチェックすることはしないようだ。