Centro MMS (MMSc)
← Volver al Índice de Documentación | Referencia de Configuración | Referencia de API
Tabla de Contenidos
- Descripción General
- Arquitectura
- Procesamiento de Envío de Mensajes
- Flujos de Entrega
- Notificación MMS
- Determinación On/Off-Net
- Configuración
- Almacenamiento
- Comportamiento en Tiempo de Ejecución
- Observabilidad
- Solución de Problemas
Descripción General
OmniMessage incluye un Centro MMS (MMSc) nativo que recibe, almacena y entrega mensajes multimedia. Implementa las dos interfaces de interconexión MMS definidas por 3GPP TS 23.140: MM1 para comunicación directa con el dispositivo (HTTP/WAP) y MM4 para reenvío entre operadores (SMTP).
El MMSc está integrado en el núcleo de OmniMessage. No se ejecuta como un servicio separado y no tiene dependencia de bases de datos externas o servidores web. Cuando un suscriptor envía o recibe un MMS, el MMSc:
- Almacena el cuerpo MMS en bruto en el sistema de archivos local y sus metadatos en Mnesia.
- Construye una notificación MMS y la envía como un SMS terminado en móvil ordinario a través de la misma tubería en proceso utilizada para cada SMS, que luego lo traduce, enruta y entrega.
- Sirve el MMS almacenado de vuelta al dispositivo que lo recupera a través de MM1 cuando obtiene la URL de notificación.
Debido a que la notificación se inyecta como un SMS normal, MMS reutiliza toda la maquinaria existente de enrutamiento, traducción y entrega de SMS sin llamadas HTTP autodirigidas.
Especificaciones Relevantes
| Especificación | Título |
|---|---|
| 3GPP TS 23.140 | Servicio de Mensajería Multimedia (MMS): descripción funcional |
| 3GPP TS 26.140 | MMS: formatos de medios y códecs |
| Protocolo de Encapsulación MMS de OMA | Codificación binaria WAP de MM1 |
Arquitectura
Las interfaces MM1 (HTTP del dispositivo) y MM4 (SMTP entre operadores) escuchan cada una en su propio puerto dedicado, separado de la API de OmniMessage. Los metadatos de MMS residen en Mnesia junto con el almacén de mensajes SMS. El MMSc mantiene los cuerpos MMS en bruto como archivos en el sistema de archivos local. El registro de metadatos solo almacena la ruta del archivo.
Procesamiento de Envío de Mensajes
Cada MMS enviado (desde un dispositivo a través de MM1, o desde un par a través de MM4) sigue el mismo camino de procesamiento: almacenar el cuerpo, almacenar metadatos, clasificar el destino, y luego notificar localmente o reenviar fuera de la red.
Flujos de Entrega
Entrega En la Red (MM1)
Un suscriptor envía un MMS a un destinatario servido por la misma red.
Entrega Fuera de la Red (MM4)
Un suscriptor envía un MMS a un destinatario en otro operador.
MM4 Entrante (de un Operador Par)
Un suscriptor en otra red envía un MMS a un suscriptor en la red.
- Entrega va a los destinatarios del sobre SMTP (
RCPT TO); los pares dirigen un sobre por cada suscriptor en la red. Solo cuando el sobre no lleva destinatario, los encabezadosTo/Ccdeciden. - Miembros del grupo:
To+Ccjuntos forman la lista de miembros almacenada enrecipient_listy listada en elm-retrieve-conf, por lo que el dispositivo mantiene un MMS grupal en su hilo de grupo. - Medios: cada parte no SMIL del árbol MIME (incluyendo multiparts anidados) se re-codifica en el cuerpo WSP almacenado. Las partes de texto se convierten de su conjunto de caracteres declarado a UTF-8.
- Un mensaje sin destinatario en el sobre o en
To/Cces rechazado con554en lugar de ser aceptado y descartado.
Notificación MMS
La notificación MMS es un SMS binario que lleva un PDU m-notification-ind codificado en WSP. Utiliza codificación de datos de 8 bits (DCS 0x44), se divide en segmentos SMS concatenados y se envía a la cola de mensajes como partes de SMS MT ordinarias a través de la tubería en proceso. Por lo tanto, todas las reglas de traducción, enrutamiento y entrega de SMS se aplican a ella sin cambios.
La ubicación de recuperación codificada en la notificación es:
http://<mms_domain>/<unique_id>.00
mms_domaines elmmsc.mms_domainconfigurado.<unique_id>.00es la clave de recuperación. El manejador MM1 elimina el sufijo.00para resolver el mensaje almacenado.
El dispositivo receptor abre esta URL a través de MM1 para obtener el MMS como un m-retrieve-conf.
Determinación On/Off-Net
Antes de que el MMSc decida si notificar localmente o reenviar a través de MM4, reutiliza la maquinaria ENUM (NAPTR) del SMS-C para clasificar el destino. Un resultado ENUM cuyo regexp/reemplazo hace referencia al ims_domain configurado determina si está en la red.
| Condición | Clasificación | Acción |
|---|---|---|
ims_domain o enum_domain no configurados | En la red (predeterminado) | Almacenar localmente e inyectar el SMS de notificación |
El resultado ENUM NAPTR hace referencia a ims_domain | En la red | Almacenar localmente e inyectar el SMS de notificación |
El resultado ENUM NAPTR no hace referencia a ims_domain | Fuera de la red | Almacenar localmente y reenviar al par a través de MM4 |
| Fallo ENUM o error de búsqueda | En la red (conservador) | Almacenar localmente e intentar la notificación |
Cuando ENUM no está configurado, todos los destinos se tratan como en la red (almacenar y notificar). El reenvío MM4 solo se intenta para destinos clasificados positivamente como fuera de la red.
Configuración
Se configura el MMSc en runtime.exs bajo la clave :mmsc de la aplicación :sms_c. Está deshabilitado por defecto. Si el bloque :mmsc está ausente, la función está completamente inactiva: el MMSc no vincula puertos ni inicia escuchadores. Por lo tanto, las implementaciones existentes no se ven afectadas hasta que lo habilite explícitamente.
Estructura de Configuración
Cada clave de configuración impulsa una parte específica del MMSc. El diagrama muestra qué claves controlan qué proceso.
Ejemplo de Configuración
# config/runtime.exs
config :sms_c, :mmsc,
# Núcleo
enabled: true,
port: 8080,
host: "0.0.0.0",
mms_domain: "mms.ejemplo.com",
message_path: "/var/lib/omnimessage/stored_mms",
notify_source_msisdn: "6675",
dead_letter_minutes: 1440,
# Clasificación on/off-net (ENUM)
enum_domain: "e164.arpa",
ims_domain: "ims.mnc001.mcc001.3gppnetwork.org",
# Resolución de suscriptor (IP del cliente MM1 a MSISDN)
subscriber_ip_api_urls: ["https://10.0.0.10:8443", "https://10.0.0.11:8443"],
pcrf_api_url: nil,
hss_api_url: nil,
# MM4 entrante/saliente (entre operadores)
mm4_enabled: false,
mm4_smtp_port: 25,
mm4_domain: "mms.ejemplo.com",
default_route_mm4: nil
Parámetros :mmsc
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
enabled | Booleano | No | false | Iniciar el escuchador MM1 y la orquestación MMSc. Cuando es false (o el bloque está ausente), el MMSc no se inicia. |
port | Entero | No | 8080 | Puerto TCP para el escuchador HTTP MM1. Separado del puerto de la API de OmniMessage. |
host | Cadena | No | 0.0.0.0 | Dirección de enlace para el escuchador HTTP MM1. Use 0.0.0.0 para todas las interfaces. |
mms_domain | Cadena | Sí (si está habilitado) | - | Host codificado en la URL de recuperación enviada en las notificaciones, y utilizado como source_mmsc en mensajes originados localmente. |
message_path | Cadena | No | /var/lib/omnimessage/stored_mms | Directorio donde se escriben los cuerpos .mms en bruto. Debe ser escribible por el servicio OmniMessage y tener capacidad para medios almacenados. |
notify_source_msisdn | Cadena | No | 6675 | Dirección de origen del SMS de notificación mostrada al destinatario. |
dead_letter_minutes | Entero | No | 1440 | Edad en minutos después de la cual un MMS almacenado no entregado se considera expirado. |
enum_domain | Cadena | No | - | Zona raíz DNS para el dip ENUM (NAPTR) on/off-net. Cuando no está configurado, todos los destinos se tratan como en la red. |
ims_domain | Cadena | No | "" | Dominio que, cuando es referenciado por un resultado ENUM, marca el destino como en la red. Cuando está vacío, todos los destinos se tratan como en la red. |
subscriber_ip_api_urls | Lista de cadenas | No | [] | URL base de la API HSS consultadas en orden con GET <base>/api/subscriber/ip/<client_ip>; el primer nodo que devuelve un MSISDN gana. Un nodo sin registro para la IP, o uno que no es alcanzable, se omite, por lo que una malla donde un enlace IP ha alcanzado solo algunos nodos aún se resuelve. Se prueba antes de pcrf_api_url/hss_api_url. |
pcrf_api_url | Cadena | No | nil | Punto final HTTP opcional que mapea una IP de cliente MM1 a un id de suscriptor. Usado cuando subscriber_ip_api_urls está vacío o no encuentra coincidencias. Sin ninguno configurado, solo localhost se resuelve (a un MSISDN de prueba fijo). |
hss_api_url | Cadena | No | nil | Punto final HTTP opcional que mapea un id de suscriptor a un MSISDN. Usado junto con pcrf_api_url. |
mm4_enabled | Booleano | No | false | Iniciar el servidor SMTP MM4 entrante. Independiente de enabled; MM1 puede ejecutarse sin MM4. |
mm4_smtp_port | Entero | No | 25 | Puerto de escucha para el servidor SMTP MM4 entrante. |
mm4_domain | Cadena | No | vuelve a mms_domain | Dominio MM4/SMTP de este MMSc, utilizado en el direccionamiento del sobre MM4 saliente. |
default_route_mm4 | Cadena | No | nil | Clave del grupo de pares MM4 (en :mmsc_mm4_peers) utilizado para el reenvío fuera de la red. Cuando no está configurado, no se puede reenviar MMS fuera de la red. |
Pares MM4
Los objetivos de reenvío MM4 saliente se configuran por separado, porque son registros estructurados de host/puerto/dominio en lugar de configuraciones escalares:
# config/runtime.exs
config :sms_c, :mmsc_mm4_peers, %{
"carrier-a" => [
%{host: "mm4.carrier-a.example.net", port: 25, mms_domain: "mms.carrier-a.example.net"}
]
}
mmsc.default_route_mm4 selecciona qué grupo de pares se utiliza. Cada grupo es una lista; cuando contiene múltiples entradas, se elige una por intento de reenvío para que la carga se distribuya entre los hosts de entrada de un par.
Parámetros de pares MM4:
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
host | Cadena | Sí | - | Nombre de host o IP SMTP del par MM4. Usado como el relay SMTP y el nombre de host HELO. |
port | Entero | No | 25 | Puerto SMTP del par MM4. |
mms_domain | Cadena | No | "" | Dominio MMS del par, utilizado para construir la dirección RCPT (+<msisdn>/TYPE=PLMN@<mms_domain>) y registrado como dest_mmsc. |
Almacenamiento
Los metadatos de MMS se almacenan en la tabla Mnesia :mms_message_queue, creada automáticamente al inicio junto con el almacén de mensajes SMS. No hay una base de datos separada que provisionar. El cuerpo MMS en bruto se almacena como un archivo .mms bajo message_path; solo su ruta se mantiene en el registro de metadatos.
Campos de mms_message_queue
| Campo | Descripción |
|---|---|
mms_id | Clave primaria entera de un contador Mnesia. |
unique_id | Identificador externo utilizado en la ruta de URL de recuperación (<unique_id>.00). |
source_msisdn | MSISDN del suscriptor que envía. |
destination_msisdn | MSISDN del destinatario principal. |
recipient_list | Lista completa de To/Cc (CSV) para MMS grupal y el retrieve-conf. |
subject | Línea de asunto del MMS. |
file_path | Ruta al cuerpo .mms almacenado bajo message_path. |
source_mmsc | Identidad del MMSc o par MM4 que originó el mensaje. |
dest_mmsc | Se establece en MM4_<peer> después del reenvío saliente, o el objetivo de entrega después de la entrega local. |
on_net | Si el MMSc clasificó el destino como en la red. |
notify_message_ids | IDs de mensajes SMS creados para la notificación (enlaces al almacén de mensajes SMS). |
send_time | Cuándo recibió este MMSc el MMS. |
notify_time | Cuándo el sistema envió el SMS de notificación. |
retrieve_time | Cuándo el suscriptor recuperó el MMS. |
expires | Tiempo de expiración después del cual el MMS no se entrega. |
status | Estado del ciclo de vida (ver abajo). |
deadletter | Se establece cuando el mensaje es marcado como carta muerta. |
inserted_at / updated_at | Tiempos de ciclo de vida del registro. |
Ciclo de Vida del Mensaje
| Estado | Significado |
|---|---|
stored | Cuerpo escrito y metadatos registrados; aún no se ha tomado ninguna acción de entrega. |
notified | SMS de notificación enviado a la tubería para un destinatario en la red. |
retrieved | El destinatario recuperó el MMS a través de MM1. |
forwarded | Reenviado a un operador par a través de MM4. |
expired | Pasó su tiempo de expiración o dead_letter_minutes sin entrega. |
failed | Error de procesamiento o entrega. |
Comportamiento en Tiempo de Ejecución
El MMSc se ejecuta como procesos supervisados dentro de la versión de OmniMessage. No se despliega ni se inicia nada por separado. El diagrama muestra qué configuración controla cada escuchador al inicio.
- El oyente HTTP MM1 solo se inicia cuando
mmsc.enabledestrue. Se vincula ammsc.host:mmsc.porty sirve las presentaciones de los teléfonos móviles (m-send-req), respuestas de notificación (m-notifyresp-ind), acuses de recibo (m-acknowledge-ind), y recuperaciones (GET /<unique_id>.00). - El servidor SMTP MM4 solo se inicia cuando tanto
mmsc.enabledcomommsc.mm4_enabledsontrue. Se vincula ammsc.mm4_smtp_porty acepta mensajesMM4_forward.REQentrantes de operadores pares. - El reenvío MM4 saliente se realiza en proceso cuando un destino se clasifica como fuera de la red; se conecta al par configurado a través de SMTP. No se requiere un agente de transferencia de correo externo.
- La creación de tablas siempre se ejecuta al inicio. Cuando el MMSc está deshabilitado, esto solo crea una tabla vacía
:mms_message_queue, lo cual es inofensivo.
Vinculación de puertos: el puerto MM4 predeterminado (25) es privilegiado. El servicio OmniMessage debe ejecutarse con la capacidad de vincular puertos bajos (CAP_NET_BIND_SERVICE) o usar un mm4_smtp_port más alto detrás de un reenvío de puerto. El oyente MM1 predetermina al puerto no privilegiado 8080.
TLS: el oyente MM1 sirve HTTP sin cifrado. Termina TLS en un proxy inverso frente a mmsc.port si se requiere cifrado para el teléfono móvil.
Observabilidad
El MMSc actualmente no emite métricas dedicadas de MMS para Prometheus. La entrega dentro de la red inyecta un SMS de notificación en la tubería estándar. Por lo tanto, las métricas normales de mensajes de OmniMessage muestran notificaciones de MMS. Estas notificaciones aparecen en la cola de mensajes y en los CDR como cualquier otro SMS. Consulta Referencia de Métricas.
Para el rastreo por mensaje, los campos status, send_time, notify_time y retrieve_time del registro de metadatos rastrean un mensaje a lo largo de su ciclo de vida.
Solución de Problemas
El MMSc No Se Inicia
Síntomas: No hay oyente MM1 en el puerto configurado; los registros de inicio muestran MMSc: DISABLED.
Causas posibles:
- El bloque
:mmscestá ausente enruntime.exs. mmsc.enabledesfalse.
Resolución:
- Agrega el bloque de configuración
:mmscy estableceenabled: true. - Reinicia el servicio y confirma que el registro de inicio informe
MMSc: ENABLEDcon el puerto y dominio esperados.
El Teléfono Móvil No Puede Recuperar el MMS
Síntomas: El SMS de notificación se entrega, pero el teléfono móvil no puede recuperar el contenido.
Causas posibles:
mms_domainno es resolvible o no es enrutable desde el APN MMS del teléfono móvil.- Un proxy inverso o firewall está bloqueando
mmsc.port. - El archivo
.mmsalmacenado falta bajomessage_path.
Resolución:
- Confirma que el host de la URL de notificación (
mms_domain) se resuelve y es accesible desde el APN MMS. - Verifica el acceso entrante a
mmsc.host:mmsc.port(y cualquier proxy que termine TLS). - Verifica el
statusdel mensaje y que el archivo.mmsexista enfile_path.
El MMS Fuera de la Red No Se Reenvía
Síntomas: El MMS a otro operador se almacena pero nunca se reenvía; el status permanece stored.
Causas posibles:
default_route_mm4no está configurado, por lo que no se selecciona ningún grupo par.- La entrada del par en
:mmsc_mm4_peerstiene el host/puerto incorrectos. - El destino fue clasificado incorrectamente como dentro de la red porque
ims_domain/enum_domainno están configurados (todo se trata como dentro de la red).
Resolución:
- Establece
default_route_mm4a una clave presente en:mmsc_mm4_peers. - Verifica el
host/portdel par y que el SMTP saliente hacia él esté permitido. - Configura
enum_domainyims_domainpara que los destinos fuera de la red se clasifiquen correctamente.
MM4 Entrante Rechazado o No Recibido
Síntomas: Un operador par no puede entregar a través de MM4.
Causas posibles:
mm4_enabledesfalse, por lo que el servidor SMTP no está en funcionamiento.- El mensaje no nombra a un destinatario en el sobre SMTP o en los encabezados
To/Cc, por lo que es rechazado con554 no_recipients. - El servicio no tiene permiso para vincular el puerto privilegiado 25.
- Un firewall está bloqueando SMTP entrante.
Resolución:
- Establece
mm4_enabled: truey reinicia. - Concede
CAP_NET_BIND_SERVICEo establece unmm4_smtp_portno privilegiado detrás de un reenvío de puerto. - Permite el tráfico entrante a
mm4_smtp_portdesde las direcciones de salida del par.
La Resolución de la Dirección del Remitente Falla
Síntomas: Las presentaciones de teléfonos móviles que no son localhost son rechazadas con un error de búsqueda de suscriptor.
Causas posibles:
- Ni
subscriber_ip_api_urlsnipcrf_api_url/hss_api_urlestán configurados, por lo que solo localhost se resuelve a un MSISDN de prueba. - Ningún nodo HSS configurado tiene una vinculación IP para el teléfono móvil (la sesión de datos del UE aún no es conocida por el HSS).
- Los puntos finales HSS/PCRF son inalcanzables o devuelven respuestas no-200.
Resolución:
- Configura
subscriber_ip_api_urlscon cada nodo HSS (o ambospcrf_api_urlyhss_api_url) para la resolución de remitentes en producción. - Verifica que los puntos finales sean accesibles y devuelvan el mapeo esperado de suscriptor/MSISDN.