Guide complet : Modélisation d’un système de contrôle d’appels téléphoniques à l’aide des machines à états UML

🎯 Aperçu

Ce guide vous accompagne dans la conception et la modélisation d’un système de contrôle d’appels téléphoniques à l’aide des diagrammes de machine à états UML.Système de contrôle d’appels téléphoniquesà l’aide dediagrammes de machine à états UML. Il se concentre sur le cycle de vie des appels sortants, illustrant comment une ligne téléphonique passe d’un état à un autre en réponse aux actions de l’utilisateur et aux événements réseau.cycle de vie des appels sortantsillustrant comment une ligne téléphonique passe d’un état à un autre en réponse aux actions de l’utilisateur et aux événements réseau.

Le diagramme capture à la fois les cheminschemins heureux (mise en place réussie d’un appel) et leschemins malheureux (erreurs, délais dépassés, lignes occupées), en mettant l’accent sur la robustesse, la gestion des exceptions et les transitions d’état claires, des principes fondamentaux dans les systèmes de communication en temps réel.


🧩 Concepts fondamentaux des machines à états UML

Avant de plonger dans le diagramme, comprenez ces concepts UML fondamentaux :

Concept Description
État Une condition durant laquelle un objet satisfait certaines conditions ou effectue des actions.
Transition Un changement d’un état à un autre, déclenché par un événement.
Événement Un événement qui provoque une transition (par exemple, onHookvalidNumber).
Transition auto Une transition qui commence et se termine dans le même état (par exemple, chiffre(n) pendant que dans Saisie).
État pseudo Points de contrôle spéciaux tels que Initial ou Final qui ne sont pas des états réels.
État composite Un état contenant des sous-états (par exemple Erreur état avec Tonalité occupéeTonalité occupée rapideMessage enregistré).
Condition de garde Une expression booléenne qui doit être vraie pour qu’une transition ait lieu.

✅ Astuce pro : Utilisez événement [garde] / action syntaxe en UML pour documenter les déclencheurs, les conditions et les effets secondaires.


🔄 Cycle de vie des appels sortants : Analyse étape par étape

1. Phase d’initiation et de saisie

🔹 État pseudo initial → Inactif

  • Le système démarre dans l’étatÉtat pseudo initial.

  • Aucune activité pour le moment ; le téléphone est sur le support.

🔹 Inactif → Ton de composante (sur le support)

  • Événement : sur le support (l’utilisateur soulève le combiné)

  • Transition : sur le support → ton de composante

  • Action : Générer le ton de composante ; préparer l’entrée des chiffres.

📌 Il s’agit du premier changement d’état visible dans le cycle de vie de l’appel.

🔹 Ton de composante → Composition (chiffre(n))

  • Événement : chiffre(n) (l’utilisateur entre un chiffre)

  • Transition : chiffre(n) → Composition

  • État : Entrer Composition mode.

🔹 Transition auto : Composition → Composition (chiffre(n))

  • Événement : chiffre(n) (plusieurs chiffres entrés)

  • Condition : Aucun (toujours autorisé)

  • Action : Ajouter un chiffre au numéro en cours de composition.

  • Objectif : Permettre l’entrée continue de chiffres sans quitter l’étatComposition état.

💡 Les transitions internes sont essentielles pour gérer les séquences d’entrée telles que les numéros de téléphone.


2. Logique de connexion et gestion des exceptions

🔹 Composition → Connexion (numéroValide)

  • Événement : numéroValide (numéro complet validé)

  • Transition : numéroValide → Connexion

  • Action : Démarrer la mise en place de l’appel avec le réseau.

🔹 Composition → Message enregistré (numéroInvalide)

  • Événement : numéroInvalide (par exemple, longueur incorrecte, préfixe invalide)

  • Transition : numéroInvalide → Message enregistré

  • Action : Lire le message préenregistré :« Le numéro que vous avez composé n’est pas actif. »

🔹 Connexion → Tonalité d’occupation (numéroOccupé)

  • Événement : numéroOccupé

  • Transition : numéroOccupé → tonalitéOccupée

  • Action : Jouer la tonalité d’occupation ; informer l’utilisateur que la ligne est occupée.

🔹 Connexion → tonalitéOccupéeRapide (trunkBusy)

  • Événement : trunkOccupé

  • Transition : trunkOccupé → tonalitéOccupéeRapide

  • Action : Jouer la tonalité d’occupation rapide ; indiquer une congestion du réseau.

⚠️ Remarque : Ce sont des étatsErreur qui interrompent le flux normal. Ils doivent être gérés de manière appropriée.


3. Mécanisme d’expiration et d’alerte

