Umfassende Anleitung: Modellierung eines Telefonsystem-Steuerungssystems mit UML-Zustandsmaschinen

🎯 Übersicht

Diese Anleitung fĂŒhrt Sie durch die Gestaltung und Modellierung eines Telefonie-Anruf-Steuerungssystem unter Verwendung von UML-Zustandsmaschinen-Diagrammen. Sie konzentriert sich auf die Lebenszyklus ausgehender Anrufe, wobei gezeigt wird, wie eine Telefonleitung aufgrund von Benutzeraktionen und Netzwerkevents zwischen ZustĂ€nden wechselt.

Das Diagramm erfasst sowohl die glĂŒckliche Pfade (Erfolgreiche Anrufherstellung) als auch die unglĂŒckliche Pfade (Fehler, Timeouts, besetzte Leitungen), wobei der Fokus auf Robustheit, Ausnahmehandhabung und klaren ZustandsĂŒbergĂ€ngen liegt – zentrale Prinzipien in Echtzeitkommunikationssystemen.


đŸ§© Grundkonzepte von UML-Zustandsmaschinen

Bevor Sie in das Diagramm einsteigen, verstehen Sie diese grundlegenden UML-Konzepte:

Begriff Beschreibung
Zustand Ein Zustand, in dem ein Objekt bestimmte Bedingungen erfĂŒllt oder Aktionen ausfĂŒhrt.
Übergang Ein Wechsel von einem Zustand zum anderen, ausgelöst durch ein Ereignis.
Ereignis Ein Ereignis, das einen Übergang verursacht (z. B. onHook, gĂŒltigeNummer).
SelbstĂŒbergang Ein Übergang, der in demselben Zustand beginnt und endet (z. B. Ziffer(n) wĂ€hrend in WĂ€hlen).
Pseudozustand Spezielle Steuerpunkte wie Anfang oder Ende die keine echten ZustÀnde sind.
Verbundzustand Ein Zustand, der Unterkonfigurationen enthĂ€lt (z. B. Fehler Zustand mit Besetztton, Schneller Besetztton, Aufgezeichnete Nachricht).
WĂ€chterbedingung Ein boolescher Ausdruck, der wahr sein muss, damit eine Übergang stattfindet.

✅ Pro-Tipp: Verwenden Sie Ereignis [WĂ€chter] / Aktion Syntax in UML, um Auslöser, Bedingungen und Nebenwirkungen zu dokumentieren.


🔄 Lebenszyklus ausgehender Anrufe: Schritt-fĂŒr-Schritt-AufschlĂŒsselung

1. Initiierungs- und WÀhlphase

đŸ”č AnfĂ€nglicher Pseudozustand → Bereitschaft

  • Das System startet im AnfĂ€nglicher Pseudozustand.
  • Noch keine AktivitĂ€t; das Telefon befindet sich am Hörer.

đŸ”č Bereitschaft → WĂ€hlton (am Hörer)

  • Ereignis: am Hörer (Benutzer hebt den Hörer ab)
  • Übergang: am Hörer → WĂ€hlton
  • Aktion: WĂ€hlton erzeugen; Vorbereitung auf Eingabe einer Ziffer.

📌 Dies ist die erste sichtbare ZustandsĂ€nderung im Anruflebenszyklus.

đŸ”č WĂ€hlton → WĂ€hlen (Ziffer(n))

  • Ereignis: Ziffer(n) (Benutzer gibt eine Ziffer ein)
  • Übergang: Ziffer(n) → WĂ€hlen
  • Zustand: Wechseln in WĂ€hlen Modus.

đŸ”č Selbstdurchlauf: WĂ€hlen → WĂ€hlen (Ziffer(n))

  • Ereignis: Ziffer(n) (Mehrere Ziffern eingegeben)
  • Bedingung: Keine (immer erlaubt)
  • Aktion: FĂŒge Ziffer zur eingegebenen Nummer hinzu.
  • Zweck: Erlaube kontinuierliche Eingabe von Ziffern ohne den Wahlvorgang Zustand zu verlassen.

💡 SelbstĂŒbergĂ€nge sind entscheidend fĂŒr die Behandlung von Eingabefolgen wie Telefonnummern.


2. Verbindungslogik und Ausnahmehandhabung

