Exemplo n.º 1
0
 public MITM_Service()
 {
     hostsIPends        = new List <byte>();
     packetStructs      = new Queue <PacketStruct>();
     packetLockObject   = new object();
     publisher          = new Publisher();
     dataLinkHandler    = new DataLinkHandler();
     applicationHandler = new ApplicationHandler();
 }
Exemplo n.º 2
0
 public DNP3Handler()
 {
     DNP3ApplicationHandler = new ApplicationHandler();
     DNP3DataLinkHandler    = new DataLinkHandler();
 }
Exemplo n.º 3
0
        /// <summary>
        /// Processing answers from Simulator - Process Controller
        /// </summary>
        public void ProcessPCAnwers(TimeSpan timeout, CancellationToken token)
        {
            DataLinkHandler dataLinkHandler = new DataLinkHandler();

            while (!token.IsCancellationRequested)
            {
                bool           isSuccessful;
                IORequestBlock answer = IORequests.DequeueAnswer(out isSuccessful, timeout);

                if (isSuccessful)
                {
                    bool isChange = false;
                    RTU  rtu;

                    if ((rtu = dbContext.GetRTUByName(answer.ProcessControllerName)) != null)
                    {
                        switch (rtu.Protocol)
                        {
                        case IndustryProtocols.ModbusTCP:

                            ModbusHandler mdbHandler = new ModbusHandler();
                            try
                            {
                                mdbHandler.UnpackData(answer.RcvBuff, answer.RcvMsgLength);
                                switch (mdbHandler.Response.FunCode)
                                {
                                case FunctionCodes.ReadDiscreteInput:
                                {
                                    BitReadResponse response        = (BitReadResponse)mdbHandler.Response;
                                    var             responsePVCount = answer.Flags;

                                    ushort varAddr = answer.ReqAddress;
                                    for (int i = 0; i < responsePVCount; i++, varAddr++)
                                    {
                                        ProcessVariable pv;

                                        if (rtu.GetProcessVariableByAddress(varAddr, out pv))
                                        {
                                            Digital target = (Digital)pv;

                                            try
                                            {
                                                bool isOpened = response.BitValues[i];
                                                if (target.State != target.ValidStates[isOpened ? 1 : 0])
                                                {
                                                    isChange     = true;
                                                    target.State = target.ValidStates[isOpened ? 1 : 0];
                                                    Console.WriteLine(" CHANGE! Digital variable {0}, state: {1}", target.Name, target.State);

                                                    dMSProxy.ChangeOnSCADADigital(target.Name, target.State);
                                                }
                                            }
                                            catch
                                            {
                                                Console.WriteLine("Digital variable {0}, state: INVALID", target.Name);
                                            }
                                        }
                                    }
                                    if (isChange)
                                    {
                                        ScadaModelParser parser = new ScadaModelParser();
                                        parser.SerializeScadaModel();
                                    }
                                }

                                break;

                                // analog input
                                case FunctionCodes.ReadInputRegisters:
                                {
                                    RegisterReadResponse response = (RegisterReadResponse)mdbHandler.Response;
                                    var responsePVCount           = answer.Flags;

                                    ushort varAddr = answer.ReqAddress;
                                    for (int i = 0; i < responsePVCount; i++, varAddr++)
                                    {
                                        ProcessVariable pv;

                                        if (rtu.GetProcessVariableByAddress(varAddr, out pv))
                                        {
                                            Analog target = (Analog)pv;

                                            try
                                            {
                                                ushort newRawAcqValue = response.RegValues[target.RelativeAddress];
                                                float  newAcqValue;
                                                AnalogProcessor.RawValueToEGU(target, newRawAcqValue, out newAcqValue);

                                                if (target.AcqValue != newAcqValue)
                                                {
                                                    isChange = true;

                                                    target.RawAcqValue = newRawAcqValue;
                                                    target.AcqValue    = newAcqValue;
                                                    Console.WriteLine(" CHANGE! Analog variable {0}, AcqValue: {1}", target.Name, target.AcqValue);

                                                    //to do: propagacija analogih promena(ako se secate Pavlica je prvo rekao da nam to ne treba da samo jednom zakucamo vrednost na pocetku) xD

                                                    dMSProxy.ChangeOnSCADAAnalog(target.Name, target.AcqValue);
                                                }
                                            }
                                            catch
                                            {
                                                // Console.WriteLine("Digital variable {0}, state: INVALID", target.Name);
                                            }
                                        }
                                    }
                                    if (isChange)
                                    {
                                        ScadaModelParser parser = new ScadaModelParser();
                                        parser.SerializeScadaModel();
                                    }
                                }

                                break;
                                }
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e.Message);
                            }
                            break;

                        case IndustryProtocols.DNP3TCP:

                            byte len = answer.RcvBuff[2];

                            byte actualLen = (byte)(2 + 1 + 5 + 2); // start + len + ctrl + dest + source + crc

                            len -= 5;                               // minus header

                            while (len > 0)
                            {
                                if (len < 16)
                                {
                                    // last chunk
                                    actualLen += (byte)(len + 2);
                                    break;
                                }

                                actualLen += (byte)(16 + 2);
                                len       -= 16;
                            }

                            byte[] message = new byte[actualLen];

                            for (int i = 0; i < actualLen; i++)
                            {
                                message[i] = answer.RcvBuff[i];
                            }

                            List <UserLevelObject> userLevelObjects = dataLinkHandler.PackUp(message);

                            if (userLevelObjects == null)
                            {
                                continue;
                            }

                            DNP3UserLayerHandler          dNP3UserLayerHandler = new DNP3UserLayerHandler(new DNP3Handler(), dbContext);
                            List <Tuple <string, float> > tuples = dNP3UserLayerHandler.ReadAllAnalogInputPointsReadResponse(userLevelObjects, rtu.Name);

                            foreach (Tuple <string, float> tuple in tuples)
                            {
                                try
                                {
                                    dMSProxy.ChangeOnSCADAAnalog(tuple.Item1, tuple.Item2);
                                }
                                catch
                                {
                                    dMSProxy = new DMSSCADAProxy();
                                }
                            }

                            break;
                        }
                    }
                }
            }

            Console.WriteLine("ProcessPCAnswers.shutdown=true");
            return;
        }
        public List <byte[]> PackDown(byte[] data, bool isRequest, bool isMaster)
        {
            List <byte[]> segments = new List <byte[]>();

            bool fir      = true;
            byte sequence = 0;

            TransportHeader  transportHeader  = new TransportHeader();
            TransportSegment transportSegment = new TransportSegment(transportHeader);

            int dataCount = data.Count();
            int dataIndex = 0;

            while (dataCount > 0)
            {
                if (sequence == 64)
                {
                    sequence = 0;
                }
                else
                {
                    sequence++;
                }

                int totalLength = 1;

                byte[] temp = null;

                if (fir)
                {
                    transportHeader.Header[6] = true;       // FIR
                    fir      = false;
                    sequence = 0;
                }
                else
                {
                    transportHeader.Header[6] = false;       // FIR
                }

                if (dataCount <= segmentMaxSize)
                {
                    transportHeader.Header[7] = true;       // FIN

                    temp = new byte[dataCount + 1];

                    for (int i = 1; i <= dataCount; i++)
                    {
                        temp[i] = data[dataIndex++];
                    }

                    totalLength += dataCount;
                }
                else
                {
                    temp = new byte[segmentMaxSize + 1];

                    for (int i = 1; i <= dataCount; i++)
                    {
                        temp[i] = data[dataIndex++];
                    }

                    totalLength += segmentMaxSize;
                }

                dataCount -= segmentMaxSize;
                dataIndex += segmentMaxSize;

                BitArray tempSeq = new BitArray(new byte[] { sequence });

                transportHeader.Header[5] = tempSeq[5];      // Sequence
                transportHeader.Header[4] = tempSeq[4];
                transportHeader.Header[3] = tempSeq[3];
                transportHeader.Header[3] = tempSeq[2];
                transportHeader.Header[2] = tempSeq[1];
                transportHeader.Header[0] = tempSeq[0];

                temp[0] = transportHeader.ToBytes()[0];

                byte[] finalDataLinkSegment = new byte[totalLength];

                for (int i = 0; i < totalLength; i++)
                {
                    finalDataLinkSegment[i] = temp[i];
                }

                segments.Add(finalDataLinkSegment);
            }

            List <byte[]> returnValue = new List <byte[]>();

            DNP3DataLinkHandler = new DataLinkHandler();

            foreach (byte[] segment in segments)
            {
                List <byte[]> tempSegments = new List <byte[]>()
                {
                    DNP3DataLinkHandler.PackDown(segment, isRequest, isMaster, DataLinkFunctionCodes.UNCONFIRMED_USER_DATA)
                };

                foreach (byte[] tempSegment in tempSegments)
                {
                    returnValue.Add(tempSegment);
                }
            }

            return(returnValue);
        }
