Exemple #1
0
        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];
        }
Exemple #2
0
    /// <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);
        }
    }
Exemple #3
0
    //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();
    }