🔹 Composition → Avertissement (expiration)

  • Événement : expiration après 30 secondes d’inactivité

  • Transition : expiration → Avertissement

  • Action : Jouer une sonnerie d’alerte ; informer l’utilisateur de continuer ou de raccrocher.

🔹 Avertissement → expiration (expiration)

  • Événement : expiration à nouveau après 10 secondes

  • Transition : timeout → Timeout

  • Action : Annuler l’appel ; retourner à Inactif.

⏱️ La logique de délai d’attente empêche l’attente indéfinie et améliore l’expérience utilisateur.


4. Appel actif et déconnexion

🔹 Connexion → Sonnerie (routée)

  • Événement : routée (le réseau a correctement routé l’appel)

  • Transition : routée → Sonnerie

  • Action : Envoyer le signal de sonnerie à la partie appelée.

🔹 Sonnerie → Connecté (le téléphone appelé répond)

  • Événement : le téléphone appelé répond

  • Transition : le téléphone appelé répond → Connecté

  • Action : Établir la connexion audio ; démarrer l’enregistrement de l’appel (si activé).

🔹 Connecté → Déconnecté (décroché OU le téléphone appelé raccroche)

  • Deux voies de déconnexion :

    1. Utilisateur raccroche : décroché → Déconnecté

    2. L’autre partie raccroche : calledPhoneHangsUp → Déconnecté

🔄 Les deux transitions mènent à Déconnecté avant d’atteindre État final.

🔹 Déconnecté → État final

  • Événement : Aucun (implicite ou via une action de nettoyage)

  • Transition : Déconnecté → Final

  • Action : Nettoyer les ressources, enregistrer la durée de l’appel, mettre à jour les statistiques.

✅ L’état final signifie la fin du cycle de vie de l’appel.


🎨 Principes de conception visuelle pour la clarté

Pour rendre les machines d’état complexes lisibles et maintenables :

Principe Mise en œuvre
Chemin principal central Gardez le flux principal (Inactif → Ton de composante → Composition → Connexion → Sonnerie → Connecté) sous forme d’une ligne verticale ou horizontale nette.
Développez vers l’extérieur pour les exceptions Placez les états d’erreur (Ton de busy, Ton de busy rapide, Message enregistré) comme des branches latérales.
Regroupez les états connexes Utilisez états composés pour les conditions d’erreur (voir ci-dessous).
Utilisez les états pseudo avec sagesse Initial et Final doit être clairement marqué.
Éviter les transitions croisées Maintenez les flèches éloignées les unes des autres ; utilisez des régions orthogonales si nécessaire.

🔧 Techniques avancées de modélisation

✅ État composite : regroupement « Erreur »

Au lieu de lister BusyToneFastBusyTone, et RecordedMessage en tant qu’états distincts, regroupez-les sous un état composite appelé Erreur:

[Erreur] 
├── BusyTone
├── FastBusyTone
└── MessageEnregistré
  • Action d’entrée : Jouer le ton d’erreur ou le message.

  • Action de sortie : Retourner à DialTone ou Inactif après la réponse de l’utilisateur.

✅ Avantage :Réduit le désordre visuel et améliore la scalabilité.


✅ Conditions de garde (améliorations optionnelles)

Ajoutez des gardes pour affiner les transitions :

digit(n) [number.length < 15] → Numérotation
validNumber [number.isInternational] → Connexion

🛠️ Les gardes empêchent les transitions non valides et soutiennent la logique conditionnelle.


📌 Points clés : Meilleures pratiques pour les machines à états complexes

Pratique Pourquoi cela importe
Modéliser les chemins d’erreur Les systèmes réels échouent. Concevoir pournuméro invalidedélai dépassétrunk occupéassure la fiabilité.
Utilisez des expressions d’action Incluez / logCallAttempt() ou / playTone() pour afficher les effets secondaires.
Gardez les événements explicites et orientés action Utilisez raccrochéroutéle téléphone appelé répondau lieu dee1e2.
Nommez clairement les états Évitez État1État2. Utilisez CompositionSonnerieConnecté.
Documentez les hypothèses Par exemple, « Délai d’attente après 30 secondes d’inactivité » doit être indiqué dans les commentaires.

💻 Génération de code : PlantUML et Mermaid

Voici des blocs de code prêts à l’emploi pour générer ce diagramme dans votre format préféré.


✅ Code PlantUML

@startuml

[*] –> Inactif
Inactif –> TonDeRéponse : sur le combiné
TonDeRéponse –> Composition : chiffre(n)
Composition –> Composition : chiffre(n) ‘ Transition auto
Composition –> Connexion : numéroValide
Appel en cours –> MessageEnregistré : numéroInvalide
Appel en cours –> Avertissement : délai dépassé
Avertissement –> Délai dépassé : délai dépassé
Connexion –> Sonnerie : routé
Connexion –> Ton d’occupation : numéro occupé
Connexion –> Ton d’occupation rapide : tronc occupé
Sonnerie –> Connecté : téléphone appelé répond
Connecté –> Déconnecté : sur le combiné
Connecté –> Déconnecté : téléphone appelé raccroche
Déconnecté –> [*] : nettoyage