đŸ”č Wahlvorgang → Verbindungsaufbau (gĂŒltigeNummer)

  • Ereignis: gĂŒltigeNummer (vollstĂ€ndige Nummer bestĂ€tigt)
  • Übergang: gĂŒltigeNummer → Verbindungsaufbau
  • Aktion: Rufaufbau mit dem Netzwerk initiieren.

đŸ”č Wahlvorgang → Aufgezeichnete Nachricht (ungĂŒltigeNummer)

  • Ereignis: ungĂŒltigeNummer (z. B. falsche LĂ€nge, ungĂŒltiger PrĂ€fix)
  • Übergang: ungĂŒltigeNummer → Aufgezeichnete Nachricht
  • Aktion: Wiedergabe einer vorab aufgezeichneten Nachricht: „Die von Ihnen gewĂ€hlte Nummer ist nicht im Dienst.“

đŸ”č Verbindungsaufbau → Besetztton (NummerBesetzt)

  • Ereignis: NummerBesetzt
  • Übergang: NummerBesetzt → Besetztton
  • Aktion: Besetztton abspielen; Benutzer informieren, dass die Leitung belegt ist.

đŸ”č Verbindungsaufbau → Schneller Besetztton (LeitungBelegt)

  • Ereignis: LeitungBelegt
  • Übergang: LeitungBelegt → Schneller Besetztton
  • Aktion: Schnellen Besetztton abspielen; NetzĂŒberlastung anzeigen.

⚠ Hinweis: Dies sind FehlerzustĂ€nde die den normalen Ablauf unterbrechen. Sie mĂŒssen ordnungsgemĂ€ĂŸ behandelt werden.


3. Timeout- und Warnmechanismus

đŸ”č WĂ€hlen → Warnung (Timeout)

  • Ereignis: Timeout nach 30 Sekunden InaktivitĂ€t
  • Übergang: Timeout → Warnung
  • Aktion: Warnsignal abspielen; Benutzer informieren, weiterzumachen oder aufzulegen.

đŸ”č Warnung → Timeout (Timeout)

  • Ereignis: Timeout nochmals nach 10 Sekunden
  • Übergang: timeout → Timeout
  • Aktion: Rufversuch abbrechen; zurĂŒck zu Wartezustand.

⏱ Die Timeout-Logik verhindert ein unendliches Warten und verbessert die Benutzererfahrung.


4. Aktueller Anruf und Trennung

đŸ”č Verbindung herstellen → Klingeln (weitergeleitet)

  • Ereignis: weitergeleitet (Netzwerk leitet den Anruf erfolgreich weiter)
  • Übergang: weitergeleitet → Klingeln
  • Aktion: Senden des Klingelsignals an die angerufene Partei.

đŸ”č Klingeln → Verbunden (angerufene Partei antwortet)

  • Ereignis: angerufene Partei antwortet
  • Übergang: angerufene Partei antwortet → Verbunden
  • Aktion: Audioverbindung herstellen; Aufnahme des Anrufs starten (falls aktiviert).

đŸ”č Verbunden → Getrennt (auflegen ODER angerufene Partei legt auf)

  • Zwei Wege zur Trennung:
    1. Benutzer legt auf: auflegen → Getrennt
    2. Andere Partei legt auf: calledPhoneHangsUp → Getrennt

🔄 Beide ÜbergĂ€nge fĂŒhren zu Getrennt bevor erreicht wird Endzustand.

đŸ”č Getrennt → Endzustand

  • Ereignis: Kein (implizit oder ĂŒber Aktion zur Bereinigung)
  • Übergang: Getrennt → End
  • Aktion: RĂ€ume Ressourcen auf, protokolliere Anrufdauer, aktualisiere Statistiken.

✅ Der Endzustand markiert das Ende des Anruflebenszyklus.


🎹 Visuelle Gestaltungsprinzipien fĂŒr Klarheit

Um komplexe Zustandsmaschinen lesbar und wartbar zu machen:

Prinzip Implementierung
Zentrales Hauptpfad Halte den Hauptverlauf (Wartend → WĂ€hlton → WĂ€hlen → Verbinden → Klingeln → Verbunden) als saubere vertikale oder horizontale Linie.
Zweige nach außen fĂŒr Ausnahmen Platziere FehlerzustĂ€nde (Besetztton, Schnellbesetztton, Aufgezeichnete Nachricht) als Seitenzweige.
VerknĂŒpfe verwandte ZustĂ€nde Verwende zusammengesetzte ZustĂ€nde fĂŒr FehlerzustĂ€nde (siehe unten).
Verwende PseudozustÀnde weise Anfang und Ende sollten deutlich gekennzeichnet werden.
Überkreuzende ÜbergĂ€nge vermeiden Stellen Sie sicher, dass Pfeile sich nicht ĂŒberlappen; verwenden Sie falls nötig orthogonale Bereiche.

