Guía completa: Modelado de un sistema de control de llamadas telefónicas utilizando máquinas de estados 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 estados 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 estados 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 TonoOcupadoTonoOcupadoRápidoMensajeGrabado).
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: Ingresar 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 internas 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 de ocupado rápido; 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; regresar 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 (el teléfono llamado responde)

  • Evento: el teléfono llamado responde
  • Transición: el teléfono llamado responde → Conectado
  • Acción: Establecer conexión de audio; iniciar grabación de llamada (si está habilitada).

🔹 Conectado → Desconectado (colgar OR el teléfono llamado cuelga)

  • Dos caminos para la desconexión:
    1. El usuario cuelga: colgar → 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 feliz central Mantenga el flujo principal (Inactivo → Tonos de marcado → Marcando → Conectando → Sonando → Conectado) como una línea limpia vertical o horizontal.
Ramificar hacia afuera para excepciones Coloque los estados de error (Tonos de ocupado, Tonos de ocupado rápido, Mensaje grabado) como ramas laterales.
Agrupar 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 MensajeGrabado 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 / reproducirTonos() 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

[*] --> Idle
Idle --> DialTone : onHook
DialTone --> Dialing : digit(n)
Dialing --> Dialing : digit(n) ' Transición interna
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éfonoLlamadoContesta
Connected --> Disconnected : onHook
Connected --> Disconnected : teléfonoLlamadoColgó
Disconnected --> [*] : limpiar

state "Error" as ErrorState {
state "BusyTone" as BusyTone
state "FastBusyTone" as FastBusyTone
state "RecordedMessage" as RecordedMessage
}

' Acciones internas
Idle : entry / Esperar descolgado
DialTone : entry / Reproducir tono de marcado
Dialing : entry / Recopilar dígitos
Connecting : entry / Enrutamiento de llamada
Ringing : entry / Sonar teléfono remoto
Connected : entry / Establecer sesión de llamada
Disconnected : entry / Terminar sesión

@enduml

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


✅ Código Mermaid

diagramaEstado-v2
    [*] --> Idle
    Idle --> ToneDeMarcado : onHook

    ToneDeMarcado --> Marcando : digito(n)
    Marcando --> Marcando : digito(n)  ' Transición auto
    Marcando --> Conectando : numeroValido
    Marcando --> MensajeGrabado : numeroInvalido
    Marcando --> Advertencia : tiempoAgotado

    Advertencia --> TiempoAgotado : tiempoAgotado

    Conectando --> Sonando : enrutado
    Conectando --> TonodeOcupado : numeroOcupado
    Conectando --> TonodeOcupadoRapido : troncalOcupado

    Sonando --> Conectado : telefonoLlamadoContesto
    Conectado --> Desconectado : onHook
    Conectado --> Desconectado : telefonoLlamadoColgo

    Desconectado --> [*] : limpiar

    estado Error {
        TonodeOcupado
        TonodeOcupadoRapido
        MensajeGrabado
    }

    Conectando --> TonodeOcupado : numeroOcupado
    Conectando --> TonodeOcupadoRapido : troncalOcupado
    Marcando --> MensajeGrabado : numeroInvalido

    nota a la derecha de TonodeOcupado
        Reproducir tono de ocupado estándar
    fin nota

    nota a la derecha de TonodeOcupadoRapido
        Reproducir tono de ocupado rápido (congestión de red)
    fin nota

    nota a la derecha de MensajeGrabado
        Reproducir mensaje grabado: "Número no en servicio."
    fin nota

    nota a la derecha de TiempoAgotado
        Intento de llamada cancelado después de 40 segundos
    fin nota

📥 Cómo usar: Pegar 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 guardas.
  • 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 (histórico superficial/profundo) para reingreso tras una interrupción

📌 Recomendación final

Siempre modela tanto las rutas de éxito como las de fracaso.
Una máquina de estados que solo maneja las “rutas 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 tengan importancia.


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

Avísame si deseas una versión PDFdiagrama interactivo, o integración en un modelo de sistema más grande (por ejemplo, con componentes o diagramas de secuencia)!


📘 “Los mejores sistemas no son solo correctos: anticipan el fracaso.”
— Diseño con máquinas de estado UML