.net core dbus 通訊

由於.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)));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章