🔧 Erweiterte Modellierungstechniken

✅ Zusammengesetzter Zustand: Gruppierung „Fehler“

Statt die Auflistung von Besetztton, Schneller Besetztton, und Aufgezeichnete Nachricht als separate ZustÀnde aufzulisten, gruppieren Sie sie unter einem zusammengesetzten Zustand namens Fehler:

[Fehler] 
├── Besetztton
├── Schneller Besetztton
└── Aufgezeichnete Nachricht
  • Eintrittsaktion: Spielt einen Fehlerton oder eine Fehlermeldung ab.
  • Austrittsaktion: ZurĂŒck zu WĂ€hltone oder Ruhestatus nach der Benutzerantwort.

✅ Vorteil:Verringert visuelle UnĂŒbersichtlichkeit und verbessert die Skalierbarkeit.


✅ WĂ€chterbedingungen (optionale Verbesserungen)

FĂŒgen Sie WĂ€chter hinzu, um ÜbergĂ€nge zu verfeinern:

digit(n) [number.length < 15] → WĂ€hlen
validNumber [number.isInternational] → Verbinden

đŸ› ïž WĂ€chter verhindern ungĂŒltige ÜbergĂ€nge und unterstĂŒtzen bedingte Logik.


📌 Wichtige Erkenntnisse: Best Practices fĂŒr komplexe Zustandsmaschinen

Übung Warum es wichtig ist
Unangenehme Pfade modellieren Reale Systeme versagen. Gestaltung fĂŒr ungĂŒltigeNummer, ZeitĂŒberschreitung, Leitung besetzt sorgt fĂŒr ZuverlĂ€ssigkeit.
Aktionsexpressionen verwenden Enthalten Sie / logCallAttempt() oder / playTone() um Nebenwirkungen anzuzeigen.
Halten Sie Ereignisse ausfĂŒhrlich und handlungsorientiert Verwenden Sie aufgelegt, weitergeleitet, angerufenesTelefonantwortetanstatte1, e2.
ZustÀnde deutlich benennen VermeideZustand1, Zustand2. VerwendeWÀhlen, Klingeln, Verbunden.
Annahmen dokumentieren Zum Beispiel: „Timeout nach 30 Sekunden InaktivitĂ€t“ sollte in Kommentaren erwĂ€hnt werden.

đŸ’» Codegenerierung: PlantUML & Mermaid

Hier sindfertige Codeblöckeum dieses Diagramm in Ihrem bevorzugten Format zu generieren.


✅ PlantUML-Code

@startuml

[*] --> Idle
Idle --> DialTone : aufgelegt
DialTone --> Dialing : Ziffer(n)
Dialing --> Dialing : Ziffer(n) ' SelbstĂŒbergang
Dialing --> Connecting : gĂŒltigeNummer
Dialing --> RecordedMessage : ungĂŒltigeNummer
Dialing --> Warning : Timeout
Warning --> Timeout : Timeout
Connecting --> Ringing : weitergeleitet
Connecting --> BusyTone : NummerBesetzt
Connecting --> FastBusyTone : TrunkBesetzt
Ringing --> Connected : angerufenesTelefonantwortet
Connected --> Disconnected : aufgelegt
Connected --> Disconnected : angerufenesTelefonlegteauf
Disconnected --> [*] : Bereinigung

state "Fehler" as ErrorState {
state "Besetztton" as BusyTone
state "SchnellBesetztton" as FastBusyTone
state "AufgezeichneteNachricht" as RecordedMessage
}

' Interne Aktionen
Idle : entry / Warten auf Abheben
DialTone : entry / WĂ€hlen-Ton abspielen
Dialing : entry / Ziffern sammeln
Connecting : entry / Anruf weiterleiten
Ringing : entry / FerngerÀt klingeln lassen
Connected : entry / Anrufsession aufbauen
Disconnected : entry / Session beenden

@enduml

đŸ“„Â Wie man verwendet: EinfĂŒgen in PlantUML Live oder Ihre IDE-Erweiterung.