Exemplo n.º 5
0
        void ProcessRequest(TcpClient client)
        {
            DataLinkHandler dataLinkHandler = new DataLinkHandler();

            Byte[] bytes = new Byte[1000];

            NetworkStream stream = client.GetStream();

            byte actualLen = 0;

            int i = 0;

            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                byte len = bytes[2];

                actualLen = (byte)(2 + 1 + 5 + 2); // start + len + ctrl + dest + source + crc

                len -= 5;                          // minus header

                while (len > 0)
                {
                    if (len < 16)
                    {
                        // last chunk
                        actualLen += (byte)(len + 2);
                        break;
                    }

                    actualLen += (byte)(16 + 2);
                    len       -= 16;
                }

                byte[] message = new byte[actualLen];

                for (i = 0; i < actualLen; i++)
                {
                    message[i] = bytes[i];
                }

                List <UserLevelObject> userLevelObjects = dataLinkHandler.PackUp(message);

                if (userLevelObjects == null)
                {
                    continue;
                }

                DNP3Handler          dNP3Handler = new DNP3Handler();
                DNP3UserLayerHandler userLayer   = new DNP3UserLayerHandler(dNP3Handler);
                List <byte[]>        segments    = userLayer.ReadAllAnalogInputPointsResponse(userLevelObjects);

                int offset = 0;

                foreach (byte[] segment in segments)
                {
                    try
                    {
                        stream.Write(segment, offset, segment.Count());
                    }
                    catch (Exception e) { }
                }
            }
        }