private bool ParseDumpFile(string fileName, ref MeterInfo mi, ref Params prms, bool deleteAfterParse = false) { mi = new MeterInfo(); prms = new Params(); string strValues = ""; if (!File.Exists(fileName)) return false; try { FileStream dumpFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); bool tmpRes = false; if (GetMeterInfo(dumpFileStream, ref mi)) if (FillParamsStructure(dumpFileStream, out prms, out strValues)) tmpRes = true; dumpFileStream.Close(); if (tmpRes && deleteAfterParse) DeleteDumpFileAndLogs(fileName); return tmpRes; } catch (Exception ex) { return false; } }
private bool GetMeterInfo(FileStream fs, ref MeterInfo mInfo) { int meterInfoFirstByte = 0x0123; mInfo = new MeterInfo(); fs.Seek(meterInfoFirstByte, SeekOrigin.Begin); try { int fsPosition = (int)fs.Position; byte[] buffer = new byte[fs.Length]; int bytesRead = fs.Read(buffer, fsPosition, 3); byte[] tmpSerialBuffer1 = new byte[1]; byte[] tmpSerialBuffer2 = new byte[2]; Array.Copy(buffer, fsPosition + 2, tmpSerialBuffer1, 0, 1); Array.Copy(buffer, fsPosition, tmpSerialBuffer2, 0, 2); Int16 serial2 = BitConverter.ToInt16(tmpSerialBuffer2, 0); mInfo.serialNumber = BitConverter.ToString(tmpSerialBuffer1) + "-" + serial2.ToString(); return true; } catch (Exception ex) { return false; } }
public bool ReadCurrentValues(ushort param, ushort tarif, ref float recordValue) { recordValue = -1; //находится ли в каталоге утилита rdslib.exe if (!DoLibraryExists()) return false; //попытаемся найти BAT файл string curBatchDirectory = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_BATCH; string curBatchFilename = curBatchDirectory + "\\" + m_address + ".bat"; if (!Directory.Exists(curBatchDirectory) || !File.Exists(curBatchFilename)) return false; string curDumpDir = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_DUMPS; if (!Directory.Exists(curDumpDir)) Directory.CreateDirectory(curDumpDir); //все готово к генерации дампа FileInfo batchFileInfo = new FileInfo(curBatchFilename); List<FileInfo> batchFIList = new List<FileInfo>(); batchFIList.Add(batchFileInfo); List<BatchConnection> batchConnList = new List<BatchConnection>(); if (!CreateBatchConnectionList(batchFIList, ref batchConnList)) return false; if (!ExecuteBatchConnection(batchConnList[0])) return false; MeterInfo tmpMi = new MeterInfo(); Params tmpPrms = new Params(); if (!ParseDumpFile(batchConnList[0].FileNameDump, ref tmpMi, ref tmpPrms, true)) return false; if (!GetParamValueFromParams(tmpPrms, param, tarif, out recordValue)) return false; DeleteDumpFileAndLogs(batchConnList[0].FileNameDump); return true; }
public bool ReadDailyValues(DateTime dt, ushort param, ushort tarif, ref float recordValue) { recordValue = -1; bool DELETE_DUMPS_AFTER_PARSING = false; MeterInfo tmpMi = new MeterInfo(); Params tmpPrms = new Params(); //находится ли в каталоге утилита rdslib.exe if (!DoLibraryExists()) return false; //проверим есть ли дамп и старше ли он чем readDailyTimeoutInDays string curDumpDir = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_DUMPS; if (!Directory.Exists(curDumpDir)) Directory.CreateDirectory(curDumpDir); string LogTerminationCode = ""; if (IsReadingBlocked(blockingTimeMinutes, curDumpDir, m_address.ToString(), ref LogTerminationCode)) return false; string latestDumpFileName = ""; DateTime latestDumpDate = new DateTime(); FileInfo latestDumpFileInfo = null; if (LatestByDateFileInfo(curDumpDir, m_address.ToString(), ref latestDumpFileInfo, "*.dat")) { latestDumpFileName = latestDumpFileInfo.FullName; latestDumpDate = latestDumpFileInfo.LastWriteTime.Date; if (File.Exists(latestDumpFileName)) { DateTime dateCur = DateTime.Now.Date; TimeSpan ts = dateCur - latestDumpDate; //если мы дошли до сюда, то искомого параметра нет в таблице "суточные" (см. mainservice) //чтобы не дергать счетчик, введено ограничение - мы реально запрашиваем дамп со //только раз в readDailyTimeoutInDays суток, поэтому: // //если прошло меньше чем readDailyTimeoutInDays дней if (ts.TotalDays < readDailyTimeoutInDays) { //прочитаем недостающий параметр из уже существующего дампа //чтобы не дергать счетчик if (ParseDumpFile(latestDumpFileName, ref tmpMi, ref tmpPrms, DELETE_DUMPS_AFTER_PARSING)) if (GetParamValueFromParams(tmpPrms, param, tarif, out recordValue)) return true; } } } //если мы дошли до сюда, то, либо подошло время обновить дамп, либо проблемы с разбором существующего //если прошло менее N дней, но искомого параметра еще нет DeleteDumpFileAndLogs(latestDumpFileName); //ниже нельзя просто вызвать чтение суточных, т.к. суточные удаляют дамп сразу //после разбора, поэтому дублируем //попытаемся найти BAT файл string curBatchDirectory = directoryBase + DIR_NAME_LIB + "\\" + DIR_NAME_BATCH; string curBatchFilename = curBatchDirectory + "\\" + m_address + ".bat"; if (!Directory.Exists(curBatchDirectory) || !File.Exists(curBatchFilename)) return false; //ВСЕ ГОТОВО К РЕАЛЬНОМУ ЧТЕНИЮ И ГЕНЕРАЦИИ ДАМПА FileInfo batchFileInfo = new FileInfo(curBatchFilename); List<FileInfo> batchFIList = new List<FileInfo>(); batchFIList.Add(batchFileInfo); List<BatchConnection> batchConnList = new List<BatchConnection>(); if (!CreateBatchConnectionList(batchFIList, ref batchConnList)) return false; if (!ExecuteBatchConnection(batchConnList[0])) return false; if (!ParseDumpFile(batchConnList[0].FileNameDump, ref tmpMi, ref tmpPrms, DELETE_DUMPS_AFTER_PARSING)) return false; if (!GetParamValueFromParams(tmpPrms, param, tarif, out recordValue)) return false; return true; }
public bool IsDatFileAvailable(string fileName) { FileStream testFs; if (File.Exists(fileName)) { try { testFs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); MeterInfo testMi = new MeterInfo(); bool res = GetMeterInfo(testFs, ref testMi); testFs.Close(); return res; } catch (Exception ex) { return false; } } else { return false; } }