public void Init() { //string host = "127.0.0.1"; // port = "6000"; ds = dsHandle.GetDataSet(@"Extractvalue(通讯参数, '/root/ip') As 仪器IP, Extractvalue(通讯参数, '/root/port') As 端口, Extractvalue(通讯参数, '/root/role') As 接收角色, Extractvalue(通讯参数, '/root/host') As 主机IP", "检验仪器", "id = '" + strInstrumentID + "'"); ip = ds.Tables[0].Rows[0]["仪器IP"].ToString(); port = ds.Tables[0].Rows[0]["端口"].ToString(); role = ds.Tables[0].Rows[0]["接收角色"].ToString(); host_ip = ds.Tables[0].Rows[0]["主机IP"].ToString(); role = role == "" ? "S" : (role.Replace("1", "S").Replace("2", "C")); ds = dsHandle.GetDataSet(@"解析类型,通讯程序名,名称,备注,Extractvalue(接收规则, '/root/data_type') As data_type, Extractvalue(接收规则, '/root/data_begin') As data_begin, Extractvalue(接收规则, '/root/data_end') As data_end, Extractvalue(接收规则, '/root/start_cmd') As start_cmd, Extractvalue(接收规则, '/root/end_cmd') As end_cmd, Extractvalue(接收规则, '/root/ack_all') As ack_all, Extractvalue(接收规则, '/root/ack_term') As ack_term, Extractvalue(接收规则, '/root/decode_mode') As decode_mode, Extractvalue(接收规则, '/root/begin_bits') As begin_bits, Extractvalue(接收规则, '/root/end_bits') As end_bits", "检验仪器", "id = '" + strInstrumentID + "'"); dataType = ds.Tables[0].Rows[0]["data_type"].ToString(); databegin = ds.Tables[0].Rows[0]["data_begin"].ToString(); dataend = ds.Tables[0].Rows[0]["data_end"].ToString(); //inBegin = ds.Tables[0].Rows[0][3].ToString(); //inEnd = ds.Tables[0].Rows[0][4].ToString(); decode_mode = ds.Tables[0].Rows[0]["decode_mode"].ToString(); SubBegin = ds.Tables[0].Rows[0]["begin_bits"].ToString(); SubEnd = ds.Tables[0].Rows[0]["end_bits"].ToString(); ACK_term = ds.Tables[0].Rows[0]["ack_term"].ToString(); ACK_all = ds.Tables[0].Rows[0]["ack_all"].ToString(); CommProgramName = ds.Tables[0].Rows[0]["通讯程序名"].ToString(); strDeviceName = ds.Tables[0].Rows[0]["名称"].ToString(); RemarkContent = ds.Tables[0].Rows[0]["备注"].ToString(); try { obj = ObjectReflection.CreateObject(CommProgramName.Substring(0, CommProgramName.IndexOf(".dll"))); IResolve = obj as IDataResolve; IResolve.GetRules(strInstrumentID); } catch (Exception exobj) { writeLog.Write(strDeviceName, exobj.Message, "log"); return; } //通过线程去提取数据 System.Threading.ParameterizedThreadStart ParStart = new System.Threading.ParameterizedThreadStart(Start); System.Threading.Thread threadSocket = new System.Threading.Thread(ParStart); object socketListen = strError; threadSocket.Start(socketListen); //Start(); }
//DATABASE /// <summary> /// 初始化执行 /// </summary> public void Init(string yqid) { strInstrumentID = yqid; ds = dsHandle.GetDataSet(@"解析类型,通讯程序名, Extractvalue(通讯参数, '/root/db_type') as db_type, Extractvalue(通讯参数, '/root/db_name') as db_name, Extractvalue(通讯参数, '/root/user_name') as user_name, Extractvalue(通讯参数, '/root/password') as password, Extractvalue(通讯参数, '/root/server_name') as server_name, Extractvalue(通讯参数, '/root/parastr') as parastr, Extractvalue(通讯参数, '/root/selectstr') as selectstr", "检验仪器", "id = '" + strInstrumentID + "'"); databasetype = ds.Tables[0].Rows[0]["db_type"].ToString(); //connectstr = ds.Tables[0].Rows[0][1].ToString(); servername = ds.Tables[0].Rows[0]["server_name"].ToString(); databasename = ds.Tables[0].Rows[0]["db_name"].ToString(); username = ds.Tables[0].Rows[0]["user_name"].ToString(); password = ds.Tables[0].Rows[0]["password"].ToString(); parastr = ds.Tables[0].Rows[0]["parastr"].ToString(); sqlstr = ds.Tables[0].Rows[0]["selectstr"].ToString(); CommProgramName = ds.Tables[0].Rows[0]["通讯程序名"].ToString(); resolveType = ds.Tables[0].Rows[0]["解析类型"].ToString(); if (sqlstr.IndexOf("[SAMPLE_NO]") > 0) { sqlstr = sqlstr.Replace("[SAMPLE_NO]", strTestNO); } //writeLog.Write(sqlstr, "log"); //ds = dsHandle.GetDataSet("DATATYPE,DATABEGIN,DATAEND,INBEGIN,INEND,DETYPE,SUBBEGIN,SUBEND,CONACK,DATAACK", "TEST_RESULT_TRANS", "instrument_id = '" + strInstrumentID + "'"); ds = dsHandle.GetDataSet(@"Extractvalue(接收规则, '/root/buffer_in') As Buffer_In, Extractvalue(接收规则, '/root/buffer_out') As Buffer_out, Extractvalue(接收规则, '/root/data_type') As data_type, Extractvalue(接收规则, '/root/data_begin') As data_begin, Extractvalue(接收规则, '/root/data_end') As data_end, Extractvalue(接收规则, '/root/start_cmd') As start_cmd, Extractvalue(接收规则, '/root/end_cmd') As end_cmd, Extractvalue(接收规则, '/root/Ack_all') As Ack_all, Extractvalue(接收规则, '/root/ack_term') As ack_term, Extractvalue(接收规则, '/root/decode_mode') As decode_mode, Extractvalue(接收规则, '/root/begin_bits') As begin_bits, Extractvalue(接收规则, '/root/end_bits') As end_bits", "检验仪器", "id = '" + strInstrumentID + "'"); dataType = ds.Tables[0].Rows[0]["data_type"].ToString(); databegin = ds.Tables[0].Rows[0]["data_begin"].ToString(); dataend = ds.Tables[0].Rows[0]["data_end"].ToString(); //inBegin = ds.Tables[0].Rows[0][3].ToString(); //inEnd = ds.Tables[0].Rows[0][4].ToString(); //detype = ds.Tables[0].Rows[0][5].ToString(); //SubBegin = ds.Tables[0].Rows[0][6].ToString(); //SubEnd = ds.Tables[0].Rows[0][7].ToString(); //ConACK = ds.Tables[0].Rows[0][8].ToString(); //DataACK = ds.Tables[0].Rows[0][9].ToString(); if (databasetype == "1") { //conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + connectstr + ";Persist Security Info=False"; // conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + databasename + ";Persist Security Info=False"; if (string.IsNullOrEmpty(password)) { conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + parastr + databasename + ";Persist Security Info=True"; } else { conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + parastr + databasename + ";Persist Security Info=True; Jet OLEDB:Database Password=KJLis@KL#Com"; } } else if (databasetype == "2") { conStr = @"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + username + ";Password="******";Initial Catalog=" + databasename + ";Data Source=" + servername; //conStr = @"Provider=MSDASQL.1;Persist Security Info=False;User ID=" + username + ";Data Source=" + databasename; //if (string.IsNullOrEmpty(password)) // conStr = "Data Source=" + servername + ";Initial Catalog=" + databasename + ";Integrated Security=True"; //else // conStr = @"Persist Security Info=False;User ID=" + username + ";Password="******";Initial Catalog=" + databasename + ";Data Source=" + servername; } else if (databasetype == "3")//Excel { conStr = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + databasename + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; } else if (databasetype == "4")//mySQL { conStr = @"Data Source=" + databasename + ";Password="******";User ID=" + username + ";Location=" + servername + ""; } conDB.ConnectionString = conStr; resString.strDetype = detype; resString.strInstrument_id = strInstrumentID; resString.strSubBegin = SubBegin; resString.strSubEnd = SubEnd; resString.listInputResult = new List <string>(); resString.ImmediatelyUpdate = true; ds = dsHandle.GetDataSet("名称", "检验仪器", "id= '" + strInstrumentID + "'"); strDevice = ds.Tables[0].Rows[0]["名称"].ToString(); if (resolveType == "1") { IResolve = resString; Start(); } else { try { obj = ObjectReflection.CreateObject(CommProgramName.Substring(0, CommProgramName.IndexOf(".dll"))); IResolve = obj as IDataResolve; IResolve.GetRules(strInstrumentID); AutoExecute(null, null); } catch (Exception exc) { writeLog.Write(DateTime.Now.ToString() + "反射动态链接库执行时报错:" + exc.Message, "log"); } } }
private IDataResolve IResolve; //定义数据解析接口 /// <summary> /// 服务启动时调用 /// </summary> /// <param name="DeviceId">仪器ID</param> public void Start(string DeviceId) { status = "open"; recvStr = ""; ds = dsHandle.GetDataSet(@"解析类型,通讯程序名,备注,Extractvalue(通讯参数,'/root/port') As Port, Extractvalue(通讯参数, '/root/speed') As Speed, Extractvalue(通讯参数, '/root/data_bits') As Data_Bits,Extractvalue(通讯参数,'/root/stop_bits') As Stop_Bits, Extractvalue(通讯参数, '/root/check_mode') As Check_Mode,Extractvalue(接收规则, '/root/buffer_in') As Buffer_In, Extractvalue(接收规则, '/root/buffer_out') As Buffer_Out,名称", "检验仪器", "id='" + DeviceId + "'"); port = ds.Tables[0].Rows[0]["port"].ToString(); speed = ds.Tables[0].Rows[0]["speed"].ToString(); data_bits = ds.Tables[0].Rows[0]["data_bits"].ToString(); stop_bits = ds.Tables[0].Rows[0]["stop_bits"].ToString(); check_mode = ds.Tables[0].Rows[0]["check_mode"].ToString(); buffer_in = ds.Tables[0].Rows[0]["buffer_in"].ToString(); buffer_out = ds.Tables[0].Rows[0]["buffer_out"].ToString(); strDeviceName = ds.Tables[0].Rows[0]["名称"].ToString(); resolveType = ds.Tables[0].Rows[0]["解析类型"].ToString(); CommProgramName = ds.Tables[0].Rows[0]["通讯程序名"].ToString(); RemarkContent = ds.Tables[0].Rows[0]["备注"].ToString(); if (resolveType == "1") { IResolve = resString; } else { try { obj = ObjectReflection.CreateObject(CommProgramName.Substring(0, CommProgramName.IndexOf(".dll"))); IResolve = obj as IDataResolve; IResolve.GetRules(DeviceId); } catch (Exception exobj) { writelog.Write(strDeviceName, exobj.Message, "log"); return; } } if (port == "") { strError = "检验数据接收或检验串口通讯未设置!"; writelog.Write(strDeviceName, strError, "log"); return; } /// <summary> /// 打开COM口 /// </summary> try { SpCom.PortName = "COM" + port; //端口号 SpCom.BaudRate = Convert.ToInt32(speed); //波特率 if (check_mode == "N") { SpCom.Parity = Parity.None; //校验位 } if (check_mode == "O") { SpCom.Parity = Parity.Odd; } if (check_mode == "E") { SpCom.Parity = Parity.Even; } if (check_mode == "S") { SpCom.Parity = Parity.Space; } if (check_mode == "M") { SpCom.Parity = Parity.Mark; } SpCom.DataBits = Convert.ToInt32(data_bits); //数据位长度 if (stop_bits == "1") { SpCom.StopBits = StopBits.One; //停止位 } if (stop_bits == "2") { SpCom.StopBits = StopBits.Two; } SpCom.Handshake = Handshake.None; SpCom.DtrEnable = true; SpCom.RtsEnable = true; if (string.IsNullOrEmpty(buffer_in) || string.IsNullOrEmpty(buffer_out)) { SpCom.ReadBufferSize = 2048; SpCom.WriteBufferSize = 1024; } else { SpCom.ReadBufferSize = Convert.ToInt32(buffer_in); SpCom.WriteBufferSize = Convert.ToInt32(buffer_out); } } catch (Exception exsz) { writelog.Write(strDeviceName, "通讯参数设置错误:" + exsz.Message, "log"); } try { SpCom.Open(); writelog.Write(strDeviceName, "打开串口!", "log"); } catch (Exception ex) { strError = "没有找到串口,请先打开串口!" + ex.Message; writelog.Write(strDeviceName, strError, "log"); return; } ds = dsHandle.GetDataSet(@"Extractvalue(接收规则, '/root/data_type') As data_type, Extractvalue(接收规则, '/root/data_begin') As data_begin, Extractvalue(接收规则, '/root/data_end') As data_end, Extractvalue(接收规则, '/root/start_cmd') As start_cmd, Extractvalue(接收规则, '/root/end_cmd') As end_cmd, Extractvalue(接收规则, '/root/ack_all') As ack_all, Extractvalue(接收规则, '/root/ack_term') As ack_term, Extractvalue(接收规则, '/root/decode_mode') As decode_mode, Extractvalue(接收规则, '/root/begin_bits') As begin_bits, Extractvalue(接收规则, '/root/end_bits') As end_bits", "检验仪器", "id = '" + DeviceId + "'"); if (ds.Tables[0].Rows.Count == 0) { strError = "未设置检验数据接收设置!"; writelog.Write(strDeviceName, strError, "log"); } data_type = ds.Tables[0].Rows[0]["data_type"].ToString(); data_begin = ds.Tables[0].Rows[0]["data_begin"].ToString(); data_end = ds.Tables[0].Rows[0]["data_end"].ToString(); //inbegin = ds.Tables[0].Rows[0][5].ToString(); //inend = ds.Tables[0].Rows[0][6].ToString(); decode_mode = ds.Tables[0].Rows[0]["decode_mode"].ToString(); begin_bits = ds.Tables[0].Rows[0]["begin_bits"].ToString(); end_bits = ds.Tables[0].Rows[0]["end_bits"].ToString(); ACK_all = ds.Tables[0].Rows[0]["ack_all"].ToString(); ACK_term = ds.Tables[0].Rows[0]["ack_term"].ToString(); resString.strDetype = decode_mode; resString.strInstrument_id = DeviceId; resString.strSubBegin = begin_bits; resString.strSubEnd = end_bits; resString.strDataBegin = data_begin; resString.strDataEnd = data_end; resString.strACK_all = ACK_all; resString.strACK_term = ACK_term; resString.GetRules(DeviceId); resString.listInputResult = new List <string>(); //SpCom_DataReceived(null, null);//可以在ParseResult直接写死的字符串检查 ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ListenThread); thread = new Thread(ParStart); thread.Start(); SpCom.DataReceived += new SerialDataReceivedEventHandler(SpCom_DataReceived);//委托,把SerialDataReceivedEventHandler(SpCom_DataReceived)委托给DataReceived SpCom.ReceivedBytesThreshold = 1; }
public void Start() { ds = dsHandle.GetDataSet(@"解析类型,通讯程序名,备注,Extractvalue(通讯参数, '/root/file_path') As 文件路径, Extractvalue(通讯参数, '/root/file_type') As 文件类型, Extractvalue(通讯参数, '/root/read_mode') As 读取方式, Extractvalue(通讯参数, '/root/read_end') As 读取后操作, Extractvalue(通讯参数, '/root/file_name') As 文件名, Extractvalue(通讯参数, '/root/data_beginrows') As 数据开始行, Extractvalue(通讯参数, '/root/date_end') As 数据结束串", "检验仪器", "id = '" + strInstrumentID + "'"); VarDT = ds.Tables[0]; filePath = ds.Tables[0].Rows[0]["文件路径"].ToString(); fileName = ds.Tables[0].Rows[0]["文件名"].ToString(); fileType = ds.Tables[0].Rows[0]["文件类型"].ToString(); readType = ds.Tables[0].Rows[0]["读取方式"].ToString(); readEnd = ds.Tables[0].Rows[0]["读取后操作"].ToString(); dataRow = ds.Tables[0].Rows[0]["数据开始行"].ToString(); dataEnd = ds.Tables[0].Rows[0]["数据结束串"].ToString(); CommProgramName = ds.Tables[0].Rows[0]["通讯程序名"].ToString(); resolveType = ds.Tables[0].Rows[0]["解析类型"].ToString(); RemarkContent = ds.Tables[0].Rows[0]["备注"].ToString(); ds = dsHandle.GetDataSet(@"Extractvalue(接收规则, '/root/buffer_in') As Buffer_In, Extractvalue(接收规则, '/root/buffer_out') As Buffer_out, Extractvalue(接收规则, '/root/data_type') As data_type, Extractvalue(接收规则, '/root/data_begin') As data_begin, Extractvalue(接收规则, '/root/data_end') As data_end, Extractvalue(接收规则, '/root/start_cmd') As start_cmd, Extractvalue(接收规则, '/root/end_cmd') As end_cmd, Extractvalue(接收规则, '/root/Ack_all') As Ack_all, Extractvalue(接收规则, '/root/ack_term') As ack_term, Extractvalue(接收规则, '/root/decode_mode') As decode_mode, Extractvalue(接收规则, '/root/begin_bits') As begin_bits, Extractvalue(接收规则, '/root/end_bits') As end_bits", "检验仪器", "id = '" + strInstrumentID + "'"); inbuff = ds.Tables[0].Rows[0]["buffer_in"].ToString(); outbuff = ds.Tables[0].Rows[0]["buffer_out"].ToString(); datatype = ds.Tables[0].Rows[0]["data_type"].ToString(); databegin = ds.Tables[0].Rows[0]["data_begin"].ToString(); dataend = ds.Tables[0].Rows[0]["data_end"].ToString(); // inbegin = ds.Tables[0].Rows[0][""].ToString(); // inend = ds.Tables[0].Rows[0][6].ToString(); detype = ds.Tables[0].Rows[0]["decode_mode"].ToString(); SubBegin = ds.Tables[0].Rows[0]["begin_bits"].ToString(); SubEnd = ds.Tables[0].Rows[0]["end_bits"].ToString(); Ack_term = ds.Tables[0].Rows[0]["ack_term"].ToString(); Ack_all = ds.Tables[0].Rows[0]["Ack_all"].ToString(); resString.strDetype = detype; resString.strInstrument_id = strInstrumentID; resString.strSubBegin = SubBegin; resString.strSubEnd = SubEnd; resString.strDataBegin = databegin; resString.strDataEnd = dataend; resString.listInputResult = new List <string>(); resString.GetRules(strInstrumentID); //ds = dsHandle.GetDataSet("instrument_name", "test_instrument", "instrument_id = '" + strInstrumentID + "'"); ds = dsHandle.GetDataSet("名称", "检验仪器", "id= '" + strInstrumentID + "'"); if (resolveType == "1") { IResolve = resString; } else { obj = ObjectReflection.CreateObject(CommProgramName.Substring(0, CommProgramName.IndexOf(".dll"))); IResolve = obj as IDataResolve; IResolve.GetRules(strInstrumentID); } if (fileType == "1")//单文件 { // if (readType == "3")//自动读取 { IResolve.SetVariable(VarDT); AutoExecute(null, null); aTimer.Elapsed += new ElapsedEventHandler(AutoExecute); aTimer.Interval = 10000; aTimer.Enabled = true; } else { ReadFile(filePath, fileName, readType, fileType); } //resString.ParseResult(); } else if (fileType == "2")//多文件 { string[] strFiles = Directory.GetFiles(filePath, fileName); strFiles = FilterOutoffHiddenFiles(strFiles); foreach (string name in strFiles) { if (string.IsNullOrEmpty(name)) { continue; } //多文件读取一行保存一次 fileName = name.Replace(filePath + "\\", ""); resString.listInputResult = new List <string>(); ReadFile(filePath, fileName, readType, fileType); //resString.ImmediatelyUpdate = true; // resString.ParseResult(); //System.Threading.Thread.Sleep(2000); } int mm = 0; } }
//DATABASE /// <summary> /// 初始化执行 /// </summary> public void Init( ) { status = "open"; ds = dsHandle.GetDataSet(@"解析类型,通讯程序名,备注, Extractvalue(通讯参数, '/root/db_type') as db_type, Extractvalue(通讯参数, '/root/db_name') as db_name, Extractvalue(通讯参数, '/root/user_name') as user_name, Extractvalue(通讯参数, '/root/password') as password, Extractvalue(通讯参数, '/root/server_name') as server_name, Extractvalue(通讯参数, '/root/parastr') as parastr, Extractvalue(通讯参数, '/root/selectstr') as selectstr", "检验仪器", "id = '" + strInstrumentID + "'"); databasetype = ds.Tables[0].Rows[0]["db_type"].ToString(); servername = ds.Tables[0].Rows[0]["server_name"].ToString(); databasename = ds.Tables[0].Rows[0]["db_name"].ToString(); username = ds.Tables[0].Rows[0]["user_name"].ToString(); password = ds.Tables[0].Rows[0]["password"].ToString(); parastr = ds.Tables[0].Rows[0]["parastr"].ToString(); sqlstr = ds.Tables[0].Rows[0]["selectstr"].ToString(); CommProgramName = ds.Tables[0].Rows[0]["通讯程序名"].ToString(); resolveType = ds.Tables[0].Rows[0]["解析类型"].ToString(); if (sqlstr.IndexOf("[SAMPLE_NO]") > 0) { sqlstr = sqlstr.Replace("[SAMPLE_NO]", strTestNO); } ds = dsHandle.GetDataSet(@"Extractvalue(接收规则, '/root/buffer_in') As Buffer_In, Extractvalue(接收规则, '/root/buffer_out') As Buffer_out, Extractvalue(接收规则, '/root/data_type') As data_type, Extractvalue(接收规则, '/root/data_begin') As data_begin, Extractvalue(接收规则, '/root/data_end') As data_end, Extractvalue(接收规则, '/root/start_cmd') As start_cmd, Extractvalue(接收规则, '/root/end_cmd') As end_cmd, Extractvalue(接收规则, '/root/Ack_all') As Ack_all, Extractvalue(接收规则, '/root/ack_term') As ack_term, Extractvalue(接收规则, '/root/decode_mode') As decode_mode, Extractvalue(接收规则, '/root/begin_bits') As begin_bits, Extractvalue(接收规则, '/root/end_bits') As end_bits", "检验仪器", "id = '" + strInstrumentID + "'"); dataType = ds.Tables[0].Rows[0]["data_type"].ToString(); databegin = ds.Tables[0].Rows[0]["data_begin"].ToString(); dataend = ds.Tables[0].Rows[0]["data_end"].ToString(); if (databasetype == "1") { if (string.IsNullOrEmpty(password)) { conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + parastr + databasename + ";Persist Security Info=True"; } else { conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + parastr + databasename + ";Persist Security Info=True; Jet OLEDB:Database Password="******"2") { conStr = @"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + username + ";Password="******";Initial Catalog=" + databasename + ";Data Source=" + servername; } else if (databasetype == "3")//Excel { conStr = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + databasename + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; } else if (databasetype == "4")//mySQL { conStr = @"Data Source=" + databasename + ";Password="******";User ID=" + username + ";Location=" + servername + ""; } conDB.ConnectionString = conStr; resString.strDetype = detype; resString.strInstrument_id = strInstrumentID; resString.strSubBegin = SubBegin; resString.strSubEnd = SubEnd; resString.listInputResult = new List <string>(); resString.ImmediatelyUpdate = true; ds = dsHandle.GetDataSet("名称", "检验仪器", "id= '" + strInstrumentID + "'"); strDevice = ds.Tables[0].Rows[0]["名称"].ToString(); if (resolveType == "1") { IResolve = resString; Start(); } else { try { BH_Init_DB bhdb = new BH_Init_DB(); //反射动态链接库执行 Double I = Convert.ToDouble(bhdb.ReadRuntime()); obj = ObjectReflection.CreateObject(CommProgramName.Substring(0, CommProgramName.IndexOf(".dll"))); IResolve = obj as IDataResolve; IResolve.GetRules(strInstrumentID); AutoExecute(null, null); aTimer1.Elapsed += new ElapsedEventHandler(AutoExecute); aTimer1.Interval = I == 0 ? 10000 : I; aTimer1.AutoReset = true; aTimer1.Enabled = true; } catch (Exception) { throw; } } }
private HandleResult HandleDeviceMessage(byte[] handleData, int bytesRead, IntPtr connId) { lock (_lock) { try { bool IsUpdater = false; string strAdvance = string.Empty; byte[] strCmd = new byte[0]; byte[] 扩展参数 = new byte[0]; bool IsDisconnect = false; //是否强制断开客户端 bool IsMass = false; //是否群发 IntPtr connIDKey; ClientInfo clientInfo = _server.GetExtra(connId); //extra.Get(connId); if (clientInfo != null) { strAdvance = $@" > [{clientInfo.ConnId},OnReceive] -> {clientInfo.IpAddress}:{clientInfo.Port} ({ bytesRead } bytes)"; } else { strAdvance = $@" > [{connId},OnReceive] -> ({bytesRead} bytes)"; } if (Dic.ContainsKey(StrDeviceId)) { string EventID = Guid.NewGuid().ToString(); IResolve = Dic[StrDeviceId]; IResolve.ParseResult(handleData, ref strCmd, EventID, ref IsDisconnect, ref IsMass, ref strAdvance, connId.ToString(), ref SpreadObject, ref IsUpdater, ref 扩展参数); //是否是更新服务 if (IsUpdater) { byte[] data = new byte[0]; FileStream fs = null; //获得文件所在路径 string filePath = strAdvance.Split('|')[0].Trim(); string 文件Id = strAdvance.Split('|')[1].Trim(); long 文件读取开始位置 = long.Parse(strAdvance.Split('|')[2].Trim()); long 文件读取长度 = long.Parse(strAdvance.Split('|')[3].Trim()); byte[] 文件IdBytes = Encoding.Default.GetBytes(文件Id);//36字节 //打开文件 try { fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); fs.Position = 文件读取开始位置; //设置开始读取位置 byte[] bytes = new byte[文件读取长度]; fs.Read(bytes, 0, (int)文件读取长度); //读取指定位置的数据 byte[] tempData = new byte[0]; byte[] 文件总长bytes = new byte[8]; 文件总长bytes = BitConverter.GetBytes(文件读取长度); tempData = CopyByte(扩展参数, 文件IdBytes); //文件路径+文件id tempData = CopyByte(tempData, 文件总长bytes); //+文件总长度 tempData = CopyByte(tempData, bytes); //文件路径+文件id tempData = ByteHelper.PackByte(tempData, Command.UpdateDatasList); //封包 //向connId发送命令 if (_server.Send(connId, tempData, tempData.Length) == false) { WriteDeviceLog.WriteLog("Log\\" + _name + "\\ResponseError应答", strAdvance + " 应答没有发出去。", Guid.NewGuid().ToString()); } else { WriteDeviceLog.WriteLog("Log\\" + StrDeviceId + "\\解析日志", $@"{DateTime.Now}:发送包大小{tempData.Length},路径:{filePath}" + "\r\n", Guid.NewGuid().ToString()); //WriteDeviceLog.WriteLog("Log\\" + _name + "\\更新日志", // $"发送包大小{tempData.Length}", // Guid.NewGuid().ToString()); } fs.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } //尚未读取的文件内容长度 //long left = fs.Length; //long 文件总长 = left; //byte[] 文件总长bytes=new byte[8]; //文件总长bytes = BitConverter.GetBytes(文件总长); ////存储读取结果 //byte[] bytes = new byte[10 * 1024 * 1024];//10MB每秒 // //每次读取长度 //int maxLength = bytes.Length; ////读取位置 //long start = 0; ////实际返回结果长度 //int num = 0; //if (left == 0) //{ // 发包数量++; // //如果是空文件 // bytes = new byte[left]; // num = fs.Read(bytes, 0, Convert.ToInt32(left)); // byte[] tempData =new byte[0]; // tempData = CopyByte(扩展参数, 文件IdBytes);//文件路径+文件id // tempData = CopyByte(tempData, 文件总长bytes);//+文件总长度 // tempData = CopyByte(tempData, bytes);//文件路径+文件id // tempData = ByteHelper.PackByte(tempData, Command.UpdateDatasList);//封包 // //向connId发送命令 // if (_server.Send(connId, tempData, tempData.Length) == false) // { // WriteDeviceLog.WriteLog("Log\\" + _name + "\\ResponseError应答", // strAdvance + " 应答没有发出去。", // Guid.NewGuid().ToString()); // } // else // { // WriteDeviceLog.WriteText(AppDomain.CurrentDomain.BaseDirectory + "Log\\更新日志.txt", $@"{DateTime.Now}:发包数量:{发包数量},发送包大小{tempData.Length},路径:{filePath}" + "\r\n"); // //WriteDeviceLog.WriteLog("Log\\" + _name + "\\更新日志", // // $"发送包大小{tempData.Length}", // // Guid.NewGuid().ToString()); // } //} ////当文件未读取长度大于0时,不断进行读取 //while (left > 0) //{ // fs.Position = start; // num = 0; // if (left < maxLength) // { // bytes = new byte[left]; // num = fs.Read(bytes, 0, Convert.ToInt32(left)); // } // else // { // num = fs.Read(bytes, 0, maxLength); // } // Console.WriteLine($"文件原始长度{bytes.Length} 总长度{data.Length}"); // byte[] tempData = new byte[0]; // tempData = CopyByte(扩展参数, 文件IdBytes);//文件路径+文件id // tempData = CopyByte(tempData, 文件总长bytes);//+文件总长度 // tempData = CopyByte(tempData, bytes);//文件路径+文件id // tempData = ByteHelper.PackByte(tempData, Command.UpdateDatasList);//封包 // //向connId发送命令 // if (_server.Send(connId, tempData, tempData.Length) == false) // { // WriteDeviceLog.WriteLog("Log\\" + _name + "\\ResponseError应答", // strAdvance + " 应答没有发出去。", // Guid.NewGuid().ToString()); // } // else // { // 发包数量++; // WriteDeviceLog.WriteText(AppDomain.CurrentDomain.BaseDirectory + "Log\\更新日志.txt", $@"{DateTime.Now}:发包数量:{发包数量},发送包大小{tempData.Length},路径:{filePath}" + "\r\n"); // //WriteDeviceLog.WriteLog("Log\\" + _name + "\\更新日志", // // $"发送包大小{tempData.Length}", // // Guid.NewGuid().ToString()); // } // Console.WriteLine($"包头+长度+文件内容长度{tempData.Length}"); // if (num == 0) // break; // start += num; // left -= num; // //Thread.Sleep(888); //} //fs.Close(); } //是否强制断开连接True:强制断开客户端 False 不执行断开操作 if (IsDisconnect) { return(HandleResult.Error); } //是否群发命令 True:群发命令 False:不群发 if (IsMass) { //启用群发命令 if (strCmd.Length > 0) { if (DicConnId != null) { foreach (KeyValuePair <string, string> kvp in DicConnId) { connIDKey = (IntPtr)int.Parse(kvp.Key); if (kvp.Value.Contains(StrDeviceId)) { if (_server.Send((IntPtr)int.Parse(kvp.Key), strCmd, strCmd.Length) == false) //拿到kvp.Key客户端对象 { WriteDeviceLog.WriteLog("Log\\" + _name + "\\ResponseError应答", strAdvance + $" 应答没有发出去。发送对象:{_server.GetExtra((IntPtr)int.Parse(kvp.Key)).IpAddress}:{_server.GetExtra((IntPtr)int.Parse(kvp.Key)).Port} strCmd:" + Encoding.Default.GetString(strCmd), Guid.NewGuid().ToString()); } } } } } } else { if (strCmd.Length > 0) { if (_server.Send(connId, strCmd, strCmd.Length) == false) //拿到kvp.Key客户端对象 { WriteDeviceLog.WriteLog("Log\\" + _name + "\\ResponseError应答", strAdvance + $" 应答没有发出去。strCmd:" + Encoding.Default.GetString(strCmd), Guid.NewGuid().ToString()); } } } //是否一直保持连接,True:服务端一直连着客户端,False:服务端解析完成客户端的数据断开客户端。 if (IResolve.IsContinueConnecting() == false) { return(HandleResult.Error); } } return(HandleResult.Ok); } catch (Exception e) { WriteDeviceLog.WriteLog("Log\\" + _name + "\\HandleDeviceMessageError", e.ToString(), Guid.NewGuid().ToString()); return(HandleResult.Error); } } }
private HandleResult AcceptPool(IntPtr connId) { try { string strAdvance = string.Empty; byte[] strCmd = new byte[0]; bool IsDisconnect = false; //是否强制断开客户端 string ip = string.Empty; ushort sport = 0; if (_server.GetRemoteAddress(connId, ref ip, ref sport)) { strAdvance = string.Format(" > [{0},OnAccept] -> PASS({1}:{2})", connId, ip.ToString(), sport); WriteDeviceLog.WriteLog("Log\\" + _name + "\\Accept客户端", strAdvance, Guid.NewGuid().ToString()); } else { strAdvance = string.Format(" > [{0},OnAccept] -> Server_GetClientAddress() Error", connId); WriteDeviceLog.WriteLog("Log\\" + _name + "\\Accept客户端", strAdvance, Guid.NewGuid().ToString()); } ClientInfo clientInfo = new ClientInfo(); clientInfo.ConnId = connId; clientInfo.IpAddress = ip; clientInfo.Port = sport; if (_server.SetExtra(connId, clientInfo) == false) { //给客户端连接加载连接参数失败,处理出错。 } //连接断开时要干掉客户端对象。不然会增长过大。 if (DicConnId.ContainsKey(connId.ToString())) { DicConnId[connId.ToString()] = StrDeviceId; } else { DicConnId.TryAdd(connId.ToString(), StrDeviceId); //客户端连接池 } //if (SpreadObject.ContainsKey(connId)) //{ // SpreadObject[connId] = new SpreadModel(); //} //else //{ // SpreadObject.TryAdd(connId, new SpreadModel());//客户端扩展对象池 //} Thread.Sleep(1500); if (Dic.ContainsKey(StrDeviceId)) { IResolve = Dic[StrDeviceId]; IResolve.OnLinkStart(connId.ToString(), ref SpreadObject, strAdvance, ref strCmd, ref IsDisconnect); //是否强制断开连接True:强制断开客户端 False 不执行断开操作 if (IsDisconnect) { return(HandleResult.Error); } if (strCmd.Length > 0) { if (_server.Send(connId, strCmd, strCmd.Length) == false) { WriteDeviceLog.WriteLog("Log\\" + _name + "\\OnConnect", " 应答没有发出去。strCmd:" + Encoding.Default.GetString(strCmd), Guid.NewGuid().ToString()); } } } InitServiceInfo(true); return(HandleResult.Ok); } catch (Exception ex) { WriteDeviceLog.WriteLog("Log\\" + _name + "\\Accept客户端", ex.ToString(), Guid.NewGuid().ToString()); return(HandleResult.Error); } finally { //InitMonitorService.AutoResetEvent.Set(); } }
public bool Start(bool isStart, ref string errorMsg) { try { InitConfig(DbType);//初始化配置 Obj = ObjectReflection.CreateObject(_commProgramName.Substring(0, _commProgramName.IndexOf(".dll"))); IResolve = Obj as IDataResolve; if (!Dic.ContainsKey(StrDeviceId)) { Dic.TryAdd(StrDeviceId, IResolve); } else { Dic[StrDeviceId] = IResolve; } string param1 = string.Empty; IResolve.GetRules(StrDeviceId, DbType, ref param1); _server = new TcpPullServer <ClientInfo>(); // 设置服务器事件 _server.OnPrepareListen -= new TcpServerEvent.OnPrepareListenEventHandler(OnPrepareListen); _server.OnAccept -= new TcpServerEvent.OnAcceptEventHandler(OnAccept); _server.OnSend -= new TcpServerEvent.OnSendEventHandler(OnSend); _server.OnReceive -= new TcpPullServerEvent.OnReceiveEventHandler(OnReceive); _server.OnClose -= new TcpServerEvent.OnCloseEventHandler(OnClose); _server.OnShutdown -= new TcpServerEvent.OnShutdownEventHandler(OnShutdown); _server.OnPrepareListen += new TcpServerEvent.OnPrepareListenEventHandler(OnPrepareListen); _server.OnAccept += new TcpServerEvent.OnAcceptEventHandler(OnAccept); _server.OnSend += new TcpServerEvent.OnSendEventHandler(OnSend); _server.OnReceive += new TcpPullServerEvent.OnReceiveEventHandler(OnReceive); _server.OnClose += new TcpServerEvent.OnCloseEventHandler(OnClose); _server.OnShutdown += new TcpServerEvent.OnShutdownEventHandler(OnShutdown); _server.IpAddress = _hostIp; _server.Port = ushort.Parse(_port); if (isStart) { // 启动服务 if (_server.Start()) { InitServiceInfo(true); //Log4Helper.WriteInfoLog(this.GetType(), // $@"设备id:{StrDeviceId} 设备名称:{_name} $Server Start OK -> ({_hostIp}:{_port})"); if (!DicTcpServer.ContainsKey(StrDeviceId)) { DicTcpServer.TryAdd(StrDeviceId, _server); } else { DicTcpServer[StrDeviceId] = _server; } return(true); } else { InitServiceInfo(false); string msg = $@"加载【{_name}】失败!×原因:{ string.Format("$Server Start Error -> {0}({1}) Port:{2}", _server.ErrorMessage, _server.ErrorCode, _port) }"; //EmailHelper.SendQQEmail(InitDeviceScheduler.发件人邮箱, // InitDeviceScheduler.收件人邮箱列表.Split(','), // InitDeviceScheduler.ServiceName, InitDeviceScheduler.ServiceName + $@"加载【{_name}】失败!", // $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}:" + InitDeviceScheduler.ServiceName + // msg, // InitDeviceScheduler.发件人邮箱授权码); errorMsg = msg; return(false); } } else { InitServiceInfo(false); return(false); } } catch (Exception e) { //Log4Helper.WriteErrorLog(this.GetType(), $@"设备id:{StrDeviceId} 设备名称:{_name} " + e.ToString()); errorMsg = e.ToString(); return(false); } finally { //InitMonitorService.AutoResetEvent.Set(); } }