284 lines
14 KiB
C#
284 lines
14 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// Radio parameter settings for a specific order.
|
|
/// </summary>
|
|
public static class OrderRadioParameter
|
|
{
|
|
|
|
public static RadioConfigurationParams GetRadioParams(String pcbId, String connectionString, String pressure = "")
|
|
{
|
|
var ret = new RadioConfigurationParams
|
|
{
|
|
PcbId = pcbId
|
|
};
|
|
var defEncryptionKey = new List<Byte>();
|
|
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<Byte>();
|
|
|
|
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<String, String>();
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|