✅ Mermaid-Code

stateDiagram-v2
    [*] --> Idle
    Idle --> DialTone : onHook

    DialTone --> Dialing : digit(n)
    Dialing --> Dialing : digit(n)  ' SelbstĂŒbergang
    Dialing --> Connecting : validNumber
    Dialing --> RecordedMessage : invalidNumber
    Dialing --> Warning : timeout

    Warning --> Timeout : timeout

    Connecting --> Ringing : routed
    Connecting --> BusyTone : numberBusy
    Connecting --> FastBusyTone : trunkBusy

    Ringing --> Connected : calledPhoneAnswers
    Connected --> Disconnected : onHook
    Connected --> Disconnected : calledPhoneHangsUp

    Disconnected --> [*] : cleanup

    state Error {
        BusyTone
        FastBusyTone
        RecordedMessage
    }

    Connecting --> BusyTone : numberBusy
    Connecting --> FastBusyTone : trunkBusy
    Dialing --> RecordedMessage : invalidNumber

    note right of BusyTone
        Standard-Besetztton abspielen
    end note

    note right of FastBusyTone
        Schnellen Besetztton abspielen (NetzĂŒberlastung)
    end note

    note right of RecordedMessage
        Aufgezeichnete Nachricht abspielen: "Die Nummer ist nicht im Service."
    end note

    note right of Timeout
        Anrufversuch nach 40 Sekunden abgebrochen
    end note

đŸ“„Â So verwenden Sie es: EinfĂŒgen in Mermaid Live Editor oder unterstĂŒtzte Markdown-Tools (VS Code, Obsidian usw.).


📚 Zusammenfassung und abschließende Gedanken

Dieses Telefonie-Anrufsteuerungssystem Zustandsmaschine ist ein realer Anwendungsfall davon, wie UML komplexe, ereignisgesteuerte Systeme mit hoher ZuverlÀssigkeit modellieren kann.

✅ Was diesen Diagramm effektiv macht:

  • Klare glĂŒcklicher Pfad mit logischem Ablauf.
  • Umfassende Fehlerbehandlung.
  • Verwendung von SelbstĂŒbergĂ€nge, zusammengesetzte ZustĂ€nde, und WĂ€chter.
  • Visuelle Klarheit durch Gruppierung und Anmerkung.

đŸ› ïž Wann sollte dieses Muster verwendet werden:

  • Telefoniesysteme
  • IoT-GerĂ€testeuerung
  • Benutzersitzungsverwaltung
  • Workflowsysteme
  • Eingebettete Systeme mit endlichem Zustandslogik

📝 Möchten Sie dies erweitern?

BerĂŒcksichtigen Sie Folgendes:

  • Anrufaufzeichnung Zustand (mit startAufzeichnung, stopAufzeichnung Ereignisse)
  • Anrufumleitung Logik (bedingte Routing)
  • Anrufwarteschleife UnterstĂŒtzung (parallele ZustĂ€nde)
  • Anrufweiterleitung als Unterzustand von Verbunden
  • Zustandsverlauf (oberflĂ€chlich/tiefes Verlauf) fĂŒr die Wiederaufnahme nach Unterbrechung

📌 EndgĂŒltige Empfehlung

Modellieren Sie immer sowohl die Erfolgspfade als auch die FehlervorgÀnge.
Eine Zustandsmaschine, die nur die „glĂŒcklichen Pfade“ behandelt, ist unvollstĂ€ndig und in der Produktion anfĂ€llig fĂŒr Fehler.

Verwenden Sie diese Anleitung als Vorlage zur Modellierung jedes Echtzeit-Systems, bei dem ZustandsĂŒbergĂ€nge, Ereignisse, und Fehlerrobustheit wichtig sind.


✅ Bereit zum Generieren, Visualisieren oder Erweitern?
👉 Kopieren Sie den PlantUML oder Mermaid Code oben und integrieren Sie ihn in Ihre Dokumentation, Architekturdiagramme oder Systemdesigndokumente.

Lassen Sie mich wissen, wenn Sie eine PDF-Version, interaktives Diagramm, oder Integration in ein grĂ¶ĂŸeres Systemmodell (z. B. mit Komponenten- oder Ablaufdiagrammen)!


📘 „Die besten Systeme sind nicht nur korrekt – sie antizipieren Fehler.“
— Entwerfen mit UML-Zustandsmaschinen