12,925
回編集
73行目: | 73行目: | ||
<br><br> | <br><br> | ||
== | == D-Busの呼び出し (クライアント側) == | ||
以下の例では、Linuxにおいてセッションをログオフしている。<br> | 以下の例では、Linuxにおいてセッションをログオフしている。<br> | ||
<br> | <br> | ||
120行目: | 120行目: | ||
} | } | ||
} | } | ||
</syntaxhighlight> | |||
<br><br> | |||
== D-Busヘルパーファイル == | |||
==== D-Busヘルパーファイルのサンプルコード ==== | |||
以下の例で使用しているD-Busヘルパーファイルのインターフェースは、以下に示すような構造をしている。<br> | |||
<syntaxhighlight lang="xml"> | |||
<node> | |||
<interface name="com.example.MyInterface"> | |||
<method name="SayHello"> | |||
</method> | |||
<method name="Add"> | |||
<arg type="i" name="x" direction="in"/> | |||
<arg type="i" name="y" direction="in"/> | |||
<arg type="i" name="sum" direction="out"/> | |||
</method> | |||
</interface> | |||
</node> | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using Tmds.DBus; | |||
namespace DBusHelper; | |||
// D-Busインターフェースの定義 | |||
[DBusInterface("com.example.MyInterface")] // D-Busインターフェース名を指定する 例: com.example.MyInterface | |||
public interface IMyInterface : IDBusObject | |||
{ | |||
Task SayHelloAsync(); | |||
Task<int> AddAsync(int x, int y); | |||
} | |||
// D-Busオブジェクトの定義 | |||
public class MyObject : IMyInterface | |||
{ | |||
// D-Busオブジェクト名 | |||
public ObjectPath ObjectPath { get; } = new ObjectPath("/com/example/MyObject"); | |||
// 各D-Busインターフェースの詳細な定義 | |||
public async Task SayHelloAsync() | |||
{ | |||
await Task.Run(() => Console.WriteLine("Hello from D-Bus server!")); | |||
} | |||
public async Task<int> AddAsync(int x, int y) | |||
{ | |||
return await Task.Run(() => x + y); | |||
} | |||
public Task<IDisposable> WatchPropertiesAsync(Action<PropertyChanges> onChanged) | |||
{ | |||
return Task.FromResult<IDisposable>(null!); | |||
} | |||
public Task<PropertyChanges> GetAllAsync() | |||
{ | |||
return Task.FromResult(new PropertyChanges()); | |||
} | |||
} | |||
class Program | |||
{ | |||
static async Task Main(string[] _) | |||
{ | |||
// D-Busシステムバスを使用 | |||
// D-Busセッションバスを使用する場合は、Address.Sessionを使用すること | |||
var connection = new Connection(Address.System); | |||
await connection.ConnectAsync(); | |||
try | |||
{ | |||
// D-Busオブジェクトを登録 | |||
var myObject = new MyObject(); | |||
await connection.RegisterObjectAsync(myObject); | |||
// D-Busサービスを登録 | |||
const string helperServiceName = "com.example.MyObject"; | |||
await connection.RegisterServiceAsync(helperServiceName); | |||
// D-Busサービスを有効化 | |||
await connection.ActivateServiceAsync("com.example.MyObject"); | |||
Console.WriteLine("D-Bus server is start."); | |||
// D-Busヘルパーファイルの起動時間を指定 例: 30[Sec] | |||
await Task.Delay(1000 * 30); | |||
Console.WriteLine("Terminates the D-Bus server."); | |||
} | |||
catch (Exception e) | |||
{ | |||
Console.WriteLine($"{e.Message}"); | |||
} | |||
finally | |||
{ | |||
// 登録したD-BusサービスおよびD-Busオブジェクトを削除 | |||
connection.Dispose(); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== D-Busセッションバスを使用する場合 ==== | |||
セッションバス向けD-Busサービスファイルを作成する。<br> | |||
sudo vi /usr/share/dbus-1/services/<任意の名前>.service | |||
<br> | |||
<syntaxhighlight lang="ini"> | |||
# /usr/share/dbus-1/services/<任意の名前>.serviceファイル | |||
[D-BUS Service] | |||
Name=<D-Busサービス名> | |||
Exec=<D-Busヘルパーファイルのパス> | |||
</syntaxhighlight> | |||
<br> | |||
==== D-Busシステムバスを使用する場合 ==== | |||
まず、システムバス向けD-Busサービスファイルを作成する。<br> | |||
sudo vi /usr/share/dbus-1/system-services/<任意の名前>.service | |||
<br> | |||
<syntaxhighlight lang="ini"> | |||
# /usr/share/dbus-1/system-services/<任意の名前>.serviceファイル | |||
[D-BUS Service] | |||
Name=<D-Busサービス名> | |||
Exec=<D-Busヘルパーファイルのパス> | |||
User=root | |||
</syntaxhighlight> | |||
<br> | |||
次に、PolicyKit (PolKit) の動作するために必要なセキュリティポリシーを設定する。<br> | |||
sudo vi /usr/share/dbus-1/system.d/<任意の名前>.conf | |||
<br> | |||
<syntaxhighlight lang="xml"> | |||
# /usr/share/dbus-1/system.d/<任意の名前>.confファイル | |||
<policy user="root"> | |||
<allow own="<D-Busサービス名>"/> | |||
</policy> | |||
<policy context="default"> | |||
<allow send_destination="<D-Busサービス名>"/> | |||
</policy> | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |