- added signature creation when sending MeteringReceiptReq during DC charging

- added a fix that prevents a NullPointerException in case MeterInfo element is not present when checked on SECC while processing MeteringReceiptReq
This commit is contained in:
Marc Mültin 2016-11-29 18:46:42 +08:00
parent 7cd7bde429
commit fd20302604
3 changed files with 34 additions and 8 deletions

View File

@ -11,9 +11,11 @@
package org.eclipse.risev2g.evcc.states;
import org.eclipse.risev2g.evcc.session.V2GCommunicationSessionEVCC;
import org.eclipse.risev2g.shared.enumerations.GlobalValues;
import org.eclipse.risev2g.shared.enumerations.V2GMessages;
import org.eclipse.risev2g.shared.messageHandling.ReactionToIncomingMessage;
import org.eclipse.risev2g.shared.messageHandling.TerminateSession;
import org.eclipse.risev2g.shared.utils.SecurityUtils;
import org.eclipse.risev2g.shared.v2gMessages.msgDef.ChargeProgressType;
import org.eclipse.risev2g.shared.v2gMessages.msgDef.CurrentDemandResType;
import org.eclipse.risev2g.shared.v2gMessages.msgDef.DCEVSEStatusType;
@ -47,6 +49,18 @@ public class WaitForCurrentDemandRes extends ClientState {
meteringReceiptReq.setMeterInfo(currentDemandRes.getMeterInfo());
meteringReceiptReq.setSAScheduleTupleID(currentDemandRes.getSAScheduleTupleID());
meteringReceiptReq.setSessionID(getCommSessionContext().getSessionID());
// Set xml reference element
getXMLSignatureRefElements().put(meteringReceiptReq.getId(), SecurityUtils.generateDigest(meteringReceiptReq, false));
// Set signing private key
setSignaturePrivateKey(SecurityUtils.getPrivateKey(
SecurityUtils.getKeyStore(
GlobalValues.EVCC_KEYSTORE_FILEPATH.toString(),
GlobalValues.PASSPHRASE_FOR_CERTIFICATES_AND_KEYS.toString()),
GlobalValues.ALIAS_CONTRACT_CERTIFICATE.toString())
);
return getSendMessage(meteringReceiptReq, V2GMessages.METERING_RECEIPT_RES);
}

View File

@ -56,6 +56,7 @@ public class WaitForCurrentDemandReq extends ServerState {
currentDemandRes.setEVSEPresentCurrent(evseController.getPresentCurrent());
currentDemandRes.setEVSEPresentVoltage(evseController.getPresentVoltage());
currentDemandRes.setMeterInfo(evseController.getMeterInfo());
getCommSessionContext().setSentMeterInfo(evseController.getMeterInfo());
currentDemandRes.setSAScheduleTupleID(getCommSessionContext().getChosenSAScheduleTuple());
// TODO how to determine if a receipt is required or not?

View File

@ -77,6 +77,8 @@ public class WaitForMeteringReceiptReq extends ServerState {
.getAllowedRequests().add(V2GMessages.POWER_DELIVERY_REQ);
((ForkState) getCommSessionContext().getStates().get(V2GMessages.FORK))
.getAllowedRequests().add(V2GMessages.CHARGING_STATUS_REQ);
((ForkState) getCommSessionContext().getStates().get(V2GMessages.FORK))
.getAllowedRequests().add(V2GMessages.CURRENT_DEMAND_REQ);
return getSendMessage(meteringReceiptRes, V2GMessages.FORK);
} else {
@ -115,13 +117,22 @@ public class WaitForMeteringReceiptReq extends ServerState {
}
private boolean meterInfoEquals(MeterInfoType sentMeterInfo, MeterInfoType receivedMeterInfo) {
// Only meterID is mandatory field, thus check for null values as well
if (!sentMeterInfo.getMeterID().equals(receivedMeterInfo.getMeterID()) ||
(sentMeterInfo.getMeterReading() != null && !sentMeterInfo.getMeterReading().equals(receivedMeterInfo.getMeterReading())) ||
(sentMeterInfo.getMeterStatus() != null && !sentMeterInfo.getMeterStatus().equals(receivedMeterInfo.getMeterStatus())) ||
(sentMeterInfo.getSigMeterReading() != null && !Arrays.equals(sentMeterInfo.getSigMeterReading(), receivedMeterInfo.getSigMeterReading())) ||
(sentMeterInfo.getTMeter() != null && !sentMeterInfo.getTMeter().equals(receivedMeterInfo.getTMeter()))) return false;
else return true;
private boolean meterInfoEquals(MeterInfoType meterInfoSentBySECC, MeterInfoType meterInfoReceivedFromEVCC) {
if (meterInfoSentBySECC == null) {
getLogger().error("MeterInfo sent by SECC is not saved in session context, value is null");
return false;
} else if (meterInfoReceivedFromEVCC == null) {
getLogger().error("MeterInfo received from EVCC is null");
return false;
} else {
// Only meterID is mandatory field, thus check for null values as well
if (!meterInfoSentBySECC.getMeterID().equals(meterInfoReceivedFromEVCC.getMeterID()) ||
(meterInfoSentBySECC.getMeterReading() != null && !meterInfoSentBySECC.getMeterReading().equals(meterInfoReceivedFromEVCC.getMeterReading())) ||
(meterInfoSentBySECC.getMeterStatus() != null && !meterInfoSentBySECC.getMeterStatus().equals(meterInfoReceivedFromEVCC.getMeterStatus())) ||
(meterInfoSentBySECC.getSigMeterReading() != null && !Arrays.equals(meterInfoSentBySECC.getSigMeterReading(), meterInfoReceivedFromEVCC.getSigMeterReading())) ||
(meterInfoSentBySECC.getTMeter() != null && !meterInfoSentBySECC.getTMeter().equals(meterInfoReceivedFromEVCC.getTMeter()))
) return false;
else return true;
}
}
}