Guía completa: Modelado de un sistema de control de llamadas telefónicas utilizando máquinas de estado UML

🎯 Visión general

Esta guía te guía a través del diseño y modelado de unSistema de control de llamadas telefónicasutilizandoDiagramas de máquina de estado UML. Se centra en elciclo de vida de la llamada saliente, ilustrando cómo una línea telefónica cambia entre estados en respuesta a acciones del usuario y eventos de red.

El diagrama captura tanto loscaminos exitosos (configuración exitosa de la llamada) como loscaminos problemáticos (errores, tiempos de espera agotados, líneas ocupadas), enfatizando la robustez, el manejo de excepciones y las transiciones de estado claras, principios clave en los sistemas de comunicación en tiempo real.


🧩 Conceptos fundamentales en las máquinas de estado UML

Antes de adentrarte en el diagrama, comprende estos conceptos fundamentales de UML:

Concepto Descripción
Estado Una condición durante la cual un objeto satisface ciertas condiciones o realiza acciones.
Transición Un cambio de un estado a otro, desencadenado por un evento.
Evento Una ocurrencia que provoca una transición (por ejemplo, descolgadonúmero válido).
Transición autónoma Una transición que comienza y termina en el mismo estado (por ejemplo, dígito(n) mientras en Marcando).
Estado pseudo Puntos de control especiales como Inicial o Final que no son estados reales.
Estado compuesto Un estado que contiene subestados (por ejemplo, Error estado con Tono de ocupadoTono de ocupado rápidoMensaje grabado).
Condición de guarda Una expresión booleana que debe ser verdadera para que ocurra una transición.

✅ Consejo profesional: Utilice evento [guarda] / acción sintaxis en UML para documentar desencadenantes, condiciones y efectos secundarios.


🔄 Ciclo de vida de llamada saliente: Desglose paso a paso

1. Fase de iniciación y marcado

🔹 Estado pseudo inicial → Ocupado

  • El sistema comienza en el Estado pseudo inicial.

  • Aún no hay actividad; el teléfono está colgado.

🔹 Ocupado → Tonada de marcado (colgado)

  • Evento: colgado (el usuario levanta el auricular)

  • Transición: colgado → Tonada de marcado

  • Acción: Generar tonada de marcado; prepararse para la entrada de dígitos.

📌 Este es el primer cambio de estado visible en el ciclo de vida de la llamada.

🔹 Tonada de marcado → Marcando (dígito(n))

  • Evento: dígito(n) (el usuario ingresa un dígito)

  • Transición: dígito(n) → Marcando

  • Estado: Entrar Marcando modo.

🔹 Transición auto: Marcando → Marcando (dígito(n))

  • Evento: dígito(n) (varios dígitos ingresados)

  • Guarda: Ninguno (siempre permitido)

  • Acción: Añadir dígito al número que se está marcando.

  • Propósito: Permitir la entrada continua de dígitos sin salir del Marcado estado.

💡 Las transiciones autónomas son esenciales para manejar secuencias de entrada como números de teléfono.


2. Lógica de conexión y manejo de excepciones

🔹 Marcado → Conectando (númeroVálido)

  • Evento: númeroVálido (número completo validado)

  • Transición: númeroVálido → Conectando

  • Acción: Iniciar la configuración de la llamada con la red.

🔹 Marcado → Mensaje grabado (númeroInválido)

  • Evento: númeroInválido (por ejemplo, longitud incorrecta, prefijo inválido)

  • Transición: númeroInválido → Mensaje grabado

  • Acción: Reproducir mensaje grabado: “El número que marcó no está en servicio.”

🔹 Conectando → Tonada de ocupado (númeroOcupado)

  • Evento: númeroOcupado

  • Transición: númeroOcupado → tonoOcupado

  • Acción: Reproducir tono de ocupado; informar al usuario que la línea está ocupada.

🔹 Conectando → tonoRápidoOcupado (trunkBusy)

  • Evento: trunkOcupado

  • Transición: trunkOcupado → tonoRápidoOcupado

  • Acción: Reproducir tono rápido de ocupado; indicar congestión de red.

⚠️ Nota: Estos son estados de error que interrumpen el flujo normal. Deben manejarse de forma adecuada.


3. Mecanismo de tiempo de espera y advertencia

🔹 Marcando → Advertencia (tiempo de espera)

  • Evento: tiempo de espera después de 30 segundos de inactividad

  • Transición: tiempo de espera → Advertencia

  • Acción: Reproducir pitido de advertencia; notificar al usuario que continúe o cuelgue.

