using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages; using Xylem.Common.Logic.ProductionOrderCore.KitronTestResults; using Xylem.Common.Logic.ServiceCore; using Xylem.Common.Logic.SoftwareAccessHelper; namespace Xylem.Common.Logic.ProductionOrderCore.OrderData { /// /// Radio parameter settings for a specific order. /// public static class OrderRadioParameter { public static RadioConfigurationParams GetRadioParams(String pcbId, String connectionString, String pressure = "") { var ret = new RadioConfigurationParams { PcbId = pcbId }; var defEncryptionKey = new List(); defEncryptionKey.AddRange(new Byte[] { 0x0E, 0x9F, 0xAC, 0xC6 }.ToArray()); defEncryptionKey.AddRange(new Byte[] { 0xA0, 0xE1, 0xEF, 0x1C }.ToArray()); defEncryptionKey.AddRange(new Byte[] { 0x3B, 0x27, 0xA4, 0x9B }.ToArray()); defEncryptionKey.AddRange(new Byte[] { 0xAC, 0x21, 0x65, 0x35 }.ToArray()); using (var dataAccess = new SqlDataAccess(connectionString)) { var sb = new StringBuilder(); sb.AppendLine(" declare @PcbId nvarchar(50) "); sb.AppendLine(" declare @DN nvarchar(50) "); sb.AppendLine(" declare @Length nvarchar(50) "); sb.AppendLine($" set @PcbId= '{pcbId}' "); sb.AppendLine(" SELECT distinct "); sb.AppendLine(" @DN = ident.Nennweite, "); sb.AppendLine(" @Length = ident.Baulaenge "); sb.AppendLine(" from MapPcbIdToSerialNumber map "); sb.AppendLine(" inner join AuftragPositionSerienNr apinfo on apinfo.SerienNr = map.MapPcbIdToSerialNumber_SerialNumber "); sb.AppendLine(" inner join AuftragPosition_Gesamt ap on apinfo.AuftragNr = ap.AuftragNr and apinfo.PositionNr = ap.PositionNr "); sb.AppendLine(" inner join [Identnr] ident on ap.Identnr = ident.IdentNr "); sb.AppendLine(" where map.MapPcbIdToSerialNumber_PcbId = @PcbId "); sb.AppendLine($"sELECT [DS_ID] ,[ID_PCB] ,[ID_TEST] ,[JSON], @DN as [DN] ,@Length as [Length] FROM OPENQUERY (MyOraDB, ' SELECT DS_ID,ID_PCB,ID_TEST,JSON FROM DELTACHEF.GENESIS_PCBRADIOTEST_PD WHERE ID_PCB = ''{pcbId}'' order by ID_TEST desc'); "); //sb.AppendLine(" SELECT " + // " FROM [MyOraDB]..[DELTACHEF].[GENESIS_PCBRADIOTEST_PD] "); //sb.AppendLine(" where [ID_PCB] = @PcbId "); //sb.AppendLine(" order by ID_TEST desc "); //; var dt = dataAccess.ExecuteQuery(sb.ToString()); var lengthString = ""; var dnString = ""; foreach (var item in dt.Select()) { var jsonString = item["JSON"].ToString(); lengthString = item["Length"].ToString(); dnString = item["Dn"].ToString(); var radioTestResult = RadioTest.FromJson(jsonString); if (radioTestResult.TestResult != Result.Fail) { try { var offsetParams = radioTestResult.TestStepResults.Values.Where(s => s.Result.HasValue && s.Result.Value == Result.Pass && s.TestStepType == "PCB Send Set Frq Offset").OrderByDescending(o => o.Id); var offsets = offsetParams.ToArray(); if (offsets.Any()) { ret.FrqOffset = Int16.Parse(offsets.First().TestValue); } } catch (Exception) { ret.FrqOffset = null; } var a = radioTestResult.TestStepLoopCalibrate.Values.Where(w => w != null && w.LengthCode != null && w.ResultCalibration.ToLower() == "ok" && w.LengthCode.StartsWith($"DN{dnString}") && w.LengthCode.Contains($"-{lengthString}{pressure}") && !w.LengthCode.Contains($"-{lengthString}{pressure}o")).ToList(); var ao = radioTestResult.TestStepLoopCalibrate.Values.Where(w => w != null && w.LengthCode != null && w.ResultCalibration.ToLower() == "ok" && w.LengthCode.StartsWith($"DN{dnString}") && w.LengthCode.Contains($"-{lengthString}{pressure}o")).ToList(); if (a.Any() && ao.Any()) { if (uint.Parse(a.First().IPowerLevelCalculated) != 0) { ret.PowerLevel = uint.Parse(a.First().IPowerLevelCalculated); ret.PowerLevelOption = uint.Parse(ao.First().IPowerLevelCalculated); var x = new System.ComponentModel.UInt32Converter().ConvertFromString(a.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeNew = (UInt32)x; x = new System.ComponentModel.UInt32Converter().ConvertFromString(ao.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeOption = (UInt32)x; } } if (a.Any() && !ao.Any()) { ret.PowerLevel = uint.Parse(a.First().IPowerLevelCalculated); ret.PowerLevelOption = ret.PowerLevel; var x = new System.ComponentModel.UInt32Converter().ConvertFromString(a.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeNew = (UInt32)x; ret.ImpedanceCodeOption = ret.ImpedanceCodeNew; } } //return new RadioConfigurationParams();// Encoding.ASCII.GetString(bytes); //2992 2936 } // kein powerlevel gefunden und die baulänge hat die selben einstellwerte wie 200 // gilt fuer alte register wo es nur 200 und 311 gab, die parameter für 200 sind gültig 200 - 300 if (ret.PowerLevel == 0 && dnString == "50" && lengthString != "200" && lengthString != "311") { foreach (var item in dt.Select()) { var jsonString = item["JSON"].ToString(); lengthString = "200"; var radioTestResult = RadioTest.FromJson(jsonString); if (radioTestResult.TestResult != Result.Fail) { if (radioTestResult.TestStepResults != null && radioTestResult.TestStepResults.Values.Any()) { var offsetParams = radioTestResult.TestStepResults.Values.Where(s => s.Result.HasValue && s.Result.Value == Result.Pass && s.TestStepType == "PCB Send Set Frq Offset").OrderByDescending(o => o.Id); var offsets = offsetParams.ToArray(); if (offsets.Any()) { ret.FrqOffset = Int16.Parse(offsets.First().TestValue); } } else { ret.FrqOffset = null; } var a = radioTestResult.TestStepLoopCalibrate.Values.Where(w => w != null && w.ResultCalibration.ToLower() == "ok" && w.LengthCode.StartsWith($"DN{dnString}") && w.LengthCode.Contains($"-{lengthString}{pressure}") && !w.LengthCode.Contains($"-{lengthString}{pressure}o")).ToList(); var ao = radioTestResult.TestStepLoopCalibrate.Values.Where(w => w != null && w.ResultCalibration.ToLower() == "ok" && w.LengthCode.StartsWith($"DN{dnString}") && w.LengthCode.Contains($"-{lengthString}{pressure}o")).ToList(); if (a.Any() && ao.Any()) { ret.PowerLevel = uint.Parse(a.First().IPowerLevelCalculated); ret.PowerLevelOption = uint.Parse(ao.First().IPowerLevelCalculated); var x = new System.ComponentModel.UInt32Converter().ConvertFromString(a.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeNew = (UInt32)x; x = new System.ComponentModel.UInt32Converter().ConvertFromString(ao.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeOption = (UInt32)x; } if (a.Any() && !ao.Any()) { ret.PowerLevel = uint.Parse(a.First().IPowerLevelCalculated); ret.PowerLevelOption = ret.PowerLevel; var x = new System.ComponentModel.UInt32Converter().ConvertFromString(a.First().IAntennaMatching); if (x != null) ret.ImpedanceCodeNew = (UInt32)x; ret.ImpedanceCodeOption = ret.ImpedanceCodeNew; } } } } } using (var dataAccess = new SqlDataAccess(connectionString)) { var sb = new StringBuilder(); sb.AppendLine($" SELECT distinct [MapPcbIdToSerialNumber_SerialNumber],Adresse,FunkschluesselIndex,SENSUSRADIO_PowerLevel," + $" SENSUSRADIO_PowerLevelOption, SENSUSRADIO_ImpedanceCodeNew,SENSUSRADIO_ImpedanceCodeOption "); sb.AppendLine($" FROM [Auftrag].[dbo].[MapPcbIdToSerialNumber] pcb "); sb.AppendLine($" left outer join tmpRadioConfig radio on radio.pcbID = pcb.MapPcbIdToSerialNumber_PcbId"); sb.AppendLine($" inner join Genesis_Meter meter on meter.Seriennummer = pcb.MapPcbIdToSerialNumber_SerialNumber"); sb.AppendLine($" where [MapPcbIdToSerialNumber_PcbId] = '{pcbId}' and MapPcbIdToSerialNumber_Deleted = 0 "); var mapData = dataAccess.ExecuteQuery(sb.ToString()); if (mapData.Rows.Count != 1) { return ret; } if (!(mapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"] is DBNull) || !string.IsNullOrEmpty(mapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"].ToString())) { ret.SerialNumber = Convert.ToUInt32(mapData.Rows[0]["MapPcbIdToSerialNumber_SerialNumber"]); } else { return ret; } if (!(mapData.Rows[0]["Adresse"] is DBNull) && mapData.Rows[0]["Adresse"].ToString() != "0") { ret.RadioAddress = Convert.ToUInt32((Int64)mapData.Rows[0]["Adresse"] - 10000000000); } if (!(mapData.Rows[0]["FunkschluesselIndex"] is DBNull) && mapData.Rows[0]["FunkschluesselIndex"].ToString() != "0") { ret.EncryptionKey = null; //20805053|3147665|10402000894 var indexParams = mapData.Rows[0]["FunkschluesselIndex"].ToString().Split('|'); var rawKey = GetRadioRandomKey("d5b8c0b2-81f6-4421-80d0-44eb2093e616", indexParams[1], indexParams[2]); var encryptionKey = new List(); for (var i = 0; i < rawKey.Length / 2; i++) { encryptionKey.Add(byte.Parse(rawKey.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber)); } ret.EncryptionKey = encryptionKey.ToArray(); } else { ret.EncryptionKey = defEncryptionKey.ToArray(); } return ret; } } private static String GetRadioRandomKey(String token, String orderNumber, String radioAdress) { ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; //var Url = $"{ServiceUrls.KeyServerCustom()}devices var url = $"https://nodes.sms-esaap.com/keygenproxy/api/v2/keys/devices?orderNumber={orderNumber}&radioaddress={radioAdress}"; var header = new Dictionary(); header.Add("Cache-Control", "no-cache"); header.Add("X-Node-Token", token); try { var responseJson = LocalWebRequest.GetRequest(url, 10000, header); responseJson = responseJson.Trim('"'); return responseJson;//orderNumber}&radioaddress={radioAdress } catch (Exception ex) { throw new ApplicationException("Fatal exception while getting keys from server", ex); } } } }