Class LowLevelCommunication
- All Implemented Interfaces:
LowLevelCommunicationInterface
Die Aufgabe dieser Klasse ist es Telegramme zu versenden, zu empfangen und KeepAlive-Mechanismus zu verwalten.
Jede dieser Aufgaben wird durch mindestens einen Thread übernommen:
Empfang von Daten: ReceivingChannel (nimmt die Daten entgegen und legt diese in _receivingTable ab. Bei Konfigurationsanfragen kann es zur Zerstücklung von Telegrammen kommen, diese Teiltelgramme werden in _splittedTelegramsTable abgelegt und dort mit jedem empfang eines Teiltelegramms langsam zusammen gebaut und nach Vollendung an ClientHighLevelCommunication durchgereicht (nicht über den Worker-Thread). Beim empfang von Daten wird der KeepAlive-Thread benachrichtigt.), WorkerThread (bearbeitet die _receivingTable und reicht empfangene Telegramme an ClientHighLevelCommunication weiter).
Versand von Daten: SendingChannel (verschickt Telegramme aus der _sendingTable und benachrichtigt den KeepAlive Thread, sobald Daten verschickt wurden. Prüft die Laufzeit der einzelnen Telegramme und unterbricht die Verbindung sobald diese einen kritischen Wert unterschreitet).
KeepAlive-Mechanismus: KeepAliveThread (Verwaltet ob ein "KeepAlive" Telegramm verschickt werden muss. Dies ist abhängig davon, ob eine Telegramm versendet/empfangen wurde. Wurde eine bestimmte Anzahl Keepalive Telegramme versendet, so wird die Verbindung abgebaut. Wird nach dem versand eines KeepAlive Telegramms ein normales Telegramm empfangen/gesendet, so wird der KeepAlive-Telegrammzähler wieder auf 0 gesetzt. Anmerkung: Das KeepAlive Paket wird nicht über den SendingChannel-Thread verschickt, sondern direkt über den Outputstream.)
Alle vollständigen Telegramme werden in zwei TelegramQueue-Objekten gespeichert (eine für den Empfang, eine für den Versand). Die oben beschriebenen Threads (ausser der KeepAlive-Thread) arbeiten und synchronisieren sich auf den jeweiligen "PriorityTables".
Begriffsdefinitionen: Protokollsteuerung DaV-DAF (Klasse ClientHighLevelCommunication), Datenrepräsentation (Klassen DataInputStream und DataOutputStream), TCP-Kommunikationskanal (Klasse TCP_IP_Communication)
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final byte
Wert für denmode
-Parameter des Konstruktors, der bewirkt, dass Konfigurationsantworten ausgewertet und entsprechend an die höhere Kommunikationsebene weitergegeben werden.static final byte
Wert für denmode
-Parameter des Konstruktors, der bewirkt, dass Konfigurationsantworten wie normale Datentelegramme verarbeitet werden. -
Constructor Summary
ConstructorsConstructorDescriptionLowLevelCommunication
(ConnectionInterface connection, int sendBufferSize, int receiveBufferSize, long keepAliveSendTimeOut, long keepAliveReceiveTimeOut, byte mode, boolean connected) -
Method Summary
Modifier and TypeMethodDescriptionfinal void
Diese Methode baut eine Kommunikationsverbindung zu den angegebenen Adressen auf.void
Deaktiviert die Verschlüsselungfinal void
disconnect
(boolean error, String message, DataTelegram terminationTelegram) Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn die Kommunikationskanäle geschlossen werden sollen.void
enableEncryption
(SrpTelegramEncryption encryption) Aktiviert die Verschlüsselungfinal ConnectionInterface
Gibt den Repräsentant der Verbindung zurückGibt den Verschlüsselungsstatus zurückLiefert einen beschreibenden Text mit dem Zustand des Sendepuffersfinal boolean
Gibt als Information zurück, ob die Kommunikationsverbindung unterbrochen ist.final void
send
(DataTelegram telegram) Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn ein Telegramm gesendet werden soll.final void
send
(DataTelegram[] telegrams) Fügt mehrere Telegramme in die Sendetabelle ein.void
sendDirect
(DataTelegram telegram) Sendet ein Telegramm direkt, wobei die SendeQueue umgangen wird.void
sendDirect
(Collection<DataTelegram> telegrams) Sendet Telegramme direkt, wobei die SendeQueue umgangen wird.final void
setHighLevelComponent
(HighLevelCommunicationCallbackInterface highLevelComponent) Setzt die Interpretationsschicht dieser Komponente für den internen Datenaustausch.final void
setRemoteAddress
(String remoteAddress, int remotePort) void
setRemoteName
(String name) Diese Methode setzt den Namen des Kommunikationspartners, der für Fehlermeldungen etc. verwendet wird.toString()
final void
updateKeepAliveParameters
(long keepAliveSendTimeOut, long keepAliveReceiveTimeOut) Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn die Keepalive-Parameter-Verhandlung erfolgreich abgeschlossen ist und setzt somit die Timeouts des Keepaliveprozesses.final void
updateThroughputParameters
(float throughputControlSendBufferFactor, long throughputControlInterval, int minimumThroughput) Diese Methode setzt die Parameter für die Durchsatzprüfung.
-
Field Details
-
NORMAL_MODE
public static final byte NORMAL_MODEWert für denmode
-Parameter des Konstruktors, der bewirkt, dass Konfigurationsantworten wie normale Datentelegramme verarbeitet werden.- See Also:
-
HANDLE_CONFIG_RESPONCES_MODE
public static final byte HANDLE_CONFIG_RESPONCES_MODEWert für denmode
-Parameter des Konstruktors, der bewirkt, dass Konfigurationsantworten ausgewertet und entsprechend an die höhere Kommunikationsebene weitergegeben werden.- See Also:
-
-
Constructor Details
-
LowLevelCommunication
public LowLevelCommunication(ConnectionInterface connection, int sendBufferSize, int receiveBufferSize, long keepAliveSendTimeOut, long keepAliveReceiveTimeOut, byte mode, boolean connected) throws ConnectionException - Parameters:
connection
- Verbindungsobjekt über dass die Kommunikation mit dem Kommunikationspartner realisiert wird.sendBufferSize
- Sendetabellenkapazität (in Byte)receiveBufferSize
- Empfangstabellenkapazität (in Byte)keepAliveSendTimeOut
- Zeitspanne in ms. Wird solange kein Telegramm verschickt, wird ein KeepAlive-Telegramm verschickt.keepAliveReceiveTimeOut
- Zeitspanne in ms. Wird solange keine Telegramm empfangen, wird ein Zähler herabgesetzt. Erreicht der Zähler 0 wird die Verbindung terminiert. Wird zwischendurch ein Telegramm empfangen, wird der Zähler auf das maximum gesetzt.mode
- Modus für das Konfigurationsdatenverhalten. Falls hier der WertHANDLE_CONFIG_RESPONCES_MODE
übergeben wird, dann werden Konfigurationsantworten ausgewertet und entsprechend an die höhere Kommunikationsebene weitergegeben. Falls hier der WertNORMAL_MODE
übergeben wird, dann werden Konfigurationsantworten wie normale Datentelegramme verarbeitet.connected
- Information, ob die Verbindung bereits erfolgt ist oder nicht (connected)- Throws:
ConnectionException
- Wenn das Verbindungsobjekt sich nicht im erwarteten Zustand befindet.
-
-
Method Details
-
getConnectionInterface
Description copied from interface:LowLevelCommunicationInterface
Gibt den Repräsentant der Verbindung zurück- Specified by:
getConnectionInterface
in interfaceLowLevelCommunicationInterface
- Returns:
- Repräsentant der Verbindung
-
getHighLevelComponent
-
setHighLevelComponent
Description copied from interface:LowLevelCommunicationInterface
Setzt die Interpretationsschicht dieser Komponente für den internen Datenaustausch. Erst nach Aufruf dieser Methode von der Protokollschicht DaV-DAF werden die Kommunikations-Threads gestartet, weil sonst keine Telegramme interpretiert oder weitergeleitet werden können.- Specified by:
setHighLevelComponent
in interfaceLowLevelCommunicationInterface
- Parameters:
highLevelComponent
- Komponente, die benachrichtigt werden muss, wenn neue Nachrichten empfangen werden.
-
updateKeepAliveParameters
public final void updateKeepAliveParameters(long keepAliveSendTimeOut, long keepAliveReceiveTimeOut) Description copied from interface:LowLevelCommunicationInterface
Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn die Keepalive-Parameter-Verhandlung erfolgreich abgeschlossen ist und setzt somit die Timeouts des Keepaliveprozesses.- Specified by:
updateKeepAliveParameters
in interfaceLowLevelCommunicationInterface
- Parameters:
keepAliveSendTimeOut
- SendekeepalivetimeoutkeepAliveReceiveTimeOut
- Empfangekeepalivetimeout
-
updateThroughputParameters
public final void updateThroughputParameters(float throughputControlSendBufferFactor, long throughputControlInterval, int minimumThroughput) Description copied from interface:LowLevelCommunicationInterface
Diese Methode setzt die Parameter für die Durchsatzprüfung. Sie wird von der Protokollschicht DaV-DAF aufgerufen, wenn die Parameter für die Durchsatzprüfung erfolgreich verhandelt wurden.- Specified by:
updateThroughputParameters
in interfaceLowLevelCommunicationInterface
- Parameters:
throughputControlSendBufferFactor
- Füllungsgrad des Sendepuffers als Faktor zwischen 0 und 1, ab dem die Durchsatzprüfung anfängt zu arbeiten.throughputControlInterval
- Zeit zwischen zwei Durchsatzprüfungen in MillisekundenminimumThroughput
- Minimal zulässiger Verbindungsdurchsatz in Bytes pro Sekunde
-
connect
Diese Methode baut eine Kommunikationsverbindung zu den angegebenen Adressen auf. Sie wird von der Protokollschicht DaV-DAF während der Verbindungsinitialisierung aufgerufen.Nach dem Verbindungsaufbau werden die Referenzen auf den Sende- und den Empfangskanal festgehalten. Diese werden von den Threads benutzt um Daten zu senden oder empfangen.
- Specified by:
connect
in interfaceLowLevelCommunicationInterface
- Parameters:
mainAddress
- Adresse des Kommunikationspartners dieser Verbindung.subAddress
- Subadresse der Adresse.- Throws:
ConnectionException
- Falls die Verbindung nicht hergestellt werden kann.
-
isNotConnected
public final boolean isNotConnected()Description copied from interface:LowLevelCommunicationInterface
Gibt als Information zurück, ob die Kommunikationsverbindung unterbrochen ist.- Specified by:
isNotConnected
in interfaceLowLevelCommunicationInterface
- Returns:
true
= Es besteht keine Verbindung;false
= sonst
-
send
Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn ein Telegramm gesendet werden soll.Fügt ein Telegramm in die Sendetabelle ein.
- Specified by:
send
in interfaceLowLevelCommunicationInterface
- Parameters:
telegram
- Das zu versendende Telegramm.
-
send
Description copied from interface:LowLevelCommunicationInterface
Fügt mehrere Telegramme in die Sendetabelle ein.- Specified by:
send
in interfaceLowLevelCommunicationInterface
- Parameters:
telegrams
- Die zu versendenden Telegramme.- See Also:
-
disconnect
Diese Methode wird von der Protokollschicht DaV-DAF aufgerufen, wenn die Kommunikationskanäle geschlossen werden sollen.Zunächst wird der Empfangsthread geschlossen; dadurch werden keine Daten mehr empfangen. Danach wird der Keep-alive-Thread geschlossen. Daraufhin wird gewartet, bis der Sendethread alle Telegramme aus der Sendetabelle gesendet hat, damit keine Daten verloren gehen. Anschließend wird der Sendethread beendet. Zuletzt werden die Kommunikationskanäle geschlossen.
- Specified by:
disconnect
in interfaceLowLevelCommunicationInterface
- Parameters:
error
- Besagt, ob es sich um eine Terminierung mit Fehler handelt. Fallstrue
werden sämtliche noch zum Versand gepufferten Telegramme verworfen; fallsfalse
wird versucht, sämtliche zum Versand gepufferten Telegramme zu versenden.message
- Ursache der Terminierung im Fehlerfall.terminationTelegram
- Das Telegramm, dass als letztes Telegramm vor dem Schließen der Verbindung versendet werden soll odernull
, falls kein abschließendes Telegramm versendet werden soll.
-
getSendBufferState
Description copied from interface:LowLevelCommunicationInterface
Liefert einen beschreibenden Text mit dem Zustand des Sendepuffers- Specified by:
getSendBufferState
in interfaceLowLevelCommunicationInterface
- Returns:
- Zustand des Sendepuffers
-
setRemoteName
Description copied from interface:LowLevelCommunicationInterface
Diese Methode setzt den Namen des Kommunikationspartners, der für Fehlermeldungen etc. verwendet wird.- Specified by:
setRemoteName
in interfaceLowLevelCommunicationInterface
- Parameters:
name
- Name oder Identifikation des Kommunikationspartners
-
setRemoteAddress
-
enableEncryption
Description copied from interface:LowLevelCommunicationInterface
Aktiviert die Verschlüsselung- Specified by:
enableEncryption
in interfaceLowLevelCommunicationInterface
- Parameters:
encryption
- Verschlüsselung
-
disableEncryption
public void disableEncryption()Description copied from interface:LowLevelCommunicationInterface
Deaktiviert die Verschlüsselung- Specified by:
disableEncryption
in interfaceLowLevelCommunicationInterface
-
getEncryptionStatus
Description copied from interface:LowLevelCommunicationInterface
Gibt den Verschlüsselungsstatus zurück- Specified by:
getEncryptionStatus
in interfaceLowLevelCommunicationInterface
- Returns:
- den Verschlüsselungsstatus
-
sendDirect
Description copied from interface:LowLevelCommunicationInterface
Sendet ein Telegramm direkt, wobei die SendeQueue umgangen wird. Das Telegramm muss versendet wurden sein, wenn die Methode verlassen wird- Specified by:
sendDirect
in interfaceLowLevelCommunicationInterface
- Parameters:
telegram
- Telegramm
-
sendDirect
Description copied from interface:LowLevelCommunicationInterface
Sendet Telegramme direkt, wobei die SendeQueue umgangen wird. Das Telegramm muss versendet wurden sein, wenn die Methode verlassen wird- Specified by:
sendDirect
in interfaceLowLevelCommunicationInterface
- Parameters:
telegrams
- Telegramme
-
toString
-