🔹 Advertencia → Tiempo de espera (tiempo de espera)

  • Evento: tiempo de espera de nuevo después de 10 segundos

  • Transición: timeout → Tiempo de espera agotado

  • Acción: Cancelar el intento de llamada; volver a Ocupado.

⏱️ La lógica de tiempo de espera evita la espera indefinida y mejora la experiencia del usuario.


4. Llamada activa y desconexión

🔹 Conectando → Sonando (enrutado)

  • Evento: enrutado (la red enruta correctamente la llamada)

  • Transición: enrutado → Sonando

  • Acción: Enviar señal de sonido a la parte llamada.

🔹 Sonando → Conectado (la llamada fue contestada)

  • Evento: la llamada fue contestada

  • Transición: la llamada fue contestada → Conectado

  • Acción: Establecer conexión de audio; iniciar grabación de llamada (si está habilitada).

🔹 Conectado → Desconectado (colgado o la llamada finalizó)

  • Dos caminos para la desconexión:

    1. El usuario cuelga: colgado → Desconectado

    2. La otra parte cuelga: calledPhoneHangsUp → Desconectado

🔄 Ambas transiciones conducen a Desconectado antes de alcanzar Estado final.

🔹 Desconectado → Estado final

  • Evento: Ninguno (implícito o mediante una acción de limpieza)

  • Transición: Desconectado → Final

  • Acción: Limpiar recursos, registrar la duración de la llamada, actualizar estadísticas.

✅ El Estado final indica el final del ciclo de vida de la llamada.


🎨 Principios de diseño visual para claridad

Para hacer que las máquinas de estado complejas sean legibles y mantenibles:

Principio Implementación
Camino principal feliz Mantenga el flujo principal (Inactivo → Tonos de marcado → Marcando → Conectando → Sonando → Conectado) como una línea limpia vertical o horizontal.
Saque ramas hacia afuera para excepciones Coloque los estados de error (Tonos de ocupado, Tonos de ocupado rápido, Mensaje grabado) como ramas laterales.
Agrupe estados relacionados Use estados compuestos para condiciones de error (ver más abajo).
Use los estados pseudo con sabiduría Inicial y Final debe marcarse claramente.
Evite transiciones cruzadas Evite que las flechas se solapen; use regiones ortogonales si es necesario.

🔧 Técnicas avanzadas de modelado

✅ Estado compuesto: Agrupación de “Error”

En lugar de listar BusyToneFastBusyTone, y RecordedMessage como estados separados, agrúpelos bajo un estado compuesto llamado Error:

[Error] 
├── BusyTone
├── FastBusyTone
└── MensajeGrabado
  • Acción de entrada: Reproduzca tono de error o mensaje.

  • Acción de salida: Volver a DialTone o Ocupado después de la respuesta del usuario.

✅ Beneficio:Reduce el desorden visual y mejora la escalabilidad.


✅ Condiciones de guardia (mejoras opcionales)

Agregue condiciones de guardia para refinar las transiciones:

dígito(n) [number.length < 15] → Marcando
número válido [number.isInternational] → Conectando

🛠️ Las condiciones de guardia evitan transiciones inválidas y apoyan la lógica condicional.


📌 Conclusiones clave: mejores prácticas para máquinas de estado complejas

Práctica ¿Por qué importa
Modelar caminos desfavorables Los sistemas reales fallan. Diseñar para número inválidotiempo de espera agotadotroncal ocupada garantiza la confiabilidad.
Use expresiones de acción Incluya / registrarIntentoDeLlamada() o / reproducirTonada() para mostrar efectos secundarios.
Mantenga los eventos descriptivos y orientados a acciones Use colgadoenrutadoel teléfono llamado respondeen lugar dee1e2.
Nombra los estados claramente EvitaEstado1Estado2. UsaMarcandoSonandoConectado.
Documenta las suposiciones Por ejemplo, «Tiempo de espera después de 30 segundos de inactividad» debe indicarse en los comentarios.

💻 Generación de código: PlantUML y Mermaid

Aquí tienesbloques de código listos para usarpara generar este diagrama en el formato preferido.


✅ Código PlantUML

@startuml

[*] –> Inactivo
Inactivo –> TonosDeMarcado : descolgado
TonosDeMarcado –> Marcando : dígito(n)
Marcando –> Marcando : dígito(n) ‘ Transición auto
Marcando –> Conectando : númeroVálido
Marcando –> MensajeGrabado : númeroInválido
Marcando –> Advertencia : tiempo de espera agotado
Advertencia –> Tiempo de espera : tiempo de espera agotado
Conectando –> Sonando : redirigido
Conectando –> TonosOcupado : númeroOcupado
Conectando –> TonosOcupadoRápido : troncalOcupado
Sonando –> Conectado : teléfonoLlamadoContesta
Conectado –> Desconectado : colgado
Conectado –> Desconectado : teléfonoLlamadoCuelga
Desconectado –> [*] : limpiar

