/// <summary>
        ///
        /// </summary>
        /// <param name="mMeterInfo1"></param>
        /// <returns>     0: 消息需要被过滤掉        1:消息不过滤掉</returns>
        public static int MsgFilter(MeterInfo1 mMeterInfo1)
        {
            int ret = 1;

            m_dataLocker.WaitOne();

            for (int i = 0; i < m_listMsg.Count; i++)
            {
                if ((mMeterInfo1.GateId == m_listMsg[i].GateId) && (mMeterInfo1.MeterAddr == m_listMsg[i].MeterAddr))
                {
                    string strTemp  = mMeterInfo1.MsgTime;
                    string strTemp1 = m_listMsg[i].MsgTime;
                    int    cmp      = string.Compare(strTemp, strTemp1);
                    if ((mMeterInfo1.RecvData == m_listMsg[i].RecvData) || (cmp == 0) || (cmp == -1)) // 消息体本身和缓存相同,或者消息的id比实际的缓存中的id小,则不插入数据库
                    {
                        ret = 0;                                                                      // 接收到的消息和缓存中的完全一样
                    }
                    else
                    {
                        Log.RecvLog(mMeterInfo1.GateId, "recv MsgFilter", "ret = 1 " + strTemp + strTemp1);
                        ret = 1;            // 接收到的数据和缓存中的数据不一样,需要上传
                    }
                    break;
                }
            }

            m_dataLocker.ReleaseMutex();

            return(ret);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="mMeterInfo1"></param>
        /// <returns>     0: 消息需要被过滤掉        1:消息不过滤掉</returns>
        public static int MsgUpdate(MeterInfo1 mMeterInfo1)
        {
            int ret = 1;

            m_dataLocker.WaitOne();

            int cmpMeterId = 0;             // 标志表计消息是否已经在列表中了

            for (int i = 0; i < m_listMsg.Count; i++)
            {
                if ((mMeterInfo1.GateId == m_listMsg[i].GateId) && (mMeterInfo1.MeterAddr == m_listMsg[i].MeterAddr))
                {
                    cmpMeterId = 1;

                    m_listMsg[i] = mMeterInfo1;       // 更新数据
                    break;
                }
            }

            if (cmpMeterId == 0)            // 列表中没有该表计的最近一条消息缓存,则增加一条消息进入列表中,按网关、表计id从小到大排序
            {
                int cmpGate, cmpMeter;

                int i = 0;
                for (i = 0; i < m_listMsg.Count; i++)
                {
                    cmpGate = string.Compare(mMeterInfo1.GateId, m_listMsg[i].GateId);

                    if (cmpGate == -1)
                    {
                        break;
                    }
                    else if (cmpGate == 0)
                    {
                        cmpMeter = string.Compare(mMeterInfo1.MeterAddr, m_listMsg[i].MeterAddr);

                        if (cmpMeter == -1)
                        {
                            break;
                        }
                    }
                }
                m_listMsg.Insert(i, mMeterInfo1);
            }

            m_dataLocker.ReleaseMutex();

            return(ret);
        }
        // 2018-09-11 解析接收到的数据报文
        public static int ParseRealDataProtocal(ref ClientInfo clientInfo, byte[] buffer, int nDataLen)
        {
            if (nDataLen <= 18)
            {
                return(0);
            }
            bool bVerified = clientInfo.Verified;

            if (bVerified)
            {
            }
            else
            {
                clientInfo.Sim        = GetSimCard(buffer, 3);
                clientInfo.Verified   = true;
                clientInfo.NeedVerify = false;
                ClientInfoCommon.AddClientInfo(clientInfo);
            }

            //Log.RecvLog(clientInfo.Sim, "recv", buffer, nDataLen);                                  // 写接收日志

            // 三相多功能表
            MeterInfo1 mMeterInfo1 = new MeterInfo1();

            mMeterInfo1.InsertTime = DateTime.Now.ToString();
            mMeterInfo1.MsgTime    = GetMsgTime(ref buffer, 9, 7);
            mMeterInfo1.GateId     = GetSimCard(buffer, 3);
            mMeterInfo1.MeterAddr  = GetMeterId(buffer);
            mMeterInfo1.RecvData   = MyHelper.ByteArray2HexStr(buffer, nDataLen);

            // ClientInfoCommon.AddMsg(mMeterInfo1);
            Log.RecvLog(clientInfo.Sim, "recv MsgTime:" + mMeterInfo1.MsgTime + " meterId:" + mMeterInfo1.MeterAddr, MyHelper.ByteArray2HexStr(buffer, nDataLen));
            ReplyClient(ref clientInfo, buffer, nDataLen);
            ClientInfoCommon.MsgUpdate(mMeterInfo1);        // 更新数据到内存缓存

            return(0);
        }       // End of ParseRealDataProtocal()
 /// <summary>
 /// 插入消息到消息队列中
 /// </summary>
 /// <param name="mMeterInfo1"></param>
 public static void AddMsg(MeterInfo1 mMeterInfo1)
 {
     m_dataLocker.WaitOne();
     m_listMsg.Add(mMeterInfo1);
     m_dataLocker.ReleaseMutex();
 }