Exemplo n.º 1
0
        /// <summary>
        /// Enqueues the ASDU to the transmission queue.
        /// </summary>
        /// If an active connection exists the ASDU will be sent to the active client immediately. Otherwhise
        /// the ASDU will be added to the transmission queue for later transmission.
        /// <param name="asdu">ASDU to be sent</param>
        public void EnqueueASDU(ASDU asdu)
        {
            if (enqueuedASDUs != null)
            {
                lock (enqueuedASDUs) {
                    if (oldestQueueEntry == -1)
                    {
                        oldestQueueEntry    = 0;
                        latestQueueEntry    = 0;
                        numberOfAsduInQueue = 1;

                        enqueuedASDUs [0].asdu.ResetFrame();
                        asdu.Encode(enqueuedASDUs [0].asdu, parameters);

                        enqueuedASDUs [0].entryTimestamp = SystemUtils.currentTimeMillis();
                        enqueuedASDUs [0].state          = QueueEntryState.WAITING_FOR_TRANSMISSION;
                    }
                    else
                    {
                        latestQueueEntry = (latestQueueEntry + 1) % maxQueueSize;

                        if (latestQueueEntry == oldestQueueEntry)
                        {
                            oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize;
                        }
                        else
                        {
                            numberOfAsduInQueue++;
                        }

                        enqueuedASDUs [latestQueueEntry].asdu.ResetFrame();
                        asdu.Encode(enqueuedASDUs [latestQueueEntry].asdu, parameters);

                        enqueuedASDUs [latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis();
                        enqueuedASDUs [latestQueueEntry].state          = QueueEntryState.WAITING_FOR_TRANSMISSION;
                    }
                }

                DebugLog("Queue contains " + numberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")");

                foreach (ServerConnection connection in allOpenConnections)
                {
                    if (connection.IsActive)
                    {
                        connection.ASDUReadyToSend();
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 发送ASDU
        /// </summary>
        /// <param name="asdu"></param>
        public void SendASDU(ASDU asdu)
        {
            Frame frame = new T104Frame();

            asdu.Encode(frame, parameters);

            //发送I帧
            sendIMessage(frame);
        }
Exemplo n.º 3
0
        public void EnqueueAsdu(ASDU asdu)
        {
            lock (enqueuedASDUs)
            {
                if (oldestQueueEntry == -1)
                {
                    oldestQueueEntry    = 0;
                    latestQueueEntry    = 0;
                    numberOfAsduInQueue = 1;

                    enqueuedASDUs[0].asdu.ResetFrame();
                    asdu.Encode(enqueuedASDUs[0].asdu, parameters);

                    enqueuedASDUs[0].entryTimestamp = SystemUtils.currentTimeMillis();
                    enqueuedASDUs[0].state          = QueueEntryState.WAITING_FOR_TRANSMISSION;
                }
                else
                {
                    latestQueueEntry = (latestQueueEntry + 1) % maxQueueSize;

                    if (latestQueueEntry == oldestQueueEntry)
                    {
                        oldestQueueEntry = (oldestQueueEntry + 1) % maxQueueSize;
                    }
                    else
                    {
                        numberOfAsduInQueue++;
                    }

                    enqueuedASDUs[latestQueueEntry].asdu.ResetFrame();
                    asdu.Encode(enqueuedASDUs[latestQueueEntry].asdu, parameters);

                    enqueuedASDUs[latestQueueEntry].entryTimestamp = SystemUtils.currentTimeMillis();
                    enqueuedASDUs[latestQueueEntry].state          = QueueEntryState.WAITING_FOR_TRANSMISSION;
                }
            }

            DebugLog("Queue contains " + numberOfAsduInQueue + " messages (oldest: " + oldestQueueEntry + " latest: " + latestQueueEntry + ")");
        }
        private void SendASDUInternal(ASDU asdu)
        {
            if (isActive)
            {
                lock (waitingASDUsHighPrio) {
                    BufferFrame frame = new BufferFrame(new byte[256], 6);

                    asdu.Encode(frame, parameters);

                    waitingASDUsHighPrio.Enqueue(frame);
                }

                SendWaitingASDUs();
            }
        }
Exemplo n.º 5
0
        private int SendIMessage(ASDU asdu)
        {
            BufferFrame frame = new BufferFrame(new byte[260], 6);             /* reserve space for ACPI */

            asdu.Encode(frame, parameters);

            byte[] buffer = frame.GetBuffer();

            int msgSize = frame.GetMsgSize();              /* ACPI + ASDU */

            buffer [0] = 0x68;

            /* set size field */
            buffer [1] = (byte)(msgSize - 2);

            buffer [2] = (byte)((sendSequenceNumber % 128) * 2);
            buffer [3] = (byte)(sendSequenceNumber / 128);

            buffer [4] = (byte)((receiveSequenceNumber % 128) * 2);
            buffer [5] = (byte)(receiveSequenceNumber / 128);

            if (running)
            {
                socket.NoDelay = true;
                socket.Send(buffer, msgSize, SocketFlags.None);
                sendSequenceNumber = (sendSequenceNumber + 1) % 32768;
                statistics.SentMsgCounter++;
                unconfirmedReceivedIMessages = 0;

                if (sentMessageHandler != null)
                {
                    sentMessageHandler(sentMessageHandlerParameter, buffer, msgSize);
                }

                return(sendSequenceNumber);
            }
            else
            {
                if (lastException != null)
                {
                    throw new ConnectionException(lastException.Message, lastException);
                }
                else
                {
                    throw new ConnectionException("not connected", new SocketException(10057));
                }
            }
        }