estado “Error” como ErrorState {
estado “TonosOcupado” como TonosOcupado
estado “TonosOcupadoRápido” como TonosOcupadoRápido
estado “MensajeGrabado” como MensajeGrabado
}

‘ Acciones internas
Inactivo : entrada / Esperar liberación
TonoMarcado : entrada / Reproducir tono de marcado
Marcando : entrada / Recopilar dígitos
Conectando : entrada / Enrutar llamada
Sonando : entrada / Sonar teléfono remoto
Conectado : entrada / Establecer sesión de llamada
Desconectado : entrada / Terminar sesión

@enduml

📥 Cómo usar: Pegar en PlantUML en vivo o su complemento de IDE.


✅ Código Mermaid

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

    DialTone --> Dialing : dígito(n)
    Dialing --> Dialing : dígito(n)  ' Transición auto
    Dialing --> Connecting : númeroVálido
    Dialing --> RecordedMessage : númeroInválido
    Dialing --> Warning : tiempoAgotado

    Warning --> Timeout : tiempoAgotado

    Connecting --> Ringing : enrutado
    Connecting --> BusyTone : númeroOcupado
    Connecting --> FastBusyTone : troncalOcupado

    Ringing --> Connected : teléfonoLlamadoContestó
    Connected --> Disconnected : offHook
    Connected --> Disconnected : teléfonoLlamadoColgó

    Disconnected --> [*] : limpieza

    state Error {
        BusyTone
        FastBusyTone
        RecordedMessage
    }

    Connecting --> BusyTone : númeroOcupado
    Connecting --> FastBusyTone : troncalOcupado
    Dialing --> RecordedMessage : númeroInválido

    note right of BusyTone
        Reproducir tono de ocupado estándar
    end note

    note right of FastBusyTone
        Reproducir tono de ocupado rápido (congestión de red)
    end note

    note right of RecordedMessage
        Reproducir mensaje grabado: "Número no en servicio."
    end note

    note right of Timeout
        Intento de llamada cancelado después de 40 segundos
    end note

📥 Cómo usar: Pegue en Editor en vivo de Mermaid o herramientas de Markdown compatibles (VS Code, Obsidian, etc.).


📚 Resumen y reflexiones finales

Este Sistema de control de llamadas telefónicas máquina de estados es un ejemplo del mundo real de cómo UML puede modelar sistemas complejos y basados en eventos con alta confiabilidad.

✅ Lo que hace efectivo este diagrama:

  • Claro camino feliz con un flujo lógico.

  • Comprehensive manejo de errores.

  • Uso de transiciones autoestados compuestos, y condiciones.

  • Claridad visual mediante agrupación y anotación.

🛠️ ¿Cuándo usar este patrón?

  • Sistemas de telefonía

  • Control de dispositivos IoT

  • Gestión de sesiones de usuario

  • Motores de flujo de trabajo

  • Sistemas embebidos con lógica de estado finito


📝 ¿Quieres ampliar esto?

Considera agregar:

  • Grabación de llamadas estado (con iniciarGrabacióndetenerGrabación eventos)

  • Reenvío de llamadas lógica (enrutamiento condicional)

  • Espera de llamadas soporte (estados paralelos)

  • Transferencia de llamadas como un subestado de Conectado

  • Historial de estado (historial superficial/profundo) para reingreso tras una interrupción


📌 Recomendación final

Modela siempre ambos caminos: éxito y fallo.
Una máquina de estados que solo maneja los «caminos felices» es incompleta y propensa a errores en producción.

Utiliza esta guía como un modelo para modelar cualquier sistema en tiempo real donde transiciones de estadoeventos, y resiliencia ante errores importa.


✅ ¿Listo para generar, visualizar o ampliar?
👉 Copie el PlantUML o Mermaid código anterior e intégrelo en su documentación, diagramas de arquitectura o documentos de diseño de sistemas.

Hágamelo saber si desea una versión PDFdiagrama interactivo, o integración en un modelo de sistema más grande (por ejemplo, con diagramas de componentes o diagramas de secuencia)!


📘 “Las mejores sistemas no son solo correctos: anticipan los fallos.”
— Diseñando con máquinas de estado UML