субота, 13 червня 2009 р.

Ruby D-Bus

Цей запис описує створення простого D-Bus клієнта до аудіопрогравача Amarok 2 за допомогою Ruby.

Що таке D-Bus і принцип його роботи
D-Bus - це система міжпроцесної взаємодії, яка надає додаткам декілька шин для передачі повідомлень.
D-Bus є частиноє проекту freedesktop.org. Вона володіє високою швидкодією, інтегрується з багатьма робочими середовищами. D-Bus доступна для GLib, Java, Mono, Qt, Python, Ruby і є прозорою для мережі.
D-Bus надає системі декілька шин:
  1. Системна шина. Створюється під час старту демона. З її допомогою відбувається спілкування різноманітних демонів, вона практично недоступна для додатків користувача.
  2. Сесійна шина. Створюється для користувача, авторизованого у системі. Для кожної такої шини запускається окрема копія демона, через неї спілкуються додатки, з якими працює користувач.

Кожне повідомлення D-Bus має свого відправника і одержувача, а їхні адреси називаються шляхами об'єктів, оскільки D-Bus вважає, що кожен додаток складається із набору об'єктів, а повідомлення пересилається не між додатками, а між об'єктами цих самих додатків.
Кожен об'єкт може підтримувати один або більше інтерфейсів, які представленні у вигляді іменованих груп методів і сигналів.
D-Bus також передбачає концепцію сервісів. Сервіс - унікальне місцезнаходження додатка на шині. При запуску додаток реєструє один або декілька сервісів, якими воно буде володіти до тих пір поки самостійно не звільнить. Ніякий інший додаток, що претендує на той же сервіс, зайняти його не зможе. Іменується сервіси аналогічно інтерфейсам.
У кожного об'єкта своє унікальне ім'я, яке виглядає як шлях в файловій системі. Наприклад, /org/kde/amarok/Player

Інсталяція ruby-dbus
Бібліотеку Ruby D-Bus можна встановити за допомогою команди:
$ gem install ruby-dbus

Це все! Тепер можемо перейти до використання...

Використання бібліотеки в Ruby

Для того що використовувати бібліотеку ви повинні включити її у вашу програму за допомогою
require 'dbus'

Приєдняння до шини
bus = DBus::SystemBus.instance
bus = DBus::SessionBus.instance

відповідно, або до системної шини, або до сесійної.

Виклик методу
Наприклад ми хочемо отримати доступ до об'єкта клієнта аудіопрогравача Amarok через шину сесій. Amarok надає сервіс з іменем org.kde.amarok
rb_service = bus.service("org.kde.amarok")

Тепер у нас є маніпулятор для сервісу і ми знаємо, що він експортує об'єкт /Player. Отримати доступ до цього об'єкта можна за допомогою методу object:
rb_player = rb_service.object("/Player")

rb_player.introspect

Нагадаю, об'єкти D-Bus мають інтерфейси, а інтерфейси в свою чергу мають методи. Далі отримуємо доступ до цих методів:
rb_player_iface = rb_playes["org.freedesktop.MediaPlayer"]
rb_player_iface.Pause

Як ви можете бачити, коли ви хочете викликати метод об'єкта, ви повинні отримати правильний інтерфейс. Це трохи втомлює, тому ми маємо наступне посилання, яке робить те ж саме, що й раніше:
rb_player.default_iface = "org.freedesktop.MediaPlayer"
rb_player.Pause

Деякі D-Bus об'єкти забезпечують доступ до властивостей. Вони доступні, як хеш:
rb_player_iface.GetMetadata
=> [{"album"=>"www.reconstructionmusic.org", "artist"=>"allMeadow & Rob Costlow", "arturl"=>"", "audio-bitrate"=>350, "audio-samplerate"=>44100, "comment"=>"This Amarok theme was made by allMeadow & Rob Costlow especially for Amarok. You can check out more of their projects at Magnatune.com or at www.reconstructionmusic.org", "genre"=>"Instrumental", "location"=>"file:///usr/share/kde4/apps/amarok/data/first_run_jingle.ogg", "mtime"=>40000, "rating"=>0, "time"=>40, "title"=>"Art Of Nations (Amarok Theme)", "tracknumber"=>1, "year"=>"2010"}]


Замість висновків
Знайти докладну інформацію про D-Bus API конкретних програм буває непросто, але Google завжди буде відданим супутником у ваших дослідженнях.

На сьогодні це все, малята :)

Використанні посисання

Немає коментарів: