private bool DecodeAndParseCommandMessage(RSMP_Messages.Header packetHeader, string sJSon, bool bUseStrictProtocolAnalysis, bool bUseCaseSensitiveIds, ref bool bHasSentAckOrNack, ref string sError) { StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; bool bSuccess = false; // Values to return List <RSMP_Messages.CommandResponse_Value> rvs = new List <RSMP_Messages.CommandResponse_Value>(); //Dictionary<cRoadSideObject, cRoadSideObject> UpdatedRoadSideObjects = new Dictionary<cRoadSideObject, cRoadSideObject>(); try { RSMP_Messages.CommandRequest CommandRequest = JSonSerializer.Deserialize <RSMP_Messages.CommandRequest>(sJSon); // Response message RSMP_Messages.CommandResponse CommandResponse = new RSMP_Messages.CommandResponse(); bool bSomeValueWasBad = false; // Scan through each value to set foreach (RSMP_Messages.CommandRequest_Value CommandRequest_Value in CommandRequest.arg) { // Create return value for each value to be set RSMP_Messages.CommandResponse_Value rv = new RSMP_Messages.CommandResponse_Value(); rv.v = null; rv.n = CommandRequest_Value.n; rv.age = "undefined"; bool bFoundCommand = false; cRoadSideObject RoadSideObject = cHelper.FindRoadSideObject(CommandRequest.ntsOId, CommandRequest.cId, bUseStrictProtocolAnalysis); if (RoadSideObject != null) { // Find command in object foreach (cCommandObject CommandObject in RoadSideObject.CommandObjects) { bool bDone = false; // Find command name in command foreach (cCommandReturnValue CommandReturnValue in CommandObject.CommandReturnValues) { if (CommandReturnValue.sName.Equals(CommandRequest_Value.n, sc) && CommandReturnValue.sCommand.Equals(CommandRequest_Value.cO, sc)) { // Do some validation if (ValidateTypeAndRange(CommandReturnValue.Value.GetValueType(), CommandRequest_Value.v)) { if (CommandReturnValue.Value.GetValueType().Equals("base64", StringComparison.OrdinalIgnoreCase)) { if (RSMPGS.MainForm.ToolStripMenuItem_StoreBase64Updates.Checked) { CommandReturnValue.Value.SetValue(RSMPGS.SysLog.StoreBase64DebugData(CommandRequest_Value.v)); } } else { CommandReturnValue.Value.SetValue(CommandRequest_Value.v); } rv.v = CommandRequest_Value.v; rv.cCI = CommandRequest_Value.cCI; rv.age = "recent"; RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Got Command, updated NTSObjectId: {0}, ComponentId: {1}, CommandCodeId: {2}, Name: {3}, Command: {4}, Value: {5}", CommandRequest.ntsOId, CommandRequest.cId, CommandRequest_Value.cCI, CommandRequest_Value.n, CommandRequest_Value.cO, CommandRequest_Value.v); RSMPGS.MainForm.HandleCommandListUpdate(RoadSideObject, CommandObject, CommandReturnValue); } else { rv.v = null; rv.cCI = CommandRequest_Value.cCI; rv.age = "unknown"; sError = "Value and/or type is out of range or invalid for this RSMP protocol version, type: " + CommandReturnValue.Value.GetValueType() + ", value: " + ((CommandRequest_Value.v.Length < 10) ? CommandRequest_Value.v : CommandRequest_Value.v.Substring(0, 9) + "..."); RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "{0}", sError); bSomeValueWasBad = true; } /* * // Found at least one value * if (UpdatedRoadSideObjects.ContainsKey(RoadSideObject) == false) * { * UpdatedRoadSideObjects.Add(RoadSideObject, RoadSideObject); * } */ bDone = true; bFoundCommand = true; break; } } if (bDone) { break; } } } rvs.Add(rv); if (bFoundCommand == false) { sError = "Got Command, failed to find object/command/name (NTSObjectId: " + CommandRequest.ntsOId + ", ComponentId: " + CommandRequest.cId + ", CommandCodeId: " + CommandRequest_Value.cCI + ", Name: " + CommandRequest_Value.n + ", Command: " + CommandRequest_Value.cO + ", Value: " + CommandRequest_Value.v + ")"; RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "{0}", sError); bSomeValueWasBad = true; } } //cRoadSideObject UpdatedRoadSideObject = null; /* * foreach (cRoadSideObject UpdatedRoadSideObject in UpdatedRoadSideObjects.Values) * { * RSMPGS.MainForm.HandleCommandListUpdate(UpdatedRoadSideObject); * } */ bSuccess = bSomeValueWasBad == false ? true : false; // Send response to client CommandResponse.mType = "rSMsg"; CommandResponse.type = "CommandResponse"; CommandResponse.mId = System.Guid.NewGuid().ToString(); CommandResponse.ntsOId = CommandRequest.ntsOId; CommandResponse.xNId = CommandRequest.xNId; CommandResponse.cId = CommandRequest.cId; //CommandResponse.cCI = CommandRequest.cCI; CommandResponse.cTS = CreateISO8601UTCTimeStamp(); CommandResponse.rvs = rvs; if (bHasSentAckOrNack == false) { bHasSentAckOrNack = SendPacketAck(bSuccess, packetHeader.mId, ""); } string sSendBuffer = JSonSerializer.SerializeObject(CommandResponse); RSMPGS.JSon.SendJSonPacket(CommandResponse.type, CommandResponse.mId, sSendBuffer, true); if (RSMPGS.MainForm.checkBox_ViewOnlyFailedPackets.Checked == false) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Sent CommandResponse message, Type: " + CommandResponse.type + ", MsgId: " + CommandResponse.mId); } } catch (Exception e) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to deserialize packet: {0}", e.Message); } return(bSuccess); }
private bool DecodeAndParseCommandMessage(RSMP_Messages.Header packetHeader, string sJSon, bool bUseStrictProtocolAnalysis, bool bUseCaseSensitiveIds, ref bool bHasSentAckOrNack, ref string sError) { StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; bool bSuccess = false; try { RSMP_Messages.CommandResponse CommandResponse = JSonSerializer.Deserialize <RSMP_Messages.CommandResponse>(sJSon); if (CommandResponse.type.Equals("commandresponse", StringComparison.OrdinalIgnoreCase)) { cRoadSideObject RoadSideObject = cHelper.FindRoadSideObject(CommandResponse.ntsOId, CommandResponse.cId, bUseCaseSensitiveIds); if (RoadSideObject != null) { foreach (RSMP_Messages.CommandResponse_Value Reply in CommandResponse.rvs) { foreach (cCommandObject CommandObject in RoadSideObject.CommandObjects) { bool bDone = false; foreach (cCommandReturnValue CommandReturnValue in CommandObject.CommandReturnValues) { if (CommandReturnValue.sName.Equals(Reply.n, sc) && CommandObject.sCommandCodeId.Equals(Reply.cCI, sc)) { cCommandEvent CommandEvent = new cCommandEvent(); CommandEvent.sTimeStamp = UnpackISO8601UTCTimeStamp(CommandResponse.cTS); CommandEvent.sMessageId = CommandResponse.mId; CommandEvent.sEvent = "Received command"; CommandEvent.sCommandCodeId = Reply.cCI; CommandEvent.sName = Reply.n; if (CommandReturnValue.Value.GetValueType().Equals("base64", StringComparison.OrdinalIgnoreCase)) { if (RSMPGS.MainForm.ToolStripMenuItem_StoreBase64Updates.Checked) { RSMPGS.SysLog.StoreBase64DebugData(Reply.v); } CommandEvent.sValue = "base64"; } else { CommandEvent.sValue = Reply.v; } CommandEvent.sAge = Reply.age; CommandReturnValue.sLastRecValue = Reply.v; CommandReturnValue.sLastRecAge = Reply.age; if (ValidateTypeAndRange(CommandReturnValue.Value.GetValueType(), Reply.v)) { bSuccess = true; } else { sError = "Value and/or type is out of range or invalid for this RSMP protocol version, type: " + CommandReturnValue.Value.GetValueType() + ", value: " + ((Reply.v.Length < 10) ? Reply.v : Reply.v.Substring(0, 9) + "..."); RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, sError); } if (RSMPGS_Main.bWriteEventsContinous) { RSMPGS.SysLog.EventLog("Command;{0}\tMId: {1}\tComponentId: {2}\tCommandCodeId: {3}\tName: {4}\tCommand: {5}\tValue: {6}\t Age: {7}\tEvent: {8}", CommandEvent.sTimeStamp, CommandEvent.sMessageId, CommandResponse.cId, CommandEvent.sCommandCodeId, CommandEvent.sName, CommandEvent.sCommand, CommandEvent.sValue, CommandEvent.sAge, CommandEvent.sEvent); } RoadSideObject.CommandEvents.Add(CommandEvent); RSMPGS.MainForm.HandleCommandListUpdate(RoadSideObject, CommandResponse.ntsOId, CommandResponse.cId, CommandEvent, false, bUseCaseSensitiveIds); bDone = true; break; } } if (bDone) { break; } } } } } else { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Got commandrequest message from SCADA, (corresponding MsgId {0}) ", CommandResponse.mId); } } catch (Exception e) { sError = "Failed to deserialize packet: " + e.Message; bSuccess = false; } return(bSuccess); }