public static TrainDataEntity GetDataModelFromInputString(string snNumber, string inputStr, out ushort serverComputedCrc) { inputStr = inputStr.StringCuttedBy("%"); var paramPositions = Array.ConvertAll(ConfigurationManager.AppSettings["parameterPositions"].Split(','), int.Parse); var dataModel = new TrainDataEntity(); // retrieve date, because it's in integer dataModel.MeasurementDateTime = GetDateTime(inputStr.Substring(paramPositions[4] * 2, 12)); var byteArray = inputStr.SplitInParts(2).Select(s => byte.Parse(s, NumberStyles.HexNumber)).ToArray(); var index = 1; dataModel.PackageNumber = ushort.Parse(snNumber); dataModel.SystemSerialNumber = BitConverter.ToUInt16(byteArray, paramPositions[index++]); dataModel.ProviderName = Encoding.Default.GetString(byteArray.SubArray(paramPositions[index++], 15)).StringCuttedBy("\0"); dataModel.IsSystemWorking = BitConverter.ToBoolean(byteArray, paramPositions[index++]); // skipping date index += 6; dataModel.EnvironmentTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.Radiator1Temperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.Radiator2Temperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.FootstepTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.TurbineTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.OilTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.TransformatorTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.CabinTemperature = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.VoltageAkb = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.Heater1FuelConsumption = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.Heater2FuelConsumption = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.AirHeaterFuelConsumption = BitConverter.ToSingle(byteArray, paramPositions[index++]); dataModel.Heater1Flags = BitConverter.ToUInt16(byteArray, paramPositions[index++]); dataModel.Heater2Flags = BitConverter.ToUInt16(byteArray, paramPositions[index++]); dataModel.AirHeaterFlags = BitConverter.ToUInt16(byteArray, paramPositions[index++]); dataModel.SystemFlags = byteArray[paramPositions[index++]]; dataModel.CrcData = BitConverter.ToUInt16(byteArray, paramPositions[index]); serverComputedCrc = Crc16Calculator.ComputeCrc16Bit(byteArray, byteArray.Length - 2); return(dataModel); }
// PUT: api/Trains public HttpResponseMessage Put() { // Достать из зарпоса контент var content = Request.Content; // Разделить контент на 2 части var contentStrings = content.ReadAsStringAsync().Result.Split('='); // Создать модель данных TrainDataEntity model = new TrainDataEntity(); var newId = -1; ushort serverCrc; // Попробовать разобрать контент и преобразовать в объект try { model = ParameterParser.GetDataModelFromInputString( contentStrings[0].Substring(4), contentStrings[1], out serverCrc); // Если CRC совпадает - сохранить данные в базу if (serverCrc == model.CrcData) { newId = _repository.Save(model); } } catch (Exception exception) { serverCrc = 0; } // Отправить ответ источнику запроса var response = Request.CreateResponse(HttpStatusCode.OK, new ResponseModel { Message = $"Is successful received: {newId != -1}; computed CRC: {serverCrc}; actual CRC: {model.CrcData}; new Id is: {newId}" }); return(response); }