예제 #1
0
        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);
        }
예제 #2
0
        public void CreateAndSendCommandMessage(cRoadSideObject RoadSideObject, List <cCommandReturnValue> ReturnValues, bool bUseCaseSensitiveIds)
        {
            StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;

            RSMP_Messages.CommandRequest       CommandRequest;
            RSMP_Messages.CommandRequest_Value CommandRequest_Value;
            string sSendBuffer;

            try
            {
                CommandRequest = new RSMP_Messages.CommandRequest();

                CommandRequest.mType = "rSMsg";
                CommandRequest.type  = "CommandRequest";
                CommandRequest.mId   = System.Guid.NewGuid().ToString();

                CommandRequest.ntsOId = RoadSideObject.sNTSObjectId;
                CommandRequest.xNId   = RoadSideObject.sExternalNTSId;
                CommandRequest.cId    = RoadSideObject.sComponentId;
                CommandRequest.arg    = new List <RSMP_Messages.CommandRequest_Value>();
                foreach (cCommandReturnValue CommandReturnValue in ReturnValues)
                {
                    CommandRequest_Value     = new RSMP_Messages.CommandRequest_Value();
                    CommandRequest_Value.cCI = CommandReturnValue.CommandObject.sCommandCodeId;
                    CommandRequest_Value.n   = CommandReturnValue.sName;
                    CommandRequest_Value.cO  = CommandReturnValue.sCommand;

                    if (CommandReturnValue.Value.GetValueType().Equals("base64", StringComparison.OrdinalIgnoreCase))
                    {
                        // Path?
                        if (CommandReturnValue.Value.GetValue().Contains("\\"))
                        {
                            try
                            {
                                byte[] Base64Bytes = null;
                                // Open file for reading
                                System.IO.FileStream   fsBase64 = new System.IO.FileStream(CommandReturnValue.Value.GetValue(), System.IO.FileMode.Open, System.IO.FileAccess.Read);
                                System.IO.BinaryReader brBase64 = new System.IO.BinaryReader(fsBase64);
                                long lBytes = new System.IO.FileInfo(CommandReturnValue.Value.GetValue()).Length;
                                Base64Bytes = brBase64.ReadBytes((Int32)lBytes);
                                fsBase64.Close();
                                fsBase64.Dispose();
                                brBase64.Close();
                                CommandRequest_Value.v = Convert.ToBase64String(Base64Bytes);
                                if (CommandRequest_Value.v.Length > (cTcpSocketClientThread.BUFLENGTH - 100))
                                {
                                    RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Base64 encoded packet is too big (" + Base64Bytes.GetLength(0).ToString() + " bytes), max buffer length is " + cTcpSocketClientThread.BUFLENGTH.ToString() + " bytes");
                                    CommandRequest_Value.v = null;
                                }
                            }
                            catch (Exception e)
                            {
                                RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Could not base64-encode and send file '{0}', error {1}", CommandReturnValue.Value.GetValue(), e.Message);
                                CommandRequest_Value.v = null;
                            }
                        }
                    }
                    else
                    {
                        CommandRequest_Value.v = CommandReturnValue.Value.GetValue();
                    }
                    CommandRequest.arg.Add(CommandRequest_Value);

                    cCommandEvent CommandEvent = new cCommandEvent();
                    CommandEvent.sTimeStamp     = CreateLocalTimeStamp();
                    CommandEvent.sMessageId     = CommandRequest.mId;
                    CommandEvent.sEvent         = "Sent Command";
                    CommandEvent.sCommandCodeId = CommandReturnValue.CommandObject.sCommandCodeId;
                    CommandEvent.sName          = CommandReturnValue.sName;
                    CommandEvent.sCommand       = CommandReturnValue.sCommand;
                    CommandEvent.sValue         = CommandReturnValue.Value.GetValue();
                    RoadSideObject.CommandEvents.Add(CommandEvent);
                    RSMPGS.MainForm.HandleCommandListUpdate(RoadSideObject, CommandRequest.ntsOId, CommandRequest.cId, CommandEvent, true, bUseCaseSensitiveIds);

                    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, CommandRequest.cId, CommandEvent.sCommandCodeId,
                                               CommandEvent.sName, CommandEvent.sCommand, CommandEvent.sValue, CommandEvent.sAge, CommandEvent.sEvent);
                    }
                }

                sSendBuffer = JSonSerializer.SerializeObject(CommandRequest);

                if (RSMPGS.JSon.SendJSonPacket(CommandRequest.type, CommandRequest.mId, sSendBuffer, true))
                {
                    RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Sent command message, MsgId: " + CommandRequest.mId);
                }
                else
                {
                    RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to send command message, MsgId: " + CommandRequest.mId);
                }
            }
            catch (Exception e)
            {
                RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to create command message: {0}", e.Message);
            }
        }