程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 物聯網框架ServerSuperIO(SSIO)更新、以及增加宿主程序和配置工具,詳細介紹,serversuperiossio

物聯網框架ServerSuperIO(SSIO)更新、以及增加宿主程序和配置工具,詳細介紹,serversuperiossio

編輯:C#入門知識

物聯網框架ServerSuperIO(SSIO)更新、以及增加宿主程序和配置工具,詳細介紹,serversuperiossio


一、更新內容

1.修改*Server類,以及承繼關系。
2.增加IRunDevice的IServerProvider接口繼承。
3.修復增加COM設備驅動可能造成的異常。
4.修復網絡發送數據可能引發的異常。
5.完善協議驅動器。

6.修改協議驅動接口。
7.修改協議命令接口。
8.修復協議命令,抽象基類情況下的異常BUG。

9.增加協議接口GetPackageLength,數據交互更靈活。
10.修復一些BUG。
11.優化代碼。

二、GetPackageLength接口的使用

     這個接口主要的使用場景是:當協議中有請求發送數據長度的命令,例如先向服務器發送數據包長度命令,得到返回確定後,再發送實際數據包信息。在連接發送大塊數據的時候,例如文件內容、序列化後的內容等,內容有可能包含協議的頭和尾,會影響數據包的完整性。主要用於交互連續的較大數據塊內容。

      1.接口參數

  /// <summary>
        /// 獲得應該接收的數據長度,如果當前接收的數據小於這個返回值,那麼繼續接收數據,直到大於等於這個返回長度。如果接收數據超時,則直接返回當前已經接收的數據。
        /// </summary>
        /// <param name="data">接收的數據</param>
        /// <param name="channel">IO通道,用於返回確認數據</param>
        /// <param name="readTimeout">返回讀數據超時間隔時間</param>
        /// <returns></returns>
        public abstract int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout);

      2.接口使用

         (1)設置配置參數

 IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服務1",
                SocketMode = SocketMode.Tcp,
                ControlMode = ControlMode.Loop,
                CheckSameSocketSession = false,
                StartCheckPackageLength = true, //開啟檢測數據包長度
                NetReceiveBufferSize = 20,
            });

          (2)接口代碼

        public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
            if (data == null || data.Length <= 0)
                return 0;

            readTimeout = 2000;

            if (CheckData(data))
            {
                try
                {
                    int length = BitConverter.ToInt32(new byte[] {data[3], data[4], data[5], data[6]}, 0);

                    byte[] okBytes = System.Text.Encoding.ASCII.GetBytes("ok");
                    int num = channel.Write(okBytes);
                    if (num > 0)
                    {
                        Console.WriteLine("返回數據");
                    }
                    return length;
                }
                catch (Exception)
                {

                    return 0;
                }
            }
            else
            {
                Console.WriteLine("校驗錯誤");
                return 0;
            }
        }

 三、增加宿主程序(ServerSuperIO.Host)

static IServerFactory _serverFactory = null;
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            ConsoleUtil.SetConsoleCtrlHandler(new ConsoleUtil.ControlCtrlDelegate(HandlerRoutine), true);
            bool success = true;
            Console.WriteLine("正在初始化服務程序......");
            IObjectBuilder builder = new TypeCreator();
            _serverFactory = new ServerFactory();
            try
            {
                GlobalConfig gc = GlobalConfigTool.Load();
                foreach (ServerSuperIO.Config.Server serverCfg in gc.Servers)
                {
                    IServer server = _serverFactory.CreateServer(serverCfg.ServerConfig);
                    server.AddDeviceCompleted += server_AddDeviceCompleted;
                    server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
                    server.Start();
                    _serverFactory.AddServer(server);

                    foreach (Config.Device devCfg in serverCfg.Devices)
                    {
                        try
                        {
                            IRunDevice runDev = builder.BuildUp<IRunDevice>(devCfg.AssemblyFile, devCfg.Instance);

                            runDev.DeviceParameter.DeviceID = devCfg.DeviceID;
                            runDev.DeviceDynamic.DeviceID = devCfg.DeviceID;
                            runDev.CommunicateType = devCfg.CommunicateType;
                            runDev.Initialize(devCfg.DeviceID);

                            if (server.AddDevice(runDev) != devCfg.DeviceID)
                            {
                                Console.WriteLine("增加設備:" + devCfg.DeviceID + " 失敗!");
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            continue;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                success = false;
                Console.WriteLine(ex.Message);
            }

            if (success)
            {
                Console.WriteLine("初始化服務程序完成");
            }

            while ("exit" == Console.ReadLine())
            {
                _serverFactory.RemoveAllServer();
                break;
            }
        }

        private static bool HandlerRoutine(int ctrlType)
        {
            if (ctrlType == 0 || ctrlType == 2)
            {
                _serverFactory.RemoveAllServer();
            }
            return false;
        }
}

 四、增加配置工具(ServerSuperIO.Tool)

1.增加服務,如下圖:

 

2.增加設備,如下圖:

 

3.單擊樹型菜單,修改配置屬性。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved