/// <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(); }