état « Erreur » comme ÉtatErreur {
état « Ton d’occupation » comme TonDOccupation
état « Ton d’occupation rapide » comme TonDOccupationRapide
état « Message enregistré » comme MessageEnregistré
}

‘ Actions internes
Inactif : entrée / Attente du déclenchement du combiné
Ton de composante : entrée / Lecture du ton de composante
Appel en cours : entrée / Collecte des chiffres
Connexion : entrée / Acheminement de l’appel
Sonnerie : entrée / Sonnerie du téléphone distant
Connecté : entrée / Établissement de la session d’appel
Déconnecté : entrée / Terminaison de la session

@enduml

📥 Comment l’utiliser : Collez dans PlantUML Live ou votre plugin IDE.


✅ Code Mermaid

stateDiagram-v2
    [*] --> Idle
    Idle --> DialTone : sur le combiné

    DialTone --> Dialing : chiffre(n)
    Dialing --> Dialing : chiffre(n)  ' Transition auto
    Dialing --> Connecting : numéroValide
    Dialing --> RecordedMessage : numéroInvalide
    Dialing --> Warning : délaiDépassé

    Warning --> Timeout : délaiDépassé

    Connecting --> Ringing : routé
    Connecting --> BusyTone : numéroOccupé
    Connecting --> FastBusyTone : troncOccupé

    Ringing --> Connected : téléphoneAppeléRépond
    Connected --> Disconnected : sur le combiné
    Connected --> Disconnected : téléphoneAppeléRaccroche

    Disconnected --> [*] : nettoyage

    state Error {
        BusyTone
        FastBusyTone
        RecordedMessage
    }

    Connecting --> BusyTone : numéroOccupé
    Connecting --> FastBusyTone : troncOccupé
    Dialing --> RecordedMessage : numéroInvalide

    note right of BusyTone
        Jouer le ton d'occupation standard
    end note

    note right of FastBusyTone
        Jouer le ton d'occupation rapide (congestion réseau)
    end note

    note right of RecordedMessage
        Jouer le message enregistré : « Numéro hors service. »
    end note

    note right of Timeout
        Tentative d'appel annulée après 40 secondes
    end note

📥 Comment l’utiliser : Collez dans Éditeur en direct Mermaid ou des outils Markdown pris en charge (VS Code, Obsidian, etc.).


📚 Résumé et réflexions finales

Ce Système de contrôle d’appel téléphonique machine à états est un exemple du monde réel de la manière dont UML peut modéliser des systèmes complexes et événementiels avec une haute fiabilité.

✅ Ce qui rend ce diagramme efficace :

  • Clair chemin normal avec un flux logique.

  • Traitement complet des erreurs.

  • Utilisation de transitions autoétats composés, et conditions.

  • Clarté visuelle grâce à la regroupement et à la annotation.

🛠️ Quand utiliser ce modèle :

  • Systèmes de téléphonie

  • Contrôle des dispositifs IoT

  • Gestion des sessions utilisateur

  • Moteurs de workflow

  • Systèmes embarqués avec logique d’état fini


📝 Souhaitez-vous étendre cela ?

Pensez à ajouter :

  • Enregistrement des appels état (avec demarrerEnregistrementarreterEnregistrement événements)

  • Renvoi d’appel logique (routage conditionnel)

  • Attente d’appel prise en charge (états parallèles)

  • Transfert d’appel en tant qu’état secondaire de Connecté

  • Historique des états (historique superficiel/profond) pour la réentrée après interruption


📌 Recommandation finale

Modélisez toujours les chemins de succès et d’échec.
Une machine à états qui ne traite que les « chemins heureux » est incomplète et sujette aux bogues en production.

Utilisez ce guide comme un modèle pour modéliser tout système en temps réel où transitions d’étatévénements, et résilience aux erreurs compte.


✅ Prêt à générer, visualiser ou étendre ?
👉 Copiez le PlantUML ou Mermaid code ci-dessus et intégrez-le dans votre documentation, vos diagrammes d’architecture ou vos documents de conception de système.

Faites-moi savoir si vous souhaitez un version PDFdiagramme interactif, ou intégration dans un modèle de système plus large (par exemple, avec des composants ou des diagrammes de séquence)!


📘 « Les meilleurs systèmes ne sont pas seulement corrects : ils anticipent les défaillances. »
— Concevoir avec des machines à états UML