物聯網涉及到各種設備、各種感測器、各種數據源、各種協議,並且很難統一,那麼就要有一個結構性的框架解決這些問題。SSIO就是根據時代發展的階段和現實實際情況的結合產物。 各種數據信息,如下圖: 解決方案,配合SIO使用: 一、SSIO特點 輕型高性能通信框架,適用於多種應用場,輪詢模式、自控模式、併發 ...
物聯網涉及到各種設備、各種感測器、各種數據源、各種協議,並且很難統一,那麼就要有一個結構性的框架解決這些問題。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的數據信息,穩定性、擴展性都非常不錯。
2.[開源]C#跨平臺物聯網通訊框架ServerSuperIO(SSIO)介紹
2.應用SuperIO(SIO)和開源跨平臺物聯網框架ServerSuperIO(SSIO)構建系統的整體方案
3.C#工業物聯網和集成系統解決方案的技術路線(數據源、數據採集、數據上傳與接收、ActiveMQ、Mongodb、WebApi、手機App)
5.ServerSuperIO開源地址:https://github.com/wxzz/ServerSuperIO
物聯網&集成技術(.NET) QQ群:54256083