/// <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(); } } } }
/// <summary> /// 发送ASDU /// </summary> /// <param name="asdu"></param> public void SendASDU(ASDU asdu) { Frame frame = new T104Frame(); asdu.Encode(frame, parameters); //发送I帧 sendIMessage(frame); }
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(); } }
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)); } } }