由於.netcore 無法在linux 下面寫界面,包括新出的3.0 也是沒有linux 下做界面,本來準備用qt 寫界面 通過http api 通訊請求,初步測試雖然通過感覺本地交互使用此種方式還是效率不高,於是想起之前的dbus通訊,
研究.net core 使用dbus 最終發現 tmds.dbus
地址 https://github.com/tmds/Tmds.DBus
不過文檔比較匱乏只能通過別人的提問獲取答案研究了兩天寫出 使用.net core 創建服務 與廣播信號
public static class TestPosService
{
public static async Task TestAsync()
{
string dbusAddress = "tcp:host=localhost,port=54321,family=ipv4";
if (!string.IsNullOrEmpty(Address.System))
{
dbusAddress = Address.System;
}
using (var connection = new Connection(dbusAddress))
{
await connection.ConnectAsync();
var PosDbus = new PosDbusOperations();
await connection.RegisterObjectAsync(PosDbus);
await connection.RegisterServiceAsync("scpos.pos.system");
// Console.ReadLine();
while (true)
{
// await Task.Delay(int.MaxValue);
var datetime = DateTime.Now;
await PosDbus.PingAsync(datetime.ToString());
await Task.Delay(TimeSpan.FromSeconds(5));
}
}
}
}
class PosDbusOperations : IStringOperations
{
public static readonly ObjectPath Path = new ObjectPath("/");
private ObjectPath _path;
public PosDbusOperations()
{
_path = Path;
}
public PosDbusOperations(ObjectPath path)
{
_path = path;
}
public Task<string> ConcatAsync(string s1, string s2)
{
Console.WriteLine("In ConcatAsync!{0},{1}", s1, s2);
return Task.FromResult($"{s1}{s2}");
}
/// <summary>
/// 用於觸發測試信號
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public Task PingAsync(string message)
{
Message?.Invoke(message);
MessageNoArg?.Invoke();
return Task.CompletedTask;
}
public event Action<string> Message;
public event Action MessageNoArg;
/// <summary>
/// 一個參數信號
/// </summary>
/// <param name="reply"></param>
/// <returns></returns>
public Task<IDisposable> WatchMytestsignalAsync(Action<string> reply)
{
return SignalWatcher.AddAsync(this, nameof(Message), reply);
}
/// <summary>
/// 沒有參數的信號
/// </summary>
/// <param name="reply"></param>
/// <returns></returns>
public Task<IDisposable> WatchMytestsignalNoArgAsync(Action reply)
{
return SignalWatcher.AddAsync(this, nameof(MessageNoArg), reply);
}
#region 內部聲明
public ObjectPath ObjectPath { get { return _path; } }
#endregion
}
/// <summary>
/// method
/// </summary>
[DBusInterface("pos.server")]
public interface IStringOperations : IDBusObject
{
Task<string> ConcatAsync(string s1, string s2);
/// <summary>
/// 信號測試
/// </summary>
/// <param name="reply"></param>
/// <returns></returns>
Task<IDisposable> WatchMytestsignalAsync(Action<string> reply);
Task<IDisposable> WatchMytestsignalNoArgAsync(Action reply);
}
Qt 接收信號
QDBusConnection::sessionBus().connect(QString(), QString(), "pos.server", "Mytestsignal", this, SLOT(testslot(QString)));