dbus
dbusモジュールは、JSHアプリケーション用のLinux専用D-Bus APIを提供します。
メソッド呼び出し、プロパティの読み書き、イントロスペクション、シグナル購読、名前の所有者の監視に対応しています。
モジュールの読み込み
const dbus = require("dbus");
const conn = new dbus.Connection({ busType: dbus.BusType.Session });ランタイムのOSがLinux以外の場合、接続の作成は失敗します。
BusType
dbus.BusType.Sessiondbus.BusType.System
Connection
D-Bus接続オブジェクトです。
作成
new dbus.Connection(options)オプション
| オプション | 型 | 既定値 | 説明 |
|---|---|---|---|
| busType | string | dbus.BusType.Session | D-Busバスの種類 |
戻り値
Connection
エラー時の動作:
busTypeが不正な場合は、例外が発生します。- プラットフォームがLinux以外の場合は、例外が発生します。
close()
現在のD-Bus接続を閉じます。
構文
conn.close()戻り値
undefined
このメソッドは冪等であり、複数回呼び出しても安全です。
object()
指定したdestination/pathにバインドされたObjectProxyを作成します。
構文
conn.object(destination, path)パラメーター
destination(string): サービス名(例:org.freedesktop.DBus)path(string): オブジェクトパス(例:/org/freedesktop/DBus)
戻り値
ObjectProxy
call()
D-Busメソッドを呼び出します。
構文
conn.call(request)パラメーター
request(object): CallRequest
戻り値
object: CallResult
エラー時の動作:
- 必須フィールドがない場合は、例外が発生します。
- オブジェクトパスが不正な場合は、例外が発生します。
getProperty()
D-Busプロパティを読み取ります。
構文
conn.getProperty(request)パラメーター
request(object): PropertyRequest
戻り値
object: PropertyResult
setProperty()
D-Busプロパティを書き込みます。
構文
conn.setProperty(request)パラメーター
request(object): SetPropertyRequest
戻り値
undefined
introspect()
オブジェクトのイントロスペクションメタデータを取得します。
構文
conn.introspect(request)パラメーター
request(object): IntrospectRequest
戻り値
object: IntrospectionNode
subscribeSignal()
条件に一致するD-Busシグナルを購読します。
構文
conn.subscribeSignal(request)パラメーター
request(object): SignalWatchRequest
戻り値
Connection(メソッドチェーンに対応)
エラー時の動作:
- すべての一致条件フィールドが空の場合は、
missing signal match criteria例外が発生します。
unsubscribeSignal()
登録済みのシグナル購読を解除します。
構文
conn.unsubscribeSignal(request)パラメーター
request(object): SignalWatchRequest
戻り値
Connection(メソッドチェーンに対応)
エラー時の動作:
- 一致する購読がない場合は、例外が発生します。
watchName()
バス名の所有者の変更監視を開始します。
構文
conn.watchName(name)パラメーター
name(string): D-Bus well-known name
戻り値
Connection(メソッドチェーンに対応)
unwatchName()
バス名の所有者の変更監視を停止します。
構文
conn.unwatchName(name)パラメーター
name(string): D-Bus well-known name
戻り値
Connection(メソッドチェーンに対応)
エラー時の動作:
- 実行中の監視がない場合は、
name watch not found例外が発生します。
getNameOwner()
バス名の現在の所有者を取得します。
構文
conn.getNameOwner(name)パラメーター
name(string): D-Bus well-known name
戻り値
object: NameOwnerResult
名前に所有者がない場合は、例外をスローせずhasOwner: falseを返します。
イベント
Connectionは、EventEmitterを継承します。
signal
購読したD-Busシグナルを受信するたびに発生します。
conn.on("signal", (sig) => {
console.println(sig.interface, sig.member, sig.body);
});name-owner-changed
監視中の名前の所有者が変わると発生します。
conn.on("name-owner-changed", (evt) => {
console.println(evt.name, evt.oldOwner, evt.newOwner);
});ObjectProxy
conn.object(destination, path)で作成します。
call()
obj.call(method, ...args)- 戻り値: CallResultと同じ構造
getProperty() / get()
obj.getProperty(name, interfaceName)
obj.get(name, interfaceName)getProperty()は、PropertyResultを返します。get()は、プロパティ値だけを返します(result.value)。
setProperty() / set()
obj.setProperty(name, value, interfaceName)
obj.set(name, value, interfaceName)introspect()
obj.introspect()- 戻り値: IntrospectionNode
subscribeSignal() / unsubscribeSignal()
obj.subscribeSignal(member, interfaceName)
obj.unsubscribeSignal(member, interfaceName)destination/pathを自動的に渡す便利なラッパーです。
リクエスト・レスポンスの構造
CallRequest
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | サービス名 |
| path | string | オブジェクトパス |
| method | string | 完全修飾のメソッド名(Interface.Method) |
| args | any[] | メソッド引数 |
| flags | number | D-Bus呼び出しフラグ |
argsの型指定規則:
- JavaScriptの数値は、呼び出し時に整数型(
uint16、int32など)の区別が曖昧になる場合があります。 - 正確なD-Bus型が必要な場合は、引数を
"type:value"文字列で渡せます。 - 例:
"uint16:123","int32:-7","bool:true","objectpath:/org/freedesktop/DBus"
対応する型(type:value):
byte,uint8,uint16,uint32,uint64int16,int32,int64float32,float64,doublebool,stringobjectpath,pathsignature
動作に関する注意:
- 型の接頭辞がない文字列は、通常の文字列として渡します。
- 不明な型の接頭辞(例:
"custom:123")は変換せず、そのまま文字列として渡します。 - 値の解析が失敗すると、呼び出し時に例外が発生します。
CallResult
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | サービス名 |
| path | string | オブジェクトパス |
| method | string | 呼び出しに使用したメソッド名 |
| body | any[] | 戻り値の一覧 |
PropertyRequest
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | サービス名 |
| path | string | オブジェクトパス |
| interface | string | インターフェース名 |
| name | string | プロパティ名 |
PropertyResult
| プロパティ | 型 | 説明 |
|---|---|---|
| signature | string | D-Busシグネチャ |
| value | any | プロパティ値 |
SetPropertyRequest
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | サービス名 |
| path | string | オブジェクトパス |
| interface | string | インターフェース名 |
| name | string | プロパティ名 |
| value | any | 書き込むプロパティ値 |
IntrospectRequest
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | サービス名 |
| path | string | オブジェクトパス |
IntrospectionNode
| プロパティ | 型 | 説明 |
|---|---|---|
| name | string | ノードのパス・名前 |
| interfaces | object[] | インターフェースメタデータの一覧 |
| children | object[] | 子ノードの一覧 |
各interfaceには、methods/signals/properties/annotationsが含まれます。
SignalWatchRequest
| プロパティ | 型 | 説明 |
|---|---|---|
| destination | string | 省略可能。オブジェクトベースの呼び出しとの対称性を保つフィールド |
| sender | string | シグナルのsenderフィルター |
| path | string | オブジェクトパスのフィルター |
| interface | string | インターフェースのフィルター |
| member | string | メンバーのフィルター |
sender、path、interface、memberのうち、少なくとも1つが必要です。
NameOwnerResult
| プロパティ | 型 | 説明 |
|---|---|---|
| name | string | 要求したバス名 |
| owner | string | 一意の名前(:1.xx)、または空文字列 |
| hasOwner | boolean | 現在所有者が存在するかどうか |
使用例
1) 基本的なメソッド呼び出し
| |
2) プロパティの読み書き
| |
3) イントロスペクション
| |
4) シグナルの購読
| |
5) 名前の監視
| |
エラー時の動作に関する注意
conn.close()の後にメソッドを呼び出すと、connection not initialized例外が発生します。- リクエストオブジェクトの必須フィールドが欠けている場合は、例外が発生します。
- 不正なオブジェクトパスは、例外を発生させます。
getNameOwner()は、所有者がない場合に{ hasOwner: false }を返します。- D-Busのランタイムとテストの動作は、Linux専用です。