程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 開源跨平台IOT通訊框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用說明,iotnuget

開源跨平台IOT通訊框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用說明,iotnuget

編輯:C#入門知識

開源跨平台IOT通訊框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用說明,iotnuget


      物聯網涉及到各種設備、各種傳感器、各種數據源、各種協議,並且很難統一,那麼就要有一個結構性的框架解決這些問題。SSIO就是根據時代發展的階段和現實實際情況的結合產物。

      各種數據信息,如下圖:

          解決方案,配合SIO使用:

一、SSIO特點

  • 輕型高性能通信框架,適用於多種應用場,輪詢模式、自控模式、並發模式和單例模式。
  • 不光是通訊框架,是設備驅動、IO通道、控制模式場景的協調機制。
  • 支持協議驅動器,可以按規范寫標准協議和自定義協議。
  • 支持發送數據緩存器,支持命令緩存重發和按優先級別發送。
  • 支持協議過濾器,按規則篩選數據,並且可以承繼接口,自定義過濾方式。
  • 支持接收數據緩存器,可以緩存不符合過濾器的數據,和下次接收數據進行拼接。
  • 支持按設備命令優先級別進行調度設備,保證有高級別命令的驅動及時發送。
  • 支持一個設備驅動,同時支持串口和網絡兩種通訊方式,可以監視IO通道數據。
  • 支持一個設備驅動,在網絡通訊時可以支持TCP Server和TCP Client兩種工作模式。
  • 支持多設備共享同一IO通道進行通訊。
  • 支持定時清理超時的網絡IO通道。
  • 支持顯示視圖接口,滿足不同顯示需求。
  • 支持服務組件接口,可以自定義完成OPC服務、4-20mA輸出、LED大屏顯示、短信服務、以及多功能網關服務。
  •  支持創建多服務實例,完成不同業務的拆分。
  •  支持跨平台部署,可以運行在Linux和Windows系統。

二、SSIO發布到NuGet平台

三、搜索SSIO

四、安裝SSIO

五、事例代碼(Demo)

    Demo下載地址:https://github.com/wxzz/ServerSuperIO/tree/2.0

1.客戶端(發送文件)

 

        static void SendFile()
        {
            if (!System.IO.File.Exists(_file))
            {
                Console.WriteLine("文件不存在:"+_file);
                return;
            }

            FileStream fs = null;
            try
            {
                Console.WriteLine("開始傳輸>>");

                string fileName=DateTime.Now.ToString("yyMMddHHmmss") + ".txt";
                int bufferSize = _sendBufferSize;
                byte[] sendBuffer = new byte[bufferSize];
                fs = new FileStream(_file, FileMode.Open,FileAccess.Read,FileShare.Read);

                long length = fs.Length;
                int count = 0;
                Stopwatch watch = new Stopwatch();
                watch.Start();
                while (length > 0)
                {
                    int sendNum = fs.Read(sendBuffer, 0, sendBuffer.Length);

                    byte[] package = GetDataPackage(fileName,sendBuffer, sendNum);

                    count+=_tcpClient.Client.Send(package, 0, package.Length, SocketFlags.None);

                    length -= sendNum;

                    float percent = ((fs.Length - length)/(float) fs.Length)*100.0f;
                    Console.WriteLine("已傳:" + percent.ToString("0.00")  + "%");
                }
                watch.Stop();
                
                Console.WriteLine("傳輸完畢!總數:" + count.ToString()+",耗時:"+ watch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture));
            }
            catch
            {
                throw;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }

        static byte[] GetDataPackage(string fileName,byte[] sendBuffer, int sendNum)
        {
            byte[] sendPackage = new byte[sendNum + 24];
            sendPackage[0] = 0x35;
            sendPackage[1] = 0x35;

            string code = "0001";
            byte[] codeBytes = System.Text.Encoding.ASCII.GetBytes(code);
            Buffer.BlockCopy(codeBytes, 0, sendPackage, 2, 4);

            byte[] fileBytes= System.Text.Encoding.ASCII.GetBytes(fileName);
            Buffer.BlockCopy(fileBytes, 0, sendPackage, 6, 16);

            Buffer.BlockCopy(sendBuffer, 0, sendPackage, 22, sendNum);

            sendPackage[sendPackage.Length - 2] = 0x33;
            sendPackage[sendPackage.Length - 1] = 0x33;

            return sendPackage;
        }

 

 2.設備驅動

//設備驅動
 public class ReceiveFileDriver:RunDevice
    {
        private Dynamic _Dyn;
        private Parameter _Parameter;
        private Protocol _Protocol;
        public ReceiveFileDriver() : base()
        {
            _Dyn = new Dynamic();
            _Parameter = new Parameter();
            _Protocol = new Protocol();
        }

        public override void Initialize(int devid)
        {
            this.Protocol.InitDriver(this, new FixedHeadAndEndReceiveFliter(TransFileDriver.Protocol.Head, TransFileDriver.Protocol.End));    //初始化協議驅動
        }

        //省略......
}

//協議驅動,並處理數據
public class Command : ProtocolCommand
{
        public Command()
        {
        }
        public override string Name
        {
            get { return "writefile"; }
        }
        public override object Analysis(byte[] data, object obj)
        {
            try
            {
               //count += data.Length - 24;
               //Console.WriteLine(count.ToString()+","+data[0].ToString() + "," + data[data.Length - 1].ToString());
                
                string path = Path.Combine(Environment.CurrentDirectory, "rev");
                if (!System.IO.Directory.Exists(path))
                {
                    System.IO.Directory.CreateDirectory(path);
                }
                string fileName = System.Text.Encoding.ASCII.GetString(data, 6, 16);
                path=Path.Combine(path, fileName);
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                {
                    fs.Seek(fs.Length, SeekOrigin.Current);
                    byte[] content = new byte[data.Length - 24];
                    Buffer.BlockCopy(data, 22, content, 0, content.Length);
                    fs.Write(content, 0, content.Length);
                    fs.Flush();
                }

            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public override byte[] Package(string code, object obj)
        {
            throw new NotImplementedException();
        }
    }

 3.宿主程序

 static void Main(string[] args)
{
            
            ReceiveFileDriver dev = new ReceiveFileDriver();
            dev.DeviceParameter.DeviceName = "設備4";
            dev.DeviceParameter.DeviceAddr = 0;
            dev.DeviceParameter.DeviceCode = "0001";
            dev.DeviceParameter.DeviceID = 0;
            dev.DeviceDynamic.DeviceID = 0;
            dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev.DeviceParameter.NET.RemotePort = 9600;
            dev.CommunicateType = CommunicateType.NET;
            dev.Initialize(0);

            IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "接收文件服務",
                ListenPort = 6699,
                NetReceiveBufferSize = 2048,
                ControlMode = ControlMode.Self,
                SocketMode = SocketMode.Tcp,
                DeliveryMode = DeliveryMode.DeviceCode,
                StartReceiveDataFliter = true,
                ClearSocketSession = false,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.Start();

            server.AddDevice(dev);

            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
}

 六、實驗效果

 

      兩天的時間,將近3GB的數據信息,穩定性、擴展性都非常不錯。

 

 

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