diff --git a/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj b/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
index 00d9d18a..997b6d67 100644
--- a/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
+++ b/Common/Hardware/Common.Hardware.SIRT/Common.Hardware.SIRT.csproj
@@ -64,6 +64,7 @@
+
diff --git a/Common/Hardware/Common.Hardware.SIRT/SensusRF/SirtCom.cs b/Common/Hardware/Common.Hardware.SIRT/SensusRF/SirtCom.cs
new file mode 100644
index 00000000..1261afd6
--- /dev/null
+++ b/Common/Hardware/Common.Hardware.SIRT/SensusRF/SirtCom.cs
@@ -0,0 +1,89 @@
+namespace Common.Hardware.SIRT.SensusRF
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO.Ports;
+
+ internal class SirtCom
+ {
+ private readonly SerialPort serialPort;
+
+ public SirtCom(string portName)
+ => this.serialPort = new SerialPort
+ {
+ BaudRate = 115200,
+ DataBits = 8,
+ Parity = Parity.None,
+ PortName = portName,
+ StopBits = StopBits.One
+ };
+
+ public bool Close()
+ {
+ try
+ {
+ this.serialPort.Close();
+
+ return this.serialPort.IsOpen;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ public bool Open()
+ {
+ this.Close();
+
+ try
+ {
+ this.serialPort.Open();
+
+ return this.serialPort.IsOpen;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ public IEnumerable ReadBytes()
+ {
+ var buffer = default(byte[]);
+ var length = default(int);
+
+ while (true)
+ {
+ buffer = new byte[this.serialPort.ReadBufferSize];
+
+ try
+ {
+ length = this.serialPort.Read(buffer, 0, buffer.Length);
+
+ Array.Resize(ref buffer, length);
+ }
+ catch
+ {
+ buffer = Array.Empty();
+ }
+
+ yield return buffer;
+ }
+ }
+
+ public bool WriteBytes(params byte[] bytes)
+ {
+ try
+ {
+ this.serialPort.Write(bytes, 0, bytes.Length);
+
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ }
+}
diff --git a/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs b/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs
index 972c155e..709c9a71 100644
--- a/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs
+++ b/Common/Hardware/Common.Hardware.SIRT/Tasks/WritePamTask.cs
@@ -96,7 +96,7 @@
{
this.AnyTelegramReceived = true;
- if (response.Command == SIRTConstants.ACKN_ANSW) // command sent
+ if (response.Command == SIRTConstants.ACKN_ANSW)
{
this.DecriptResponse(response);
this.AKNReceived?.Invoke(response);
@@ -105,47 +105,45 @@
{
var payload = response.Payload;
+ if (this.UseEncryption(response))
+ {
+ this.DecriptResponse(response);
+ }
+
if (payload != null && payload.Length > 0)
{
var type = payload[0];
- if (type == SIRTConstants.BUP) // bubble up message
+ if (type == SIRTConstants.BUP)
{
- this.DecriptResponse(response, payload);
this.BUPReceived?.Invoke(response);
}
- else if (type == SIRTConstants.LAT) // command received
+ else if (type == SIRTConstants.LAT)
{
this.latReceived = true;
- this.DecriptResponse(response, payload);
this.LATReceived?.Invoke(response);
}
- else if (type == SIRTConstants.DEBUG) // received only on specific commands requires lat
+ else if (type == SIRTConstants.DEBUG)
{
this.debugReceived = true;
- this.DecriptResponse(response, payload);
this.DEBUGReceived?.Invoke(response);
}
- else if (type == SIRTConstants.SEMI) // always the last answer of the command requires lat, debug only in some cases
+ else if (type == SIRTConstants.SEMI)
{
- this.DecriptResponse(response, payload);
this.SEMIReceived?.Invoke(response);
}
else
{
- this.DecriptResponse(response, payload);
this.UnknownReceived?.Invoke(response);
}
}
else
{
- this.DecriptResponse(response, payload);
this.UnknownReceived?.Invoke(response);
}
}
else
{
- this.DecriptResponse(response);
this.UnknownReceived?.Invoke(response);
}
@@ -221,6 +219,12 @@
}
+ protected virtual bool UseEncryption(SIRTMessage response)
+ => response != null
+ && response.Payload != null
+ && response.Payload.Length > 2
+ && response.Payload.GetCrc() != 0;
+
private byte[] EncryptRequest()
{
var requestPayload = this.request.Payload;
@@ -240,19 +244,11 @@
return payload;
}
- private void DecriptResponse(SIRTMessage response, params byte[] payload)
+ private void DecriptResponse(SIRTMessage response)
{
- if (payload == null || payload.Length == 0)
- {
- return;
- }
+ this.IsEncrypted = true;
- this.IsEncrypted = payload.GetCrc(payload.Length - 2) != default(ushort);
-
- if (payload.GetCrc(payload.Length - 2) != default(ushort))
- {
- response.Payload = payload.DecryptResponse(this.EncryptionKey);
- }
+ response.Payload = response.Payload.DecryptResponse(this.EncryptionKey);
}
private void SetP811(Action p811Setter)
diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs
index b1c5e163..3f253645 100644
--- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs
+++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Eregister.cs
@@ -81,11 +81,6 @@
this.executionType = nameof(LoadInspectionFinalizationTasks);
var features = this.parameters.LoadInspectionFinalizationFeatures();
- //if (this.parameters.Completed)
- //{
- // return new EregisterTask[] { };
- //}
-
if (features.RequestAddress > 0 && features.ResponseAddress > 0)
{
this.LoadProgrammingParameters(features);
@@ -101,24 +96,22 @@
RequestAddress = features.RequestAddress,
ResponseAddress = features.ResponseAddress,
EncryptionKey = features.EncryptionKey,
- IsEncrypted = this.parameters.IsEncrypted,
});
- //this.runningTasks.Enqueue(new EregisterTask(this.parameters.Frequency)
- //{
- // Name = "0, 2, 16",
- // SlotNr = features.SlotNr,
- // PoNr = features.PoNr,
- // SerialNr = features.SerialNr,
- // RequestAddress = features.RequestAddress,
- // ResponseAddress = features.ResponseAddress,
- // EncryptionKey = features.EncryptionKey,
- // IsEncrypted = this.parameters.IsEncrypted,
- // Data = new ChangeWakeUp((WakeUpMode)this.parameters.Wake_Up_Interval)
- // .Append(new ChangeNumberOfLatWindows(this.parameters.LAT_Interval))
- // .Append(new ChangeTransmissionInterval(this.parameters.Transmission_Intervall))
- // .Append(new ProvidePin(AuthLevel.II)),
- //});
+ this.runningTasks.Enqueue(new EregisterTask(this.parameters.Frequency)
+ {
+ Name = "0, 2, 16",
+ SlotNr = features.SlotNr,
+ PoNr = features.PoNr,
+ SerialNr = features.SerialNr,
+ RequestAddress = features.RequestAddress,
+ ResponseAddress = features.ResponseAddress,
+ EncryptionKey = features.EncryptionKey,
+ Data = new ChangeWakeUp((WakeUpMode)this.parameters.Wake_Up_Interval)
+ .Append(new ChangeNumberOfLatWindows(this.parameters.LAT_Interval))
+ .Append(new ChangeTransmissionInterval(this.parameters.Transmission_Intervall))
+ .Append(new ProvidePin(AuthLevel.II)),
+ });
}
}
@@ -267,21 +260,23 @@
var frequency = this.parameters.Frequency;
- //this.runningTasks.Enqueue(new EregisterTask(frequency)
- //{
- // Name = "WUP",
- // SlotNr = features.SlotNr,
- // PoNr = features.PoNr,
- // SerialNr = features.SerialNr,
- // RequestAddress = features.RequestAddress,
- // ResponseAddress = features.ResponseAddress,
- // EncryptionKey = features.EncryptionKey,
- // IsEncrypted = this.parameters.IsEncrypted,
- // Data = new ChangeWakeUp(WakeUpMode.StayAwake)
- // .Append(new ChangeNumberOfLatWindows(this.parameters.LatWindowsInitialization))
- // .Append(new ChangeTransmissionInterval(this.parameters.TransmissionIntervalInitialization))
- // .Append(new ProvidePin(AuthLevel.II)),
- //});
+ if (this.executionType == nameof(this.LoadInspectionInitializationTasks))
+ {
+ this.runningTasks.Enqueue(new EregisterTask(frequency)
+ {
+ Name = "WUP",
+ SlotNr = features.SlotNr,
+ PoNr = features.PoNr,
+ SerialNr = features.SerialNr,
+ RequestAddress = features.RequestAddress,
+ ResponseAddress = features.ResponseAddress,
+ EncryptionKey = features.EncryptionKey,
+ Data = new ChangeWakeUp(WakeUpMode.StayAwake)
+ .Append(new ChangeNumberOfLatWindows(this.parameters.LatWindowsInitialization))
+ .Append(new ChangeTransmissionInterval(this.parameters.TransmissionIntervalInitialization))
+ .Append(new ProvidePin(AuthLevel.II)),
+ });
+ }
this.runningTasks.Enqueue(new EregisterCheckInitializationTask(this.parameters, frequency)
{
@@ -291,7 +286,6 @@
RequestAddress = features.RequestAddress,
ResponseAddress = features.ResponseAddress,
EncryptionKey = features.EncryptionKey,
- IsEncrypted = this.parameters.IsEncrypted,
});
foreach (var pam in features.BuildPams())
@@ -304,7 +298,6 @@
RequestAddress = features.RequestAddress,
ResponseAddress = features.ResponseAddress,
EncryptionKey = features.EncryptionKey,
- IsEncrypted = this.parameters.IsEncrypted,
Data = pam.Value,
Name = pam.Key
});
diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs
index fbf8b538..b1702bfe 100644
--- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs
+++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterBatch.cs
@@ -58,11 +58,6 @@
eregister.StartProgrammingAsync(cancellationToken);
}
});
-
- //foreach (var eregister in this.eregisters)
- //{
- // eregister.StartProgrammingAsync(cancellationToken);
- //}
}
public void StopProgramming()
diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs
index 05d4eddd..7b2eb766 100644
--- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs
+++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/EregisterTask.cs
@@ -123,7 +123,6 @@
this.P11 = new P11(message.P1);
this.RSSI = new RSSI(message.P2, (ushort)this.Frequency);
this.BUPMessage = new BUP(message.Payload, this.P11);
- this.IsEncrypted = this.BUPMessage.Crc != 0;
this.AnyTelegramReceived = true;
this.Label = nameof(BUP);
this.SetRunning();
@@ -135,7 +134,6 @@
this.P11 = new P11(message.P1);
this.RSSI = new RSSI(message.P2, (ushort)this.Frequency);
this.LATMessage = new LAT(message.Payload, this.P11);
- this.IsEncrypted = this.LATMessage.Crc != 0;
this.AnyTelegramReceived = true;
this.Label = nameof(LAT);
this.SetRunning();
@@ -148,7 +146,6 @@
this.RSSI = new RSSI(message.P2, (ushort)this.Frequency);
this.DEBUGMessage = new DEBUG(message.Payload, this.P11);
this.FactoryState = this.DEBUGMessage.FactoryState;
- this.IsEncrypted = this.DEBUGMessage.Crc != 0;
this.AnyTelegramReceived = true;
this.Label = nameof(DEBUG);
@@ -167,7 +164,6 @@
this.P11 = new P11(message.P1);
this.RSSI = new RSSI(message.P2, (ushort)this.Frequency);
this.SEMIMessage = new SEMI(message.Payload, this.Frequency, this.P11);
- this.IsEncrypted = this.SEMIMessage.Crc != 0;
this.AnyTelegramReceived = true;
if (this.RequireLAT && !this.latReceived)
@@ -206,5 +202,14 @@
this.Label = "UNKN";
this.SetPending();
}
+
+ protected override Boolean UseEncryption(SIRTMessage response)
+ {
+ var payloadLength = response.Payload.Length;
+
+ return (payloadLength == 13 && base.UseEncryption(response))
+ || payloadLength == 54
+ || payloadLength == 93;
+ }
}
}
\ No newline at end of file
diff --git a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Models/EregisterProgrammingParameters.cs b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Models/EregisterProgrammingParameters.cs
index 3015df60..56fa974e 100644
--- a/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Models/EregisterProgrammingParameters.cs
+++ b/Common/Hardware/WaterMeter/eRegister/Common.Hardware.WaterMeter.eRegister/Models/EregisterProgrammingParameters.cs
@@ -382,9 +382,9 @@
Frequency = this.Frequency,
EncryptionKey = this.EncryptionKey.GetEncryptionKey(),
/////////////////////////////////////////////////////
- // ChangeWakeUp = WakeUpMode.StayAwake,
- // ChangeTransmissionInterval = this.TransmissionIntervalInitialization,
- // ChangeNumberOfLatWindows = this.LatWindowsInitialization,
+ ChangeWakeUp = WakeUpMode.StayAwake,
+ ChangeTransmissionInterval = this.TransmissionIntervalInitialization,
+ ChangeNumberOfLatWindows = this.LatWindowsInitialization,
ChangeMeterReading = 111_111_111,
WirelessMBusMode = this.MBusStatus,
SetMetrologyParameters = new SetMetrologyParameters
diff --git a/Common/Ui/Common.UI/ViewModels/EregisterFinalizeVM.cs b/Common/Ui/Common.UI/ViewModels/EregisterFinalizeVM.cs
index 18f98cab..aa416b3d 100644
--- a/Common/Ui/Common.UI/ViewModels/EregisterFinalizeVM.cs
+++ b/Common/Ui/Common.UI/ViewModels/EregisterFinalizeVM.cs
@@ -22,7 +22,7 @@
}
this.sharedId = AuftragDbContext.P2000Shared.FindSharedId(psnr, "EregisterFinalize");
- var parametersList = AuftragDbContext.LoadEregisterProgrammingParametersListForSharedId(this.sharedId, true);
+ var parametersList = AuftragDbContext.LoadEregisterProgrammingParametersListForSharedId(this.sharedId);
this.LoadEncryptionKeys(parametersList);