public SendPackage(CmdType type, CmdClass cls, int address,byte[] text) { this.type = type; this.cls = cls; this.text = text; this.address = address; // this.BornDateTime=System.DateTime.Now; if (type == CmdType.CmdQuery) returnCmd = text[0]; if ((text[0] & 0x0f) == 0x0f) returnSubCmd = text[1]; }
/// <summary> /// 组件类初始化 /// </summary> private bool serviceInit() { try { //绑定定时器回调函数 cmdTimer.Elapsed += new System.Timers.ElapsedEventHandler(cmdOverTime); cmdTimer.AutoReset = false;//单次 cmdTimer.Interval = overTime; UtilClass.utilInit(); CmdClass.cmdInit(); MySQLDB.m_strConn = strSqlCfg; addDeviceToHashTable();//初始化哈希表,提前加好设备号 //发送数据包处理线程 if (!ThreadPool.QueueUserWorkItem(CheckSendDataQueue)) { return(false); } //接收数据包处理线程 //if (!ThreadPool.QueueUserWorkItem(CheckRecDataQueue)) //return false; //读取数据库命令线程 if (!ThreadPool.QueueUserWorkItem(CheckDataBaseQueue)) { return(false); } IsServerOpen = true; return(true); } catch (Exception e) { UtilClass.writeLog(e.ToString()); return(false); } }
//20180626收到数据后,直接处理 //处理接收队列 //private void CheckRecDataQueue(object state) //{ // checkRecDataQueueResetEvent.Reset(); //Reset()将事件状态设置为非终止状态,导致线程阻止。 // while (IsServerOpen) // { // try // { // foreach (DataItem dataItem in htClient.Values) // { // dataItem.HandleData(); // } // } // catch (Exception ex) // { // Console.WriteLine(ex); // UtilClass.writeLog(ex.ToString()); // } // Thread.Sleep(checkRecDataQueueTimeInterval); //当前数据处理线程休眠一段时间 // } // checkRecDataQueueResetEvent.Set(); //} //读取数据库命令线程 private void CheckDataBaseQueue(object state) { //add 3-17 粗心掉了一句 checkDataBaseQueueResetEvent.Reset(); //Reset()将事件状态设置为非终止状态,导致线程阻止。 while (IsServerOpen) { try { /*1.先读取tcommand表中所有deviceID的cmdName字段 * 2.“-1”表示无命令,其余值表示命令名称“name” * 3.根据name来读取对应ID的operation和data * 4.构造命令 * 5.把命令加入发送队列 * 6.如果是升级文件的路径,则需要读取文件内容并存入dataitem,设置标志位 * 7.如果是设置卡号,需要在dataitem设置大数组,加标志位并分多包发送。 * */ /* * ret[i, 0] = ds1.Tables[0].Rows[i]["deviceID"].ToString(); * ret[i, 1] = ds1.Tables[0].Rows[i]["cmdName"].ToString(); * ret[i, 2] = ds1.Tables[0].Rows[i]["operation"].ToString(); * ret[i, 3] = ds1.Tables[0].Rows[i]["data"].ToString(); */ string[,] cmdStrings = DbClass.readCmd(); if (cmdStrings != null && cmdQueue.Count == 0)//先判定是否为空,并且上次的命令执行完 { tCmdStatus.cmdName = cmdStrings[0, 1]; tCmdStatus.strID = null; //数据添加到全局的queue队列,由发送任务来分发给设备类。如果上一次的命令没有执行完,不接受新命令 if (tCmdStatus.cmdName == "search") { addSearchCmd(); } for (int i = 0; i < cmdStrings.Length / cmdStrings.GetLength(1); i++) { if (htClient.ContainsKey(cmdStrings[i, 0])) { DataItem dataItem = (DataItem)htClient[cmdStrings[i, 0]]; //有一些指令需要多包发送和读取 if (cmdStrings[i, 1] == "update") { using (FileStream fsSource = new FileStream(cmdStrings[i, 3], FileMode.Open, FileAccess.Read)) { // Read the source file into a byte array. for (int j = 0; j < updateDataLength; j++) //先用0xFF填充 { dataItem.updateData[j] = 0xFF; } int numBytesToRead = (int)fsSource.Length; if (numBytesToRead > 0) { // Read may return anything from 0 to numBytesToRead. fsSource.Read(dataItem.updateData, 0, numBytesToRead); } } //设置升级属性 dataItem.tUpdate.IsNeedUpdate = true; } else//普通指令可以直接构造并发送 { byte[] cmd = CmdClass.makeCommand(cmdStrings[i, 1], cmdStrings[i, 2], cmdStrings[i, 3], dataItem.byteID); if (cmd != null) { cmdQueue.Enqueue(cmd); } } } //end of if (htClient.ContainsKey(cmdStrings[i, 0])) } //end of for } } catch (Exception ex) { Console.WriteLine(ex); UtilClass.writeLog(ex.ToString()); } Thread.Sleep(checkDataBaseQueueTimeInterval); } checkDataBaseQueueResetEvent.Set(); }