This commit is contained in:
Roland Drabesch 2022-08-23 17:17:00 +02:00
commit c5dbb895d2
4 changed files with 84 additions and 158 deletions

View File

@ -14,5 +14,5 @@ using System.Reflection;
//[assembly: AssemblyVersion("1.2.*.0")]
[assembly: AssemblyVersion("2.3.1.*")]
[assembly: AssemblyFileVersion("2.3.1.0")]
[assembly: AssemblyVersion("2.3.2.*")]
[assembly: AssemblyFileVersion("2.3.2.0")]

View File

@ -933,6 +933,80 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
return responseRecord;
}
private String GetPassword()
{
var url = ServiceUrls.GenesisGetPasswordServiceUrl();
String password;
//without PCB ID it is not possible to login
var firstPcbId = GetPcbId();
if (string.IsNullOrEmpty(firstPcbId) || firstPcbId.Length < 8)
{
if (firstPcbId != null && firstPcbId.Length < 8)
{
Thread.Sleep(250);
}
if (string.IsNullOrEmpty(GetPcbId()))
{
return "";
}
}
url += PcbId;
try
{
//use
var http = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
throw new InvalidOperationException();
}
using (var sr = new StreamReader(responseStream))
{
var responseJson = sr.ReadToEnd();
password = responseJson.Trim('"');
}
_logger.Info($"Slot:{Slot} - Got password from GenesisPasswordServiceUrl, URL({url})");
}
catch (Exception ex)
{
_logger.Info($"Slot:{Slot} - Cannot get password from GenesisPasswordService, " +
$"URL({url}), Error({ex.Message})");
var listOfOfflinePasswords = JsonConvert.DeserializeObject<List<OfflinePasswordItem>>(File.ReadAllText(ProgramConfig.OfflineInfoFile));
password = listOfOfflinePasswords.First(x => x.PcbId == PcbId).Password;
if (!string.IsNullOrEmpty(password))
{
_logger.Info($"Slot:{Slot} - Got password from password file!");
}
}
return password;
}
/// <inheritdoc />
/// <remarks date="2018JAN08" author="drabesch">
/// Get password from server
/// </remarks>
public Boolean Login()
{
var password = GetPassword();
return !string.IsNullOrEmpty(password) && Login(password);
}
/// <remarks date="2018JAN08" author="drabesch">
/// Get password from server
/// </remarks>
public Boolean QuickLogin()
{
var password = GetPassword();
return !string.IsNullOrEmpty(password) && Login(password, true, true);
}
/// <summary>
/// Login with identical password as last time
@ -950,124 +1024,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
return string.IsNullOrEmpty(_password) ? Login() : Login(_password);
}
/// <inheritdoc />
/// <remarks date="2018JAN08" author="drabesch">
/// Get password from server
/// </remarks>
public Boolean Login()
{
var url = ServiceUrls.GenesisGetPasswordServiceUrl();
String autoPassword;
//without PCB ID it is not possible to login
var firstPcbId = GetPcbId();
if (string.IsNullOrEmpty(firstPcbId) || firstPcbId.Count() < 8)
{
if (firstPcbId != null && firstPcbId.Count() < 8)
{
Thread.Sleep(250);
}
if (string.IsNullOrEmpty(GetPcbId()))
{
return false;
}
}
url += PcbId;
try
{
//use
var http = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
throw new InvalidOperationException();
}
using (var sr = new StreamReader(responseStream))
{
var responseJson = sr.ReadToEnd();
autoPassword = responseJson.Trim('"');
}
_logger.Info($"Slot:{Slot} - Got password from GenesisPasswordServiceUrl, URL({url})");
}
catch (Exception ex)
{
_logger.Info($"Slot:{Slot} - Cannot get password from GenesisPasswordService, " +
$"URL({url}), Error({ex.Message})");
var listOfOfflinePasswords = JsonConvert.DeserializeObject<List<OfflinePasswordItem>>(File.ReadAllText(ProgramConfig.OfflineInfoFile));
autoPassword = listOfOfflinePasswords.First(x => x.PcbId == PcbId).Password;
if (!string.IsNullOrEmpty(autoPassword))
{
_logger.Info($"Slot:{Slot} - Got password from password file!");
}
}
return Login(autoPassword);
}
/// <remarks date="2018JAN08" author="drabesch">
/// Get password from server
/// </remarks>
public Boolean QuickLogin()
{
var url = ServiceUrls.GenesisGetPasswordServiceUrl();
String autoPassword;
//without PCB ID it is not possible to login
var firstPcbId = GetPcbId();
if (string.IsNullOrEmpty(firstPcbId) || firstPcbId.Length < 8)
{
if (firstPcbId != null && firstPcbId.Length < 8)
{
Thread.Sleep(250);
}
if (string.IsNullOrEmpty(GetPcbId()))
{
return false;
}
}
url += PcbId;
try
{
//use
var http = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
throw new InvalidOperationException();
}
using (var sr = new StreamReader(responseStream))
{
var responseJson = sr.ReadToEnd();
autoPassword = responseJson.Trim('"');
}
_logger.Info($"Slot:{Slot} - Got password from GenesisPasswordServiceUrl, URL({url})");
}
catch (Exception ex)
{
_logger.Info($"Slot:{Slot} - Cannot get password from GenesisPasswordService, " +
$"URL({url}), Error({ex.Message})");
var listOfOfflinePasswords = JsonConvert.DeserializeObject<List<OfflinePasswordItem>>(File.ReadAllText(ProgramConfig.OfflineInfoFile));
autoPassword = listOfOfflinePasswords.First(x => x.PcbId == PcbId).Password;
if (!string.IsNullOrEmpty(autoPassword))
{
_logger.Info($"Slot:{Slot} - Got password from password file!");
}
}
return Login(autoPassword, true, true);
}
private class OfflinePasswordItem
{
public OfflinePasswordItem(String pcbId, String password)
@ -1079,27 +1035,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
public String PcbId
{
get; private set;
get;
}
public String Password
{
get; private set;
get;
}
}
/// <inheritdoc />
/// <summary>
/// Starting a timer to keep session active,
/// starting the <see cref="KeepSessionThreadLoop"/>.
/// </summary>
/// <param name="password">password string to login</param>
/// <returns></returns>
public Boolean Login(String password)
{
return Login(password, true);
}
/// <summary>
/// Starting a timer to keep session active,
/// starting the <see cref="KeepSessionThreadLoop"/>.
@ -1115,7 +1060,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// <remarks date="2021-Feb-02" author="Thomas Wiedebusch">
/// - Avoid retries during login, a retry will lock the Genesis for 2s, 4s, 8s, 16s and so on.
/// </remarks>
private Boolean Login(String password, Boolean runImmediately, Boolean quickLogin = false)
public Boolean Login(String password, Boolean runImmediately = true, Boolean quickLogin = false)
{
var backupRetries = CommunicationConfig.RequestRetries;
@ -1140,9 +1085,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
_logger.Info($"Slot:{Slot} - Successful logged in to meter");
StartKeepSession();
if (quickLogin)
{
WriteRegister(Register.Mertrologyasst.PulseMode, 0, true, true);
@ -1150,7 +1092,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
WriteRegister("SENSUSRADIO_SystemState", 1, true, true);
}
if (Configuration != null && !Configuration.ProductionMode)
{
IsDevelopmentUsage = true;
@ -1373,23 +1314,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
_logger.Info($"Meter size: {MeterSize}");
//remove unused registers with invalid version
var tempConfigRegisters = _configRegister.MeterRegisterDic.ToList();
//tempConfigRegisters.ToList()
//var sb = new List<string>();
//var listoFREGISTERADRESSES = new List <Tuple<byte[], string>>();
//foreach (var item in tempConfigRegisters)
//{
// listoFREGISTERADRESSES.Add(new Tuple<byte[], string>(item.Key.RegisterAddress, item.Key.GetIdent()));
//}
//var dicAdressName = new Dictionary<byte[], string>();
//listoFREGISTERADRESSES.ForEach(a => sb.Add($"dicAdressName.Add(new byte[] {{ 0x{a.Item1[0]},0x{a.Item1[1]} }}, \"{a.Item2} \");{Environment.NewLine}" ));
//var stOutput ="";
//var flHash = new HashSet<string>(sb);
//flHash.ToList().ForEach(a => stOutput = stOutput + a);
_configRegister.MeterRegisterDic.Clear();
foreach (var registerToCheck in tempConfigRegisters)
@ -1747,7 +1671,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
{
var response = listPcb.ToArray();
PcbId = Encoding.ASCII.GetString(response).Split('\0')[0];
if (PcbId.Length < 8 && retriesLeft >= 1)
{
return GetPcbId(expectedLength, retriesLeft - 1);

View File

@ -120,7 +120,9 @@ namespace Xylem.Common.Hardware.WaterMeter.WaterMeterCore
/// Start Login with out password service and a fixed password
/// </summary>
/// <param name="password">password for login</param>
Boolean Login(String password);
/// <param name="runImmediately">execute immediately</param>
/// <param name="quickLogin">speed up login</param>
Boolean Login(String password, Boolean runImmediately = true, Boolean quickLogin = false);
/// <summary>
/// set up measurement parameter and set meter into test-mode

View File

@ -1935,7 +1935,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
Task.Factory.StartNew(() =>
{
if (!_currentGenesis.IsLoggedOn) _currentGenesis.ReLogin();
_currentGenesis.ReLogin();
_meterFwUpdate.UploadConfigFile();
Thread.Sleep(1000);
}).ContinueWith(delegate