Class ClientHighLevelCommunication
- All Implemented Interfaces:
HighLevelCommunicationCallbackInterface
public class ClientHighLevelCommunication extends java.lang.Object implements HighLevelCommunicationCallbackInterface
- Initialisierung und Verhandlung der Protokollversion.
Mit Hilfe der Telegrammverwaltung wird die TCP-Verbindung zum Datenverteiler hergestellt. Anschließend wird dem Datenverteiler in einem Protokollversionsanfrage-Telegramm mitgeteilt, welche Versionen des Kommunikationsprotokolls unterstützt werden. Als Reaktion wird vom Datenverteiler ein Protokollversionsantwort-Telegramm erwartet in dem die zu verwendende Version des Protokolls enthalten ist. - Authentifizierung gegenüber dem Datenverteiler und Verhandlung der Verbindungsparameter.
Zur Authentifizierung wird ein Authentifizierungsbereitschafts-Telegramm übertragen. Als Antwort wird ein vom Datenverteiler generierter Zufallstext im Authentifizierungsaufforderungs-Telegramm erwartet. Dieser Text wird durch das Modul HMAC-MD5-Verschlüsselung verschlüsselt. Als geheimer Schlüssel dient dabei das Passwort des Benutzers. Der verschlüsselte Text wird mit weiteren Informationen zum Datenverteiler übertragen. Als Antwort wird vom Datenverteiler ein Authentifizierungsannahme-Telegramm oder ein Authentifizierungsablehnungs-Telegramm erwartet. Im Falle einer Authentifizierungsablehnung wird der Authentifizierungsvorgang abgebrochen und kann bei Bedarf von der Verwaltung mit anderen Authentifizierungsinformationen wiederholt initiiert werden. Im Falle einer Authentifizierungsannahme werden anschließend die Verbindungsparameter verhandelt. Dazu sendet die Protokollsteuerung ein Verbindungsparameteranfrage-Telegramm an den Datenverteiler und erwartet ein Verbindungsparameterantwort-Telegramm mit der Festlegung der Verbindungsparameter vom Datenverteiler. - Abbruch der Verbindung
Diese Funktion führt zum sofortigen Abbruch der Verbindung zum Datenverteiler mit Hilfe der Abbruch-Funktion der Telegrammverwaltung. - Terminierung der
Verbindung
Zur Terminierung der Verbindung zum Datenverteiler wird ein Applikationsabmeldungs-Telegramm übertragen und die Kommunikationsverbindung terminiert. Dabei wird durch die Telegrammverwaltung sichergestellt, dass alle noch im Sendepuffer befindliche Telegramme vor dem Schließen der Kommunikationsverbindung zum Datenverteiler übertragen werden. - Parametrierung des Datenverteilers
Zur An- bzw. Abmeldung von zu empfangenden bzw. zu sendenden Daten wird ein entsprechendes Telegramm (Empfangsanmeldung, Sendeanmeldung, Empfangsabmeldung, Sendeabmeldung) an den Datenverteiler übertragen. - Entgegennahme von Sendesteuerungs-Telegrammen und Weiterleitung der enthaltenen Information (ob Daten, die von der Applikation zum Senden
angemeldet wurden, vom Datenverteiler benötigt werden oder nicht) an die Verwaltung.
- Senden von Anwendungsdaten
Zu sendende Datenblöcke werden in Telegramme zerlegt und an die Telegrammverwaltung weitergeleitet. - Empfang von Anwendungsdaten
Von der Telegrammverwaltung entgegengenommene Telegramme werden zu Datenblöcken rekombiniert und an das Modul Verwaltung weitergeleitet. - Zerlegung von großen Datenblöcken
in mehrere Datentelegramme beim Senden und Rekombination von zusammengehörigen Datentelegrammen zu einem Datenblock beim
Empfang.
- Telegrammlaufzeitermittlung
Zur Messung von Telegrammlaufzeiten wird ein Telegrammlaufzeitanfrage-Telegramm mit der aktuellen Systemzeit an den Datenverteiler übertragen. Als Antwort wird ein Telegrammlaufzeitantwort-Telegramm erwartet, in dem die ursprünglich übertragene Systemzeit enthalten ist. Durch Vergleich der Zeit zwischen dem Absenden des Anfrage-Telegramms und dem Erhalt der Antwort wird die Laufzeit für Hin- und Rückweg zusammen ermittelt. Andererseits kann auch vom Datenverteiler eine solche Messung durchgeführt werden, d.h. bei Empfang eines Telegrammlaufzeitanfrage-Telegramms wird die enthaltene Systemzeit in einem Telegrammlaufzeitantwort-Telegramm zurück übertragen. - Fehlerbehandlung
Fehlerzustände, die von der Protokollsteuerung erkannt werden oder von der Telegrammverwaltung gemeldet werden, führen zu einem Abbruch der Verbindung und zu einer Benachrichtigung des Moduls Verwaltung.
-
Constructor Summary
Constructors Constructor Description ClientHighLevelCommunication()
Dieser Konstruktor wird für JUnit-Tests gebraucht.ClientHighLevelCommunication(ClientDavParameters clientDavParameters, ApplicationCloseActionHandler closer)
Dieser Konstruktor erzeugt eine Instanz dieser Klasse mit den übergebenen Parametern. -
Method Summary
Modifier and Type Method Description void
completeInitialisation(ConfigurationManager configurationManager, CacheManager cacheManager, SubscriptionManager subscriptionManager)
Schließt die Initialisierung ab.void
disconnected(boolean error, java.lang.String message)
Wird von der unteren Kommunikationsschicht in Fehlersituationen zum Abbruch der Kommunikationsverbindung aufgerufen.long
getApplicationId()
Gibt die Id der Applikation zurück.AuthenticationStatus
getAuthenticationStatus()
long
getConfigurationId()
Gibt die Id der Konfiguration zurück.ClientConnectionProperties
getConnectionProperties()
Diese Methode gibt die Eigenschaften dieser Verbindung zurück.long
getDataTransmitterId()
Gibt die Id des Datenverteilers zurück.EncryptionStatus
getEncryptionStatus()
java.util.List<DataTelegram>
getSyncSystemTelegramList()
Gibt die temporäre Liste der Systemtelegramme für interne Synchronisationszwecke zurück.long
getTelegramTime(long maxWaitingTime)
Schickt ein Laufzeitermittlungs-Telegramm zum Datenverteiler und wartet auf seine Antwort, um herauszubekommen, wie viel Zeit die Übertragung in Anspruch nimmt.long
getUserId()
Gibt die Id des Benutzers zurück.boolean
isDisconnecting()
Gibttrue
zurück, wenn die Verbindung getrennt wurdevoid
login(ClientCredentials clientCredentials)
Die Methode erstellt eine logische Verbindung zum Datenverteiler, d. h. die Authentifizierung der Applikation und das Einstellen der Kommunikationsparameter wird durchgeführt, damit der Austausch von Daten sicher durchgeführt werden kann.void
sendData(SendDataObject dataToSend)
Versendet ein Applikationsdatentelegramm an den Datenverteiler.void
sendReceiveSubscription(ReceiveSubscriptionInfo subscription)
Es wird einEmpfangsanmeldungstelegramm
erstellt und zum Datenverteiler gesendet.void
sendReceiveUnsubscription(BaseSubscriptionInfo unsubscription)
Es wird einEmpfangsabmeldungstelegramm
erstellt und zum Datenverteiler gesendet.void
sendSendSubscription(SendSubscriptionInfo subscription)
Es wird einSendeanmeldetelegramm
erstellt und zum Datenverteiler gesendet.void
sendSendUnsubscription(BaseSubscriptionInfo unsubscription)
Es wird einSendeabmeldetelegramm
erstellt und zum Datenverteiler gesendet.void
setCloseHandler(ApplicationCloseActionHandler closer)
Setzt denApplicationCloseActionHandler
dieser Subkomponente.void
setConnectionListener(DavConnectionListener connectionListener)
Meldet einen Beobachter für Zustandsänderungen der Datenverteilerverbindung an.void
setReadyForConfigDependantData()
Diese Methode wird vom Anmeldungsmanager aufgerufen, nachdem die Anmeldungen erfolgreich abgeschlossen sind, die eine gerichtete Kommunikation mit der Konfiguration gewährleisten.void
terminate(boolean error, java.lang.String message)
Die bestehende Verbindung zum Datenverteiler wird terminiert, und der Kommunikationskanal wird geschlossen.void
terminate(boolean error, java.lang.String message, DataTelegram terminationTelegram)
void
update(DataTelegram telegram)
Wird von der unteren Kommunikationsschicht nach Empfang eines Telegramms aufgerufen.void
updateConfigData(SendDataObject receivedData)
Wenn ein neues Konfigurationstelegramm angekommen ist, wird es an die Verwaltung weitergeleitet.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Constructor Details
-
ClientHighLevelCommunication
public ClientHighLevelCommunication(ClientDavParameters clientDavParameters, ApplicationCloseActionHandler closer) throws CommunicationError, ConnectionExceptionDieser Konstruktor erzeugt eine Instanz dieser Klasse mit den übergebenen Parametern.ClientDavParameters
enthält die Adresse und Subadresse des Datenverteilers, spezifiziert das zu verwendende Protokoll durch dessen Namen.ApplicationCloseActionHandler
bestimmt wie die Applikationsfunktion auf einen Kommunikationsfehler reagieren soll.ClientConnectionProperties
werden erzeugt, die die Eigenschaften dieser Verbindung verkörpern. Sie spezifizieren insbesondere denAuthentificationProcess
, das für die Passwortverschlüsselung zuständige Verfahren. Weiter enthalten sie die PID der Konfiguration.Ein Systemtelegramm
ProtocolVersionRequest
wird gebildet und zum Datenverteiler gesendet. Es enthält Angaben über die unterstützte Protokollversion. Auf die Antwort wird eine festgelegte Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Antwort nicht innerhalb diese Zeit an-gekommen ist oder die Protokollversion vom Datenverteiler nicht unterstützt wird, dann wird eine CommunicationError-Ausnahme erzeugt.- Parameters:
clientDavParameters
- Parameterklasse für die Datenverteiler-Applikationsfunktionencloser
- bestimmt, wie die Applikationsfunktionen auf einen Kommunikationsfehler reagieren soll- Throws:
CommunicationError
- Wenn die Verhandlung der Protokollversion nicht durchgeführt wurde oder die Protokollversion nicht unterstützt wird.ConnectionException
- Wenn die Verbindung über die Telegrammverwaltung fehlschlägt.
-
ClientHighLevelCommunication
public ClientHighLevelCommunication()Dieser Konstruktor wird für JUnit-Tests gebraucht.
-
-
Method Details
-
isDisconnecting
public boolean isDisconnecting()Gibttrue
zurück, wenn die Verbindung getrennt wurde- Returns:
true
, wenn die Verbindung getrennt wurde, sonstfalse
-
getEncryptionStatus
-
getAuthenticationStatus
-
completeInitialisation
public final void completeInitialisation(ConfigurationManager configurationManager, CacheManager cacheManager, SubscriptionManager subscriptionManager)Schließt die Initialisierung ab. Diese Methode wird von ClientDavConnection aufgerufen. Es werden Referenzen auf den Konfigurationsmanager, den Cache-Manager und den Anmeldungsmanager festgehalten. Zusätzlich wird eine Referenz auf ClientHighLevelCommunication an den Anmeldungsmanager übergeben.- Parameters:
configurationManager
- der KonfigurationsmanagercacheManager
- der Cache-ManagersubscriptionManager
- der Anmeldungsmanager
-
getApplicationId
public long getApplicationId()Gibt die Id der Applikation zurück.- Returns:
- die Id der Applikation
-
getDataTransmitterId
public final long getDataTransmitterId()Gibt die Id des Datenverteilers zurück.- Returns:
- die Id des Datenverteilers
-
getConfigurationId
public final long getConfigurationId()Gibt die Id der Konfiguration zurück.- Returns:
- die ID der Konfiguration
-
getUserId
public final long getUserId()Gibt die Id des Benutzers zurück.- Returns:
- die ID des Benutzers
-
setReadyForConfigDependantData
public final void setReadyForConfigDependantData()Diese Methode wird vom Anmeldungsmanager aufgerufen, nachdem die Anmeldungen erfolgreich abgeschlossen sind, die eine gerichtete Kommunikation mit der Konfiguration gewährleisten. Dadurch signalisiert der Anmeldungsmanager die Bereitschaft, Datensätze zu empfangen, die Konfigurationsdaten benötigen, um interpretiert zu werden. -
setCloseHandler
Setzt denApplicationCloseActionHandler
dieser Subkomponente. Dieser bestimmt wie die Applikationsfunktion auf einen Kommunikationsfehler reagieren soll.- Parameters:
closer
-ApplicationCloseActionHandler
-
login
public final void login(ClientCredentials clientCredentials) throws InconsistentLoginException, CommunicationErrorDie Methode erstellt eine logische Verbindung zum Datenverteiler, d. h. die Authentifizierung der Applikation und das Einstellen der Kommunikationsparameter wird durchgeführt, damit der Austausch von Daten sicher durchgeführt werden kann. EinAuthentificationTextRequest
-Telegramm mit der Konfigurations-PID wird über dieTelegrammverwaltung
zum Datenverteiler gesendet, um einen Schlüssel für die Authentifizierung anzufordern. Auf die AntwortAuthentificationTextAnswer
wird eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone Antworten). Mit dem vom Datenverteiler erhaltenen Schlüssel wird das Benutzerpasswort durch denAuthentificationProcess
verschlüsselt und alsAuthentificationRequest
zum Datenverteiler gesendet. Auch hier wird eine gewisse Zeit auf die AntwortAuthentificationAnswer
gewartet (maximale Wartezeit auf synchrone Antworten). Wenn die Authentifizierung erfolgreich ist, werden die Ids der Applikation, des Datenverteilers, der Konfiguration und des Benutzers übertragen und von dieser Subkomponente festgehalten. Wird als Id der Konfiguration-1
zurückgegeben, so war die spezifizierte PID dem System nicht bekannt. Sonst werden die Keep-alive-Parameter und die Durchsatzprüfungsparameter mit dem Datenverteiler verhandelt. EinComParametersRequest
wird zum Datenverteiler gesendet. Auch hier wird auf die AntwortComParametersAnswer
eine gewisse Zeit gewartet (maximale Wartezeit auf synchrone Antworten).- Parameters:
clientCredentials
- Passwort oder Login-Token- Throws:
InconsistentLoginException
- Wenn die Authentifizierung nicht erfolgreich abgeschlossen werden konnte.CommunicationError
- Wenn eine Antwort nicht innerhalb einer parametrierten Zeit vom Datenverteiler beantwortet wird oder wenn als Id der Konfiguration eine-1
ermittelt wird.
-
sendReceiveSubscription
Es wird einEmpfangsanmeldungstelegramm
erstellt und zum Datenverteiler gesendet.- Parameters:
subscription
- die Empfangsanmeldeinformationen
-
sendReceiveUnsubscription
Es wird einEmpfangsabmeldungstelegramm
erstellt und zum Datenverteiler gesendet.- Parameters:
unsubscription
- die Empfangsabmeldeinformationen
-
sendSendSubscription
Es wird einSendeanmeldetelegramm
erstellt und zum Datenverteiler gesendet.- Parameters:
subscription
- die Sendeanmeldeinformationen
-
sendSendUnsubscription
Es wird einSendeabmeldetelegramm
erstellt und zum Datenverteiler gesendet.- Parameters:
unsubscription
- die Sendeabmeldeinformationen
-
sendData
Versendet ein Applikationsdatentelegramm an den Datenverteiler. Falls der zu sendende Datensatz größer ist, als die im System gesetzte maximale Länge eines Telegramms, wird er in Teiltelegramme zerstückelt und zum Datenverteiler gesendet.- Parameters:
dataToSend
- die zu sendenden Daten als Bytefeld vorbereitet
-
terminate
public final void terminate(boolean error, java.lang.String message)Die bestehende Verbindung zum Datenverteiler wird terminiert, und der Kommunikationskanal wird geschlossen. Wenn der Parametererror
gesetzt ist, wird die close-Methode vomApplicationCloseActionHandler
aufgerufen.- Parameters:
error
- Isttrue
, wenn die Verbindung im Fehlerfall abgebrochen werden soll, ohne die noch gepufferten Telegramme zu versenden;false
, wenn versucht werden soll alle gepufferten Telegramme zu versenden.message
- Fehlermeldung, die die Fehlersituation näher beschreibt.
-
terminate
public final void terminate(boolean error, java.lang.String message, DataTelegram terminationTelegram) -
disconnected
public void disconnected(boolean error, java.lang.String message)Description copied from interface:HighLevelCommunicationCallbackInterface
Wird von der unteren Kommunikationsschicht in Fehlersituationen zum Abbruch der Kommunikationsverbindung aufgerufen.- Specified by:
disconnected
in interfaceHighLevelCommunicationCallbackInterface
- Parameters:
error
-true
signalisiert eine Fehlersituation der unteren Kommunikationsschicht.message
- Fehlermeldung, die die Fehlersituation näher beschreibt.
-
update
Wird von der unteren Kommunikationsschicht nach Empfang eines Telegramms aufgerufen. Erhält ein Aktualisierungsdatum vom Datenverteiler. Diese Methode wird von derLowLevelCommunication
aufgerufen, wenn ein neues Telegramm angekommen ist. Sie reagiert nur auf die Telegramme, die für die Applikation von Interesse sind.Neu ankommende Telegramme werden je nach Typ unterschiedlich weiterverarbeitet:
Wenn das Telegramm vom Typ
AuthentificationTextAnswer
,AuthentificationAnswer
,ComParametersAnswer
,ProtocolVersionAnswer
oderTelegramTimeAnswer
ist, wird es in eine Liste eingefügt und eine Broadcast-Nachricht an alle wartenden Methoden gesendet. Diese überprüfen ob die Nachricht für sie relevant ist. In diesem Falle wird sie aus der Liste entfernt und bearbeitet.
Wenn das Telegramm vom TypTelegramTimeRequest
ist, wird anhand der übergebenen gemessene Zeit einTelegramTimeAnswer
gebildet und zum Datenverteiler gesendet.
Wenn das Telegramm vom TypRequestSenderDataTelegram
ist, wird die MethodenotifySenderApplication
des Anmeldungsmanagers aufgerufen, um die Applikation zu benachrichtigen.
Wenn das Telegramm vom TypApplicationDataTelegram
ist, wird zunächst überprüft, ob ein zerstückeltes Telegramm vorliegt. Ist dies der Fall, dann wird es in eine Liste eingefügt und überprüft ob alle Teiltelegramme vorhanden sind. Sind alle vorhanden, wird aus den Telegrammen einSendDataObject
erzeugt, das weiterverarbeitet werden kann. Wenn das Telegramm nicht zerstückelt ist, wird es sofort in einSendDataObject
zur Weiterbearbeitung umgewandelt. Wenn dieses erfolgreich erzeugt wurde, wird anhand seiner Basisanmeldeinformation überprüft, ob es eine Antwort einer Konfigurationsanfrage ist. Ist dies der Fall, so wird das Telegramm derupdate
-Methode des Konfigurations-Managers übergeben, wenn nicht, handelt es sich um ein Online-Telegramm und es wird an dieupdate
-Methode des Cache-Managers übergeben.
Wenn das Telegramm vom TypClosingTelegram
oderTerminateOrderTelegram
ist, wird die Methodeterminate(boolean, java.lang.String)
aufgerufen.Jeder andere Telegrammtyp wird ignoriert.
- Specified by:
update
in interfaceHighLevelCommunicationCallbackInterface
- Parameters:
telegram
- Das empfangene Telegramm- Throws:
java.lang.InterruptedException
- Wenn der Thread während eines blockierenden Aufrufs unterbrochen wurde
-
updateConfigData
Description copied from interface:HighLevelCommunicationCallbackInterface
Wenn ein neues Konfigurationstelegramm angekommen ist, wird es an die Verwaltung weitergeleitet.- Specified by:
updateConfigData
in interfaceHighLevelCommunicationCallbackInterface
- Parameters:
receivedData
- das Konfigurationstelegramm
-
getConnectionProperties
Diese Methode gibt die Eigenschaften dieser Verbindung zurück.- Returns:
- die Eigenschaften dieser Verbindung
-
getTelegramTime
Schickt ein Laufzeitermittlungs-Telegramm zum Datenverteiler und wartet auf seine Antwort, um herauszubekommen, wie viel Zeit die Übertragung in Anspruch nimmt.- Parameters:
maxWaitingTime
- Zeit in Millisekunden, die maximal auf eine Antwort gewartet wird.- Returns:
- Die Zeit, die benötigt wurde, um ein Telegramm von der Applikation zum Datenverteiler und zurück zu senden oder
-1
falls innerhalb der angegebenen Timeout-Zeit keine Antwort empfangen wurde. - Throws:
CommunicationError
- Falls die Verbindung zum Datenverteiler gestört ist.
-
setConnectionListener
Meldet einen Beobachter für Zustandsänderungen der Datenverteilerverbindung an.- Parameters:
connectionListener
- Beobachter für Zustandsänderungen der Datenverteilerverbindung
-
getSyncSystemTelegramList
Gibt die temporäre Liste der Systemtelegramme für interne Synchronisationszwecke zurück.- Returns:
- die Liste der Systemtelegramme
-