From d6072cdd847f3bc005da70c1dccae57c63a439dd Mon Sep 17 00:00:00 2001 From: Candy Date: Sun, 17 May 2020 19:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=8B=AC=E7=AB=8B=E7=9A=84?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE=E6=9C=8D=E5=8A=A1=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProducterValueChangedNotifyProcesser.cs | 12 +- Cdy.Tag/Real/ValueChangedNotifyProcesser.cs | 19 +- DBHisDataServer/DBHisDataServer.csproj | 40 + DBHisDataServer/DataService.cs | 207 ++++ DBHisDataServer/HisDataServerProcess.cs | 1069 +++++++++++++++++ DBHisDataServer/Program.cs | 176 +++ .../Properties/Resources.Designer.cs | 117 ++ DBHisDataServer/Properties/Resources.resx | 138 +++ .../Properties/launchSettings.json | 8 + DBHisDataServer/Res.cs | 24 + DBHisDataServer/Runner.cs | 156 +++ DBHisDataServer/ServerProcessBase.cs | 171 +++ DBHisDataServer/TagInfoServerProcess.cs | 92 ++ DBInRun/Program.cs | 62 +- DBRunTimeServiceApi/ApiClient.cs | 45 +- DBRuntime.Proxy/Config/ProxyClientConfig.xml | 2 +- DBRuntime.Proxy/DatabaseRunner.cs | 9 +- DBRuntime.Proxy/DbServerProxy.cs | 74 +- DBStudio/Program.cs | 78 +- DataRunner/Api/RealDataServerProcess.cs | 1 + DbInRunWebApi/Config/DbWebApiProxy.cfg | 2 +- Mars.sln | 9 +- SimDriver/Driver.cs | 2 +- 23 files changed, 2475 insertions(+), 38 deletions(-) create mode 100644 DBHisDataServer/DBHisDataServer.csproj create mode 100644 DBHisDataServer/DataService.cs create mode 100644 DBHisDataServer/HisDataServerProcess.cs create mode 100644 DBHisDataServer/Program.cs create mode 100644 DBHisDataServer/Properties/Resources.Designer.cs create mode 100644 DBHisDataServer/Properties/Resources.resx create mode 100644 DBHisDataServer/Properties/launchSettings.json create mode 100644 DBHisDataServer/Res.cs create mode 100644 DBHisDataServer/Runner.cs create mode 100644 DBHisDataServer/ServerProcessBase.cs create mode 100644 DBHisDataServer/TagInfoServerProcess.cs diff --git a/Cdy.Tag/Real/ProducterValueChangedNotifyProcesser.cs b/Cdy.Tag/Real/ProducterValueChangedNotifyProcesser.cs index a3fd161..7439f9a 100644 --- a/Cdy.Tag/Real/ProducterValueChangedNotifyProcesser.cs +++ b/Cdy.Tag/Real/ProducterValueChangedNotifyProcesser.cs @@ -103,11 +103,13 @@ namespace Cdy.Tag /// public void Close() { - if (mProcessThread != null) - { - mProcessThread.Abort(); - mProcessThread = null; - } + mIsClosed = true; + resetEvent.Set(); + //if (mProcessThread != null) + //{ + // mProcessThread.Abort(); + // mProcessThread = null; + //} } /// diff --git a/Cdy.Tag/Real/ValueChangedNotifyProcesser.cs b/Cdy.Tag/Real/ValueChangedNotifyProcesser.cs index c5d2d04..9c3f50f 100644 --- a/Cdy.Tag/Real/ValueChangedNotifyProcesser.cs +++ b/Cdy.Tag/Real/ValueChangedNotifyProcesser.cs @@ -57,6 +57,8 @@ namespace Cdy.Tag private DateTime mLastNotiyTime = DateTime.Now; + private bool mIsClosed = false; + #endregion ...Variables... #region ... Events ... @@ -114,11 +116,14 @@ namespace Cdy.Tag /// public void Close() { - if (mProcessThread != null) - { - mProcessThread.Abort(); - mProcessThread = null; - } + mIsClosed = true; + resetEvent.Set(); + + //if (mProcessThread != null) + //{ + // mProcessThread.Abort(); + // mProcessThread = null; + //} } /// @@ -215,9 +220,11 @@ namespace Cdy.Tag /// private void ThreadProcess() { - while(true) + while(!mIsClosed) { resetEvent.WaitOne(); + if (mIsClosed) break; + resetEvent.Reset(); if (mLenght > 0) { diff --git a/DBHisDataServer/DBHisDataServer.csproj b/DBHisDataServer/DBHisDataServer.csproj new file mode 100644 index 0000000..7adc8d4 --- /dev/null +++ b/DBHisDataServer/DBHisDataServer.csproj @@ -0,0 +1,40 @@ + + + + Exe + netcoreapp3.1 + + + + false + true + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + diff --git a/DBHisDataServer/DataService.cs b/DBHisDataServer/DataService.cs new file mode 100644 index 0000000..3f1127b --- /dev/null +++ b/DBHisDataServer/DataService.cs @@ -0,0 +1,207 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/5/14 10:22:00. +// Version 1.0 +// 种道洋 +//============================================================== + +using Cdy.Tag; +using DotNetty.Buffers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace DBRuntime.Api +{ + public class ApiFunConst + { + /// + /// + /// + public const byte TagInfoRequest = 1; + + /// + /// + /// + public const byte RealDataRequestFun = 10; + + /// + /// + /// + public const byte RealDataPushFun = 12; + + /// + /// + /// + public const byte HisDataRequestFun = 20; + + public const byte AysncReturn = byte.MaxValue; + } + + /// + /// + /// + public class DataService: SocketServer + { + + #region ... Variables ... + + private IByteBuffer mAsyncCalldata; + + private Dictionary mProcess = new Dictionary(); + + private HisDataServerProcess mHisProcess; + private TagInfoServerProcess mInfoProcess; + + /// + /// + /// + public static DataService Service = new DataService(); + + #endregion ...Variables... + + #region ... Events ... + + #endregion ...Events... + + #region ... Constructor... + /// + /// + /// + public DataService() + { + RegistorInit(); + } + #endregion ...Constructor... + + #region ... Properties ... + + #endregion ...Properties... + + #region ... Methods ... + + + /// + /// + /// + /// + protected override void StartInner(int port) + { + mHisProcess = new HisDataServerProcess() { Parent = this }; + mInfoProcess = new TagInfoServerProcess() { Parent = this }; + mHisProcess.Start(); + mInfoProcess.Start(); + base.StartInner(port); + + } + + /// + /// + /// + public override void Stop() + { + base.Stop(); + if (mHisProcess != null) + { + mHisProcess.Stop(); + mHisProcess.Dispose(); + mHisProcess = null; + } + } + + private IByteBuffer GetAsyncData() + { + mAsyncCalldata = BufferManager.Manager.Allocate(ApiFunConst.AysncReturn, 4); + mAsyncCalldata.WriteInt(0); + return mAsyncCalldata; + } + + /// + /// + /// + private void RegistorInit() + { + this.RegistorFunCallBack(ApiFunConst.HisDataRequestFun, HisDataRequest); + this.RegistorFunCallBack(ApiFunConst.TagInfoRequest, TagInfoRequest); + } + + /// + /// + /// + public void PushRealDatatoClient(string clientId,byte[] value) + { + this.SendData(clientId, Api.ApiFunConst.RealDataPushFun, value,value.Length); + } + + /// + /// + /// + /// + /// + public void PushRealDatatoClient(string clientId, IByteBuffer value) + { + this.SendData(clientId, value); + } + + /// + /// + /// + /// + /// + /// + public void AsyncCallback(string clientId,byte fun, byte[] value,int len) + { + this.SendData(clientId, fun, value, len); + + } + + /// + /// + /// + /// + /// + public void AsyncCallback(string clientId, IByteBuffer data) + { + this.SendData(clientId, data); + } + + /// + /// + /// + /// + /// + /// + /// + public void AsyncCallback(string clientId, byte fun, IntPtr value, int len) + { + this.SendData(clientId, fun, value, len); + } + + private IByteBuffer TagInfoRequest(string clientId, IByteBuffer memory) + { + mInfoProcess.ProcessData(clientId, memory); + return GetAsyncData(); + } + + /// + /// + /// + /// + /// + /// + private IByteBuffer HisDataRequest(string clientId, IByteBuffer memory) + { + this.mHisProcess.ProcessData(clientId, memory); + return GetAsyncData(); + } + + + #endregion ...Methods... + + #region ... Interfaces ... + + #endregion ...Interfaces... + } +} diff --git a/DBHisDataServer/HisDataServerProcess.cs b/DBHisDataServer/HisDataServerProcess.cs new file mode 100644 index 0000000..3d53792 --- /dev/null +++ b/DBHisDataServer/HisDataServerProcess.cs @@ -0,0 +1,1069 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/5/14 11:00:38. +// Version 1.0 +// 种道洋 +//============================================================== + +using DotNetty.Buffers; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using Cdy.Tag; +using System.Runtime.InteropServices; + +namespace DBRuntime.Api +{ + public class HisDataServerProcess : ServerProcessBase + { + + #region ... Variables ... + + /// + /// + /// + public const byte RequestHisDatasByTimePoint = 0; + + /// + /// + /// + public const byte RequestAllHisData = 1; + + /// + /// + /// + public const byte RequestHisDataByTimeSpan = 2; + + #endregion ...Variables... + + #region ... Events ... + + #endregion ...Events... + + #region ... Constructor... + + #endregion ...Constructor... + + #region ... Properties ... + + public override byte FunId => ApiFunConst.HisDataRequestFun; + + #endregion ...Properties... + + #region ... Methods ... + + /// + /// + /// + /// + /// + public override void ProcessData(string client, IByteBuffer data) + { + if (data.ReferenceCount == 0) + { + Debug.Print("invailed data buffer in HisDataServerProcess"); + return; + } + byte cmd = data.ReadByte(); + string id = data.ReadString(); + if (Cdy.Tag.ServiceLocator.Locator.Resolve().CheckLogin(id)) + { + try + { + switch (cmd) + { + case RequestAllHisData: + ProcessRequestAllHisDataByMemory(client, data); + break; + case RequestHisDatasByTimePoint: + ProcessRequestHisDatasByTimePointByMemory(client, data); + break; + case RequestHisDataByTimeSpan: + ProcessRequestHisDataByTimeSpanByMemory(client, data); + break; + } + } + catch + { + + } + } + else + { + Parent.AsyncCallback(client, FunId, new byte[1], 0); + } + base.ProcessData(client, data); + } + + #region Serise to IByteBuffer + + //private unsafe IByteBuffer WriteDataToBuffer(byte type,HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId,5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for(int i=0;i resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteByte(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteShort(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteUnsignedShort(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt((int)value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong((long)value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong((long)value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteDouble((double)value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteFloat(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong(value.Ticks); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteString(value); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + ///// + ///// + ///// + ///// + ///// + ///// + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt(value.X); + // re.WriteInt(value.Y); + + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt(value.X); + // re.WriteInt(value.Y); + // re.WriteInt(value.Z); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt((int)value.X); + // re.WriteInt((int)value.Y); + + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteInt((int)value.X); + // re.WriteInt((int)value.Y); + // re.WriteInt((int)value.Z); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + ///// + ///// + ///// + ///// + ///// + ///// + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong(value.X); + // re.WriteLong(value.Y); + + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + ///// + ///// + ///// + ///// + ///// + ///// + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong((long)value.X); + // re.WriteLong((long)value.Y); + + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong(value.X); + // re.WriteLong(value.Y); + // re.WriteLong(value.Z); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + + //private unsafe IByteBuffer WriteDataToBuffer(byte type, HisQueryResult resb) + //{ + // var re = BufferManager.Manager.Allocate(FunId, 5 + resb.Position); + // re.WriteByte(type); + // re.WriteInt(resb.Count); + // DateTime time; + // byte qu; + // for (int i = 0; i < resb.Count; i++) + // { + // var value = resb.GetValue(i, out time, out qu); + // re.WriteLong((long)value.X); + // re.WriteLong((long)value.Y); + // re.WriteLong((long)value.Z); + // re.WriteLong(time.Ticks); + // re.WriteByte(qu); + // } + // return re; + //} + #endregion + + /// + /// + /// + /// + /// + /// + /// + private unsafe IByteBuffer WriteDataToBufferByMemory(byte type, HisQueryResult resb) + { + var vdata = resb.Contracts(); + var re = BufferManager.Manager.Allocate(FunId, 5 + vdata.Size); + re.WriteByte(type); + re.WriteInt(resb.Count); + + Marshal.Copy(vdata.Address, re.Array, re.ArrayOffset+ 6, vdata.Size); + re.SetWriterIndex(re.WriterIndex + vdata.Size); + + return re; + } + + private unsafe void ProcessRequestAllHisDataByMemory(string clientId, IByteBuffer data) + { + int id = data.ReadInt(); + DateTime sTime = new DateTime(data.ReadLong()); + DateTime eTime = new DateTime(data.ReadLong()); + var tags = ServiceLocator.Locator.Resolve().GetTagById(id); + + IByteBuffer re = null; + + if (tags != null) + { + switch (tags.Type) + { + case Cdy.Tag.TagType.Bool: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Byte: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.DateTime: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Double: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Float: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Int: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Long: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.Short: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.String: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.UInt: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.ULong: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.UShort: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.IntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.UIntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.IntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.UIntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.LongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.ULongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.LongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + case Cdy.Tag.TagType.ULongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + break; + } + Parent.AsyncCallback(clientId, re); + } + else + { + Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + } + } + + /// + /// + /// + /// + /// + private void ProcessRequestHisDatasByTimePointByMemory(string clientId, IByteBuffer data) + { + int id = data.ReadInt(); + Cdy.Tag.QueryValueMatchType type = (QueryValueMatchType)data.ReadByte(); + int count = data.ReadInt(); + List times = new List(); + for(int i=0;i().GetTagById(id); + + IByteBuffer re = null; + + if (tags != null) + { + switch (tags.Type) + { + case Cdy.Tag.TagType.Bool: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Byte: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.DateTime: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Double: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Float: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Int: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Long: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Short: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.String: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UInt: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULong: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UShort: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.IntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UIntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.IntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UIntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.LongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.LongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + } + Parent.AsyncCallback(clientId, re); + } + else + { + Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + } + } + + /// + /// + /// + /// + /// + private void ProcessRequestHisDataByTimeSpanByMemory(string clientId, IByteBuffer data) + { + int id = data.ReadInt(); + Cdy.Tag.QueryValueMatchType type = (QueryValueMatchType)data.ReadByte(); + DateTime stime = new DateTime(data.ReadLong()); + DateTime etime = new DateTime(data.ReadLong()); + TimeSpan ts = new TimeSpan(data.ReadLong()); + List times = new List(); + DateTime tmp = stime; + while (tmp <= etime) + { + times.Add(tmp); + tmp += ts; + } + var tags = ServiceLocator.Locator.Resolve().GetTagById(id); + + IByteBuffer re = null; + + if (tags != null) + { + switch (tags.Type) + { + case Cdy.Tag.TagType.Bool: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Byte: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.DateTime: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Double: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Float: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Int: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Long: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.Short: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.String: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UInt: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULong: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UShort: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.IntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UIntPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.IntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.UIntPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.LongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULongPoint: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.LongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + case Cdy.Tag.TagType.ULongPoint3: + re = WriteDataToBufferByMemory((byte)tags.Type, ProcessDataQuery(id, times, type)); + break; + } + Parent.AsyncCallback(clientId, re); + } + else + { + Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + } + } + + + + private HisQueryResult ProcessDataQuery(int id, DateTime stime, DateTime etime) + { + return ServiceLocator.Locator.Resolve().ReadAllValue(id, stime, etime); + } + + /// + /// + /// + /// + /// + /// + /// + /// + private HisQueryResult ProcessDataQuery(int id, List times, Cdy.Tag.QueryValueMatchType type) + { + return ServiceLocator.Locator.Resolve().ReadValue(id, times, type); + } + + ///// + ///// + ///// + ///// + //private unsafe void ProcessRequestAllHisData(string clientId, IByteBuffer data) + //{ + // int id = data.ReadInt(); + // DateTime sTime = new DateTime(data.ReadLong()); + // DateTime eTime = new DateTime(data.ReadLong()); + // var tags = ServiceLocator.Locator.Resolve().GetTagById(id); + + // IByteBuffer re = null; + + // if (tags != null) + // { + // switch (tags.Type) + // { + // case Cdy.Tag.TagType.Bool: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Byte: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.DateTime: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Double: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Float: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Int: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Long: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.Short: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.String: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.UInt: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.ULong: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.UShort: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.IntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.UIntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.IntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.UIntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.LongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.ULongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.LongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // case Cdy.Tag.TagType.ULongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, sTime, eTime)); + // break; + // } + // Parent.AsyncCallback(clientId, re); + // } + // else + // { + // Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + // } + //} + + ///// + ///// + ///// + ///// + //private void ProcessRequestHisDatasByTimePoint(string clientId, IByteBuffer data) + //{ + // int id = data.ReadInt(); + // Cdy.Tag.QueryValueMatchType type = (QueryValueMatchType)data.ReadByte(); + // int count = data.ReadInt(); + // List times = new List(); + // for(int i=0;i().GetTagById(id); + + // IByteBuffer re = null; + + // if (tags != null) + // { + // switch (tags.Type) + // { + // case Cdy.Tag.TagType.Bool: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Byte: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.DateTime: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Double: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Float: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Int: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Long: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Short: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.String: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UInt: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULong: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UShort: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.IntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UIntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.IntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UIntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.LongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.LongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // } + // Parent.AsyncCallback(clientId, re); + // } + // else + // { + // Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + // } + //} + + ///// + ///// + ///// + ///// + //private void ProcessRequestHisDataByTimeSpan(string clientId, IByteBuffer data) + //{ + // int id = data.ReadInt(); + // Cdy.Tag.QueryValueMatchType type = (QueryValueMatchType)data.ReadByte(); + // DateTime stime = new DateTime(data.ReadLong()); + // DateTime etime = new DateTime(data.ReadLong()); + // TimeSpan ts = new TimeSpan(data.ReadLong()); + // List times = new List(); + // DateTime tmp = stime; + // while(tmp<=etime) + // { + // times.Add(tmp); + // tmp += ts; + // } + // var tags = ServiceLocator.Locator.Resolve().GetTagById(id); + + // IByteBuffer re = null; + + // if (tags != null) + // { + // switch (tags.Type) + // { + // case Cdy.Tag.TagType.Bool: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Byte: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.DateTime: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Double: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Float: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Int: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Long: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.Short: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.String: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UInt: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULong: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UShort: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.IntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UIntPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.IntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.UIntPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.LongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULongPoint: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.LongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // case Cdy.Tag.TagType.ULongPoint3: + // re = WriteDataToBuffer((byte)tags.Type, ProcessDataQuery(id, times, type)); + // break; + // } + // Parent.AsyncCallback(clientId, re); + // } + // else + // { + // Parent.AsyncCallback(clientId, FunId, new byte[1], 0); + // } + //} + + #endregion ...Methods... + + #region ... Interfaces ... + + #endregion ...Interfaces... + + } +} diff --git a/DBHisDataServer/Program.cs b/DBHisDataServer/Program.cs new file mode 100644 index 0000000..3b6f8bc --- /dev/null +++ b/DBHisDataServer/Program.cs @@ -0,0 +1,176 @@ +using System; +using System.IO.Pipes; +using System.Text; +using System.Threading.Tasks; + +namespace DBHisDataServer +{ + class Program + { + static bool mIsClosed = false; + + static void Main(string[] args) + { + Console.CancelKeyPress += Console_CancelKeyPress; + AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; + + Console.WriteLine(Res.Get("WelcomeMsg")); + if (args.Length > 0 && args[0] == "start") + { + if (args.Length > 1) + { + Runner.Instance.Start(args[1]); + } + else + { + Runner.Instance.Start("local"); + } + Task.Run(() => { + StartMonitor(args.Length > 1 ? args[1] : "local"); + }); + } + + Console.WriteLine(Res.Get("HelpMsg")); + while (!mIsClosed) + { + Console.Write(">"); + + string smd = Console.ReadLine(); + if (mIsClosed) + { + break; + } + if (string.IsNullOrEmpty(smd)) continue; + + string[] cmd = smd.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); + + if (cmd.Length == 0) continue; + + string scmd = cmd[0].ToLower(); + switch (scmd) + { + case "exit": + if (Runner.Instance.IsStarted) + { + Runner.Instance.Stop(); + } + mIsClosed = true; + break; + case "start": + if (cmd.Length > 1) + { + Runner.Instance.Start(cmd[1]); + } + else + { + Runner.Instance.Start("local"); + } + Task.Run(() => { + StartMonitor(cmd.Length > 1 ? cmd[1] : "local"); + }); + break; + case "stop": + Runner.Instance.Stop(); + break; + case "h": + Console.WriteLine(GetHelpString()); + break; + //case "mtest": + // block = new MarshalMemoryBlock((long)(1024 * 1024 * 1024)*2); + // //block.Clear(); + // break; + } + } + } + + /// + /// + /// + /// + private static string GetHelpString() + { + StringBuilder re = new StringBuilder(); + re.AppendLine(); + re.AppendLine("start [database] // " + Res.Get("StartMsg")); + + re.AppendLine("stop // " + Res.Get("StopMsg")); + re.AppendLine("exit // "); + re.AppendLine("h // " + Res.Get("HMsg")); + return re.ToString(); + } + + /// + /// + /// + /// + /// + private static void CurrentDomain_ProcessExit(object sender, EventArgs e) + { + if (Runner.Instance.IsStarted) + { + Runner.Instance.Stop(); + } + } + + private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) + { + if (Runner.Instance.IsStarted) + { + Runner.Instance.Stop(); + } + mIsClosed = true; + e.Cancel = true; + Console.WriteLine(Res.Get("AnyKeyToExit")); + + } + + private static void StartMonitor(string name) + { + try + { + while (!mIsClosed) + { + using (var server = new NamedPipeServerStream(name+"h", PipeDirection.InOut)) + { + server.WaitForConnection(); + while (!mIsClosed) + { + try + { + if (!server.IsConnected) break; + var cmd = server.ReadByte(); + if (cmd == 0) + { + if (Runner.Instance.IsStarted) + { + Runner.Instance.Stop(); + } + mIsClosed = true; + server.WriteByte(1); + server.WaitForPipeDrain(); + Console.WriteLine(Res.Get("AnyKeyToExit")); + break; + //退出系统 + } + else + { + + } + } + catch + { + break; + } + } + } + + } + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } +} diff --git a/DBHisDataServer/Properties/Resources.Designer.cs b/DBHisDataServer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..dff6264 --- /dev/null +++ b/DBHisDataServer/Properties/Resources.Designer.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace DBHisDataServer.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DBHisDataServer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 press any key to exit. 的本地化字符串。 + /// + internal static string AnyKeyToExit { + get { + return ResourceManager.GetString("AnyKeyToExit", resourceCulture); + } + } + + /// + /// 查找类似 Enter h for command help information 的本地化字符串。 + /// + internal static string HelpMsg { + get { + return ResourceManager.GetString("HelpMsg", resourceCulture); + } + } + + /// + /// 查找类似 display command list 的本地化字符串。 + /// + internal static string HMsg { + get { + return ResourceManager.GetString("HMsg", resourceCulture); + } + } + + /// + /// 查找类似 start to run a databse,ignor database name to run default 'local' database 的本地化字符串。 + /// + internal static string StartMsg { + get { + return ResourceManager.GetString("StartMsg", resourceCulture); + } + } + + /// + /// 查找类似 stop databse 的本地化字符串。 + /// + internal static string StopMsg { + get { + return ResourceManager.GetString("StopMsg", resourceCulture); + } + } + + /// + /// 查找类似 ***************Welcome to Mars high performance realtime iot database his data server*************** 的本地化字符串。 + /// + internal static string WelcomeMsg { + get { + return ResourceManager.GetString("WelcomeMsg", resourceCulture); + } + } + } +} diff --git a/DBHisDataServer/Properties/Resources.resx b/DBHisDataServer/Properties/Resources.resx new file mode 100644 index 0000000..a339779 --- /dev/null +++ b/DBHisDataServer/Properties/Resources.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + press any key to exit. + + + Enter h for command help information + + + display command list + + + start to run a databse,ignor database name to run default 'local' database + + + stop databse + + + ***************Welcome to Mars high performance realtime iot database his data server*************** + + \ No newline at end of file diff --git a/DBHisDataServer/Properties/launchSettings.json b/DBHisDataServer/Properties/launchSettings.json new file mode 100644 index 0000000..c6e1af2 --- /dev/null +++ b/DBHisDataServer/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "DBHisDataServer": { + "commandName": "Executable", + "executablePath": "D:\\Project\\Galaxy\\Output\\DBHisDataServer.exe" + } + } +} \ No newline at end of file diff --git a/DBHisDataServer/Res.cs b/DBHisDataServer/Res.cs new file mode 100644 index 0000000..771d65c --- /dev/null +++ b/DBHisDataServer/Res.cs @@ -0,0 +1,24 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/3/29 11:05:05. +// Version 1.0 +// 种道洋 +//============================================================== + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace DBHisDataServer +{ + public class Res + { + public static string Get(string name) + { + return DBHisDataServer.Properties.Resources.ResourceManager.GetString(name, Thread.CurrentThread.CurrentCulture); + } + } +} diff --git a/DBHisDataServer/Runner.cs b/DBHisDataServer/Runner.cs new file mode 100644 index 0000000..e40af12 --- /dev/null +++ b/DBHisDataServer/Runner.cs @@ -0,0 +1,156 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/5/17 17:53:01. +// Version 1.0 +// 种道洋 +//============================================================== + +using Cdy.Tag; +using System; +using System.Collections.Generic; +using System.Text; + +namespace DBHisDataServer +{ + /// + /// + /// + public class Runner + { + + #region ... Variables ... + private Database mDatabase; + private RealDatabase mRealDatabase; + private string mDatabaseName = "local"; + private SecurityRunner mSecurityRunner; + private QuerySerivce querySerivce; + + public static Runner Instance = new Runner(); + + private bool mIsStarted = false; + #endregion ...Variables... + + #region ... Events ... + + #endregion ...Events... + + #region ... Constructor... + + #endregion ...Constructor... + + #region ... Properties ... + /// + /// 数据库存访路径 + /// + public string DatabasePath { get; set; } + + /// + /// + /// + public bool IsStarted + { + get + { + return mIsStarted; + } + } + #endregion ...Properties... + + #region ... Methods ... + + private bool Init(string database) + { + + if (System.IO.Path.IsPathRooted(database)) + { + this.mDatabaseName = System.IO.Path.GetFileNameWithoutExtension(database); + this.DatabasePath = System.IO.Path.GetDirectoryName(database); + } + else + { + this.mDatabaseName = database; + } + PathHelper.helper.CheckDataPathExist(); + + if (CheckDatabaseExist(mDatabaseName)) + { + LoadDatabase(); + + + + querySerivce = new QuerySerivce(this.mDatabaseName); + + mSecurityRunner = new SecurityRunner() { Document = mDatabase.Security }; + + + + DataFileSeriserManager.manager.Init(); + CompressUnitManager.Manager.Init(); + HisQueryManager.Instance.Registor(mDatabaseName); + + RegistorInterface(); + return true; + } + else + { + LoggerService.Service.Erro("Runner", "database " + database + " is not exist."); + return false; + } + } + + private bool CheckDatabaseExist(string name) + { + return System.IO.File.Exists(PathHelper.helper.GetDataPath(name, name + ".db")); + } + + /// + /// + /// + private void LoadDatabase() + { + this.mDatabase = new DatabaseSerise().Load(mDatabaseName); + this.mRealDatabase = this.mDatabase.RealDatabase; + + } + + private void RegistorInterface() + { + ServiceLocator.Locator.Registor(mRealDatabase); + ServiceLocator.Locator.Registor(mSecurityRunner); + ServiceLocator.Locator.Registor(querySerivce); + } + + /// + /// + /// + public void Start(string database) + { + var re = Init(database); + if (!re) + { + return; + } + DBRuntime.Api.DataService.Service.Start(14331); + mSecurityRunner.Start(); + mIsStarted = true; + } + + /// + /// + /// + public void Stop() + { + DBRuntime.Api.DataService.Service.Stop(); + mSecurityRunner.Stop(); + mIsStarted = false; + } + + #endregion ...Methods... + + #region ... Interfaces ... + + #endregion ...Interfaces... + } +} diff --git a/DBHisDataServer/ServerProcessBase.cs b/DBHisDataServer/ServerProcessBase.cs new file mode 100644 index 0000000..6068c0e --- /dev/null +++ b/DBHisDataServer/ServerProcessBase.cs @@ -0,0 +1,171 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/5/14 11:01:03. +// Version 1.0 +// 种道洋 +//============================================================== + +using Cdy.Tag; +using DotNetty.Buffers; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace DBRuntime.Api +{ + public abstract class ServerProcessBase:IDisposable + { + + #region ... Variables ... + /// + /// + /// + private Dictionary> mDatasCach = new Dictionary>(); + + private Thread mProcessThread; + + private ManualResetEvent resetEvent; + + private bool mIsClosed = false; + + #endregion ...Variables... + + #region ... Events ... + + #endregion ...Events... + + #region ... Constructor... + + #endregion ...Constructor... + + #region ... Properties ... + /// + /// + /// + public abstract byte FunId { get; } + + /// + /// + /// + public DataService Parent { get; set; } + + + + #endregion ...Properties... + + #region ... Methods ... + + + /// + /// + /// + /// + /// + protected IByteBuffer ToByteBuffer(byte id, string value) + { + var re = BufferManager.Manager.Allocate(ApiFunConst.TagInfoRequest, value.Length*2); + re.WriteString(value); + return re; + } + + /// + /// + /// + /// + /// + /// + protected IByteBuffer ToByteBuffer(byte id, byte value) + { + var re = BufferManager.Manager.Allocate(ApiFunConst.TagInfoRequest, 1); + re.WriteByte(value); + return re; + } + + /// + /// + /// + /// + public virtual void ProcessData(string client, IByteBuffer data) + { + data.Retain(); + if (mDatasCach.ContainsKey(client)) + { + mDatasCach[client].Enqueue(data); + } + else + { + var vq = new Queue(); + vq.Enqueue(data); + mDatasCach.Add(client, vq); + } + resetEvent.Set(); + } + + /// + /// + /// + private void DataProcess() + { + while (!mIsClosed) + { + resetEvent.WaitOne(); + if (mIsClosed) return; + resetEvent.Reset(); + foreach (var vv in mDatasCach) + { + while(vv.Value.Count>0) + { + var dd = vv.Value.Dequeue(); + ProcessSingleData(vv.Key, dd); + } + } + } + } + + /// + /// + /// + /// + /// + protected virtual void ProcessSingleData(string client, IByteBuffer data) + { + data.Release(); + } + + + public virtual void Start() + { + resetEvent = new ManualResetEvent(false); + mProcessThread = new Thread(DataProcess); + mProcessThread.IsBackground = true; + mProcessThread.Start(); + } + + /// + /// + /// + public virtual void Stop() + { + mIsClosed = true; + resetEvent.Set(); + resetEvent.Close(); + } + + /// + /// + /// + public virtual void Dispose() + { + Parent = null; + } + + #endregion ...Methods... + + #region ... Interfaces ... + + #endregion ...Interfaces... + } +} diff --git a/DBHisDataServer/TagInfoServerProcess.cs b/DBHisDataServer/TagInfoServerProcess.cs new file mode 100644 index 0000000..96728be --- /dev/null +++ b/DBHisDataServer/TagInfoServerProcess.cs @@ -0,0 +1,92 @@ +//============================================================== +// Copyright (C) 2020 Inc. All rights reserved. +// +//============================================================== +// Create by 种道洋 at 2020/5/14 11:00:38. +// Version 1.0 +// 种道洋 +//============================================================== + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using Cdy.Tag; +using DotNetty.Buffers; + +namespace DBRuntime.Api +{ + public class TagInfoServerProcess : ServerProcessBase + { + + #region ... Variables ... + + public const byte GetTagIdByNameFun = 0; + + public const byte Login = 1; + + public const byte RegistValueCallBack = 2; + + public const byte GetdatabaseName = 3; + + #endregion ...Variables... + + #region ... Events ... + + #endregion ...Events... + + #region ... Constructor... + + + + #endregion ...Constructor... + + #region ... Properties ... + + public override byte FunId => ApiFunConst.TagInfoRequest; + + #endregion ...Properties... + + #region ... Methods ... + + + + /// + /// + /// + /// + /// + protected unsafe override void ProcessSingleData(string client, IByteBuffer data) + { + var mm = Cdy.Tag.ServiceLocator.Locator.Resolve(); + byte sfun = data.ReadByte(); + switch (sfun) + { + case Login: + string user = data.ReadString(); + string pass = data.ReadString(); + string result = Cdy.Tag.ServiceLocator.Locator.Resolve().Login(user, pass); + if (!string.IsNullOrEmpty(result)) + { + Parent.AsyncCallback(client, ToByteBuffer(ApiFunConst.TagInfoRequest,result)); + } + else + { + Parent.AsyncCallback(client, ToByteBuffer(ApiFunConst.TagInfoRequest, "")); + } + break; + + + } + + + } + + #endregion ...Methods... + + #region ... Interfaces ... + + #endregion ...Interfaces... + + } +} diff --git a/DBInRun/Program.cs b/DBInRun/Program.cs index c7ce7e2..ca67c30 100644 --- a/DBInRun/Program.cs +++ b/DBInRun/Program.cs @@ -1,6 +1,8 @@ using Cdy.Tag; using System; +using System.IO.Pipes; using System.Text; +using System.Threading.Tasks; namespace DBInRun { @@ -24,6 +26,10 @@ namespace DBInRun { Cdy.Tag.Runner.RunInstance.Start(); } + Task.Run(() => { + StartMonitor(args.Length > 1 ? args[1] : "local"); + }); + } Console.WriteLine(Res.Get("HelpMsg")); @@ -53,17 +59,22 @@ namespace DBInRun mIsClosed = true; break; case "start": + string dbname = "local"; if (cmd.Length > 1) { Cdy.Tag.Runner.RunInstance.StartAsync(cmd[1]); Console.Title = "DbInRun-" + cmd[1]; + dbname = cmd[1]; } else { Cdy.Tag.Runner.RunInstance.Start(); Console.Title = "DbInRun-local"; + dbname = "local"; } - + Task.Run(() => { + StartMonitor(dbname); + }); break; case "stop": Cdy.Tag.Runner.RunInstance.Stop(); @@ -130,6 +141,55 @@ namespace DBInRun } + private static void StartMonitor(string name) + { + try + { + while (!mIsClosed) + { + using (var server = new NamedPipeServerStream(name, PipeDirection.InOut)) + { + server.WaitForConnection(); + while (!mIsClosed) + { + try + { + if (!server.IsConnected) break; + var cmd = server.ReadByte(); + if (cmd == 0) + { + if (Cdy.Tag.Runner.RunInstance.IsStarted) + { + Cdy.Tag.Runner.RunInstance.Stop(); + } + mIsClosed = true; + server.WriteByte(1); + server.WaitForPipeDrain(); + Console.WriteLine(Res.Get("AnyKeyToExit")); + break; + //退出系统 + } + else + { + + } + } + catch + { + break; + } + } + } + + } + + } + catch(Exception ex) + { + Console.WriteLine(ex.Message); + } + } + /// /// /// diff --git a/DBRunTimeServiceApi/ApiClient.cs b/DBRunTimeServiceApi/ApiClient.cs index de733c0..a8b1b52 100644 --- a/DBRunTimeServiceApi/ApiClient.cs +++ b/DBRunTimeServiceApi/ApiClient.cs @@ -127,6 +127,9 @@ namespace DBRunTime.ServiceApi public ProcessDataPushDelegate ProcessDataPush { get; set; } + private string mUser; + private string mPass; + #endregion ...Properties... #region ... Methods ... @@ -185,6 +188,8 @@ namespace DBRunTime.ServiceApi /// public bool Login(string username,string password,int timeount=5000) { + mUser = username; + mPass = password; int size = username.Length + password.Length + 9; var mb = GetBuffer(ApiFunConst.TagInfoRequest, size); mb.WriteByte(ApiFunConst.Login); @@ -199,7 +204,7 @@ namespace DBRunTime.ServiceApi return IsLogin; } } - mInfoRequreData?.Release(); + //mInfoRequreData?.Release(); LoginId = string.Empty; return IsLogin; } @@ -261,7 +266,7 @@ namespace DBRunTime.ServiceApi } finally { - mInfoRequreData?.ReleaseBuffer(); + //mInfoRequreData?.ReleaseBuffer(); } return string.Empty; } @@ -278,6 +283,7 @@ namespace DBRunTime.ServiceApi /// public bool RegistorTagValueCallBack(int minid, int maxid, int timeout = 5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length + 8); mb.WriteByte(ApiFunConst.RegistorValueCallback); mb.WriteString(this.LoginId); @@ -294,7 +300,7 @@ namespace DBRunTime.ServiceApi } finally { - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); } return true; } @@ -306,6 +312,7 @@ namespace DBRunTime.ServiceApi /// public bool ClearRegistorTagValueCallBack(int timeout = 5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length + 8); mb.WriteByte(ApiFunConst.ResetValueChangeNotify); mb.WriteString(this.LoginId); @@ -321,7 +328,7 @@ namespace DBRunTime.ServiceApi } finally { - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); } return true; } @@ -332,6 +339,7 @@ namespace DBRunTime.ServiceApi /// public IByteBuffer GetRealData(List ids,int timeout=5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length +ids.Count* 4); mb.WriteByte(ApiFunConst.RequestRealData); mb.WriteString(this.LoginId); @@ -352,7 +360,7 @@ namespace DBRunTime.ServiceApi } finally { - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); } @@ -361,7 +369,7 @@ namespace DBRunTime.ServiceApi public IByteBuffer GetRealData(int ids,int ide, int timeout = 5000) { - + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length + (ide - ids) * 4); mb.WriteByte(ApiFunConst.RequestRealData2); mb.WriteString(this.LoginId); @@ -374,7 +382,7 @@ namespace DBRunTime.ServiceApi { return mRealRequreData; } - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); return null; } @@ -387,6 +395,7 @@ namespace DBRunTime.ServiceApi /// public bool SetTagValue(int id,byte valueType,object value,int timeout=5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length + 30); mb.WriteByte(ApiFunConst.SetDataValue); mb.WriteString(this.LoginId); @@ -479,7 +488,7 @@ namespace DBRunTime.ServiceApi } finally { - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); } return false; } @@ -494,6 +503,7 @@ namespace DBRunTime.ServiceApi /// public bool SetTagValue(List id, List valueType, List value, int timeout = 5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.RealDataRequestFun, this.LoginId.Length + 30); mb.WriteByte(ApiFunConst.SetDataValue); mb.WriteString(this.LoginId); @@ -588,7 +598,7 @@ namespace DBRunTime.ServiceApi } finally { - mRealRequreData?.ReleaseBuffer(); + //mRealRequreData?.ReleaseBuffer(); } return false; } @@ -596,6 +606,14 @@ namespace DBRunTime.ServiceApi #endregion + private void CheckLogin() + { + if(string.IsNullOrEmpty(LoginId)) + { + Login(mUser, mPass); + } + } + #region HisData /// @@ -607,6 +625,7 @@ namespace DBRunTime.ServiceApi /// public IByteBuffer QueryAllHisValue(int id,DateTime startTime,DateTime endTime,int timeout=5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.HisDataRequestFun, this.LoginId.Length + 20); mb.WriteByte(ApiFunConst.RequestAllHisData); mb.WriteString(this.LoginId); @@ -625,7 +644,7 @@ namespace DBRunTime.ServiceApi } finally { - mHisRequreData?.ReleaseBuffer(); + //mHisRequreData?.ReleaseBuffer(); } return null; } @@ -639,6 +658,7 @@ namespace DBRunTime.ServiceApi /// public IByteBuffer QueryHisValueAtTimes(int id, List times, Cdy.Tag.QueryValueMatchType matchType, int timeout = 5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.HisDataRequestFun, this.LoginId.Length + times.Count * 8 + 5); mb.WriteByte(ApiFunConst.RequestHisDatasByTimePoint); mb.WriteString(this.LoginId); @@ -661,7 +681,7 @@ namespace DBRunTime.ServiceApi } finally { - mHisRequreData?.ReleaseBuffer(); + //mHisRequreData?.ReleaseBuffer(); } return null; } @@ -677,6 +697,7 @@ namespace DBRunTime.ServiceApi /// public IByteBuffer QueryHisValueForTimeSpan(int id,DateTime startTime,DateTime endTime,TimeSpan span,QueryValueMatchType matchType, int timeout = 5000) { + CheckLogin(); var mb = GetBuffer(ApiFunConst.HisDataRequestFun, this.LoginId.Length + 24+ 5); mb.WriteByte(ApiFunConst.RequestHisDataByTimeSpan); mb.WriteString(this.LoginId); @@ -696,7 +717,7 @@ namespace DBRunTime.ServiceApi } finally { - mHisRequreData?.ReleaseBuffer(); + //mHisRequreData?.ReleaseBuffer(); } return null; } diff --git a/DBRuntime.Proxy/Config/ProxyClientConfig.xml b/DBRuntime.Proxy/Config/ProxyClientConfig.xml index 49739de..5bf8713 100644 --- a/DBRuntime.Proxy/Config/ProxyClientConfig.xml +++ b/DBRuntime.Proxy/Config/ProxyClientConfig.xml @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/DBRuntime.Proxy/DatabaseRunner.cs b/DBRuntime.Proxy/DatabaseRunner.cs index 84f19c3..5f55631 100644 --- a/DBRuntime.Proxy/DatabaseRunner.cs +++ b/DBRuntime.Proxy/DatabaseRunner.cs @@ -50,6 +50,8 @@ namespace DBRuntime.Proxy private int mPollCircle = 1000; + private bool mUseStandardHisDataServer = false; + #endregion ...Variables... #region ... Events ... @@ -131,6 +133,11 @@ namespace DBRuntime.Proxy { mPollCircle = int.Parse(xe.Attribute("PollCircle").Value); } + + if (xe.Attribute("IsUseStandardHisDataServer") != null) + { + mUseStandardHisDataServer = bool.Parse(xe.Attribute("IsUseStandardHisDataServer").Value); + } } } @@ -139,7 +146,7 @@ namespace DBRuntime.Proxy /// public void Start() { - mProxy = new DbServerProxy() { UserName = mUserName, Password = mPassword }; + mProxy = new DbServerProxy() { UserName = mUserName, Password = mPassword,IsUseStandardHisDataServer= mUseStandardHisDataServer }; mProxy.Connect(mIp, mPort); mProxy.PropertyChanged += MProxy_PropertyChanged; mMonitorThread = new Thread(MonitorThreadPro); diff --git a/DBRuntime.Proxy/DbServerProxy.cs b/DBRuntime.Proxy/DbServerProxy.cs index b487405..120892d 100644 --- a/DBRuntime.Proxy/DbServerProxy.cs +++ b/DBRuntime.Proxy/DbServerProxy.cs @@ -20,6 +20,8 @@ namespace DBRuntime.Proxy ApiClient dbClient; + ApiClient mHisClient; + private bool mIsConnected; private ManualResetEvent resetEvent; @@ -33,6 +35,8 @@ namespace DBRuntime.Proxy private bool mIsClosed = false; + ApiClient mUsedHisClient; + #endregion ...Variables... #region ... Events ... @@ -46,7 +50,7 @@ namespace DBRuntime.Proxy /// public DbServerProxy() { - Init(); + resetEvent = new ManualResetEvent(false); } @@ -91,6 +95,7 @@ namespace DBRuntime.Proxy } } + public bool IsUseStandardHisDataServer { get; set; } = false; #endregion ...Properties... @@ -110,6 +115,17 @@ namespace DBRuntime.Proxy { dbClient.Connect(mIp, mPort); } + if (IsUseStandardHisDataServer) + { + if (!mHisClient.IsConnected) + { + mHisClient.Connect(mIp, mPort + 1); + } + else + { + mHisClient.Login(UserName, Password); + } + } resetEvent.Set(); while (!mIsClosed) { @@ -125,6 +141,18 @@ namespace DBRuntime.Proxy { dbClient.Connect(mIp, mPort); } + if (IsUseStandardHisDataServer) + { + if (mHisClient.IsConnected) + { + mHisClient.Login(UserName, Password); + } + else if (mHisClient.NeedReConnected) + { + mHisClient.Connect(mIp, mPort + 1); + } + } + Thread.Sleep(1000); } else @@ -142,6 +170,31 @@ namespace DBRuntime.Proxy { dbClient = new ApiClient(); dbClient.PropertyChanged += DbClient_PropertyChanged; + + if (IsUseStandardHisDataServer) + { + mHisClient = new ApiClient(); + mHisClient.PropertyChanged += MHisClient_PropertyChanged; + mUsedHisClient = mHisClient; + } + else + { + mUsedHisClient = dbClient; + } + } + + /// + /// + /// + /// + /// + private void MHisClient_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "IsConnected") + { + if (!mHisClient.IsConnected) + resetEvent.Set(); + } } /// @@ -166,9 +219,15 @@ namespace DBRuntime.Proxy /// public void Connect(string ip,int port) { + Init(); mIp = ip; mPort = port; dbClient.Connect(ip, port); + if (IsUseStandardHisDataServer) + { + mHisClient.Connect(ip, port + 1); + + } mScanThread = new Thread(ConnectProcess); mScanThread.IsBackground = true; mScanThread.Start(); @@ -183,6 +242,11 @@ namespace DBRuntime.Proxy resetEvent.Set(); dbClient.PropertyChanged -= DbClient_PropertyChanged; dbClient.Close(); + if (IsUseStandardHisDataServer) + { + mHisClient.PropertyChanged -= MHisClient_PropertyChanged; + mHisClient.Close(); + } } /// @@ -424,8 +488,8 @@ namespace DBRuntime.Proxy { if (IsConnected) { - var res = dbClient.QueryAllHisValue(id, stime, etime); - if (res == null || res.ReadableBytes == 0) return null; + var res = this.mUsedHisClient.QueryAllHisValue(id, stime, etime); + if (res == null || res.ReferenceCount == 0) return null; TagType tp = (TagType)res.ReadByte(); switch (tp) { @@ -489,7 +553,7 @@ namespace DBRuntime.Proxy { if (IsConnected) { - var res = dbClient.QueryHisValueForTimeSpan(id, stime, etime, span, type); + var res = mUsedHisClient.QueryHisValueForTimeSpan(id, stime, etime, span, type); if (res == null) return null; TagType tp = (TagType)res.ReadByte(); switch (tp) @@ -544,7 +608,7 @@ namespace DBRuntime.Proxy { if (IsConnected) { - var res = dbClient.QueryHisValueAtTimes(id, times, type); + var res = mUsedHisClient.QueryHisValueAtTimes(id, times, type); if (res == null) return null; TagType tp = (TagType)res.ReadByte(); switch (tp) diff --git a/DBStudio/Program.cs b/DBStudio/Program.cs index e777d5e..f6e56b9 100644 --- a/DBStudio/Program.cs +++ b/DBStudio/Program.cs @@ -5,6 +5,8 @@ using System.Linq; using System.Collections.Generic; using System.IO; using System.Diagnostics; +using System.IO.Pipes; +using System.Threading; namespace DBStudio { @@ -46,7 +48,7 @@ namespace DBStudio else if (cmsg == "db") { if (cmd.Length > 1) - ProcessDatabaseCreat(cmd[1]); + ProcessDatabaseCreate(cmd[1]); } else if (cmsg == "list") { @@ -144,7 +146,7 @@ namespace DBStudio /// /// /// - private static void ProcessDatabaseCreat(string name) + private static void ProcessDatabaseCreate(string name) { if (!DBDevelopService.DbManager.Instance.IsLoaded) DBDevelopService.DbManager.Instance.Load(); @@ -187,9 +189,36 @@ namespace DBStudio } else if (cmsg == "start") { - + if (!CheckStart(db.Name)) + { + StartDb(db.Name); + } + else + { + Console.WriteLine("database " + db.Name + " is in running."); + } + } + else if (cmsg == "restart") + { + StopDatabase(db.Name); + while (CheckStart(db.Name)) Thread.Sleep(100); StartDb(db.Name); } + else if (cmsg == "isstart") + { + if(CheckStart(db.Name)) + { + Console.WriteLine("database "+db.Name+" is start."); + } + else + { + Console.WriteLine("database " + db.Name + " is stop."); + } + } + else if (cmsg == "stop") + { + StopDatabase(db.Name); + } else if (cmsg == "updatehis") { UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]); @@ -233,7 +262,7 @@ namespace DBStudio break; } } - catch + catch(Exception ex) { OutByLine(name, Res.Get("ErroParameter")); } @@ -365,6 +394,9 @@ namespace DBStudio { StringBuilder re = new StringBuilder(); re.AppendLine(); + re.AppendLine("start // start database "); + re.AppendLine("restart // restart database "); + re.AppendLine("stop // stop database "); re.AppendLine("add [tagtype] [tagname] [linkaddress] [repeat] // add numbers tag to database "); re.AppendLine("remove [tagname] // remove a tag"); re.AppendLine("clear // clear all tags in database"); @@ -1079,7 +1111,45 @@ namespace DBStudio return re.ToString(); } + public static void StopDatabase(string name) + { + using (var client = new NamedPipeClientStream(".", name, PipeDirection.InOut)) + { + try + { + client.Connect(2000); + client.WriteByte(0); + client.WaitForPipeDrain(); + var res = client.ReadByte(); + if (res == 1) + { + Console.WriteLine("Stop database" + name + " sucessfull."); + } + } + catch + { + Console.WriteLine("Stop database " + name + " failed."); + } + } + } + public static bool CheckStart(string name) + { + using (var client = new NamedPipeClientStream(".", name, PipeDirection.InOut)) + { + try + { + client.Connect(1000); + client.Close(); + return true; + } + catch + { + return false; + } + } + } + } } diff --git a/DataRunner/Api/RealDataServerProcess.cs b/DataRunner/Api/RealDataServerProcess.cs index 11acb38..ba99af5 100644 --- a/DataRunner/Api/RealDataServerProcess.cs +++ b/DataRunner/Api/RealDataServerProcess.cs @@ -80,6 +80,7 @@ namespace DBRuntime.Api mChangedTags.Add(vv, true); } } + if(!mIsClosed) resetEvent.Set(); }), new Func>(() => { return new List() { -1 }; })); mTagManager = ServiceLocator.Locator.Resolve(); diff --git a/DbInRunWebApi/Config/DbWebApiProxy.cfg b/DbInRunWebApi/Config/DbWebApiProxy.cfg index 002de64..bab075b 100644 --- a/DbInRunWebApi/Config/DbWebApiProxy.cfg +++ b/DbInRunWebApi/Config/DbWebApiProxy.cfg @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/Mars.sln b/Mars.sln index fb849e5..7536c26 100644 --- a/Mars.sln +++ b/Mars.sln @@ -51,7 +51,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBRunTime.ServiceApi", "DBR EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBRuntime.Real", "DBRuntime.Real\DBRuntime.Real.csproj", "{55D1E991-570C-4357-8A7D-73756AA96B83}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBRuntime.Proxy", "DBRuntime.Proxy\DBRuntime.Proxy.csproj", "{A346892B-AA87-40D0-8537-1E3C2CD285E3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBRuntime.Proxy", "DBRuntime.Proxy\DBRuntime.Proxy.csproj", "{A346892B-AA87-40D0-8537-1E3C2CD285E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBHisDataServer", "DBHisDataServer\DBHisDataServer.csproj", "{C022701B-B2F7-429A-850F-C50CDC15B925}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -143,6 +145,10 @@ Global {A346892B-AA87-40D0-8537-1E3C2CD285E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {A346892B-AA87-40D0-8537-1E3C2CD285E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {A346892B-AA87-40D0-8537-1E3C2CD285E3}.Release|Any CPU.Build.0 = Release|Any CPU + {C022701B-B2F7-429A-850F-C50CDC15B925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C022701B-B2F7-429A-850F-C50CDC15B925}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C022701B-B2F7-429A-850F-C50CDC15B925}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C022701B-B2F7-429A-850F-C50CDC15B925}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -169,6 +175,7 @@ Global {A1C80D29-71CE-4EBC-982C-C94B9263F7F8} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE} {55D1E991-570C-4357-8A7D-73756AA96B83} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE} {A346892B-AA87-40D0-8537-1E3C2CD285E3} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE} + {C022701B-B2F7-429A-850F-C50CDC15B925} = {95F6A9D4-42A9-483A-80F8-EADDD6CEFEDE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {577CCEC3-4CDB-458A-B93D-F8579C2C3D8F} diff --git a/SimDriver/Driver.cs b/SimDriver/Driver.cs index b5eb72d..b8969c7 100644 --- a/SimDriver/Driver.cs +++ b/SimDriver/Driver.cs @@ -164,7 +164,7 @@ namespace SimDriver Stopwatch sw = new Stopwatch(); sw.Start(); //if(mNumber%10==0) - Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); + //Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); //#endif -- GitLab