Centro MMS (MMSc)
← Volver al Índice de Documentación | Referencia de Configuración | Referencia de API
Descripción General
OmniMessage incluye un Centro MMS (MMSc) que maneja la recepción, almacenamiento y notificación de entrega de mensajes multimedia. El MMSc soporta las dos interfaces principales de interconexión MMS definidas por 3GPP TS 23.140: MM1 para comunicación directa con el dispositivo y MM4 para retransmisión entre operadores.
Cuando un suscriptor envía o recibe un MMS, el MMSc almacena el contenido del mensaje localmente e inyecta un SMS de notificación MMS en la cola de mensajes de OmniMessage a través de la API REST estándar. El dispositivo receptor recupera el MMS haciendo un HTTP GET directamente al MMSc.
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 | Especificación de codificación binaria WAP MM1 |
Arquitectura
El MMSc se sitúa junto a OmniMessage y se comunica exclusivamente a través de la API REST. No hay acceso directo a la base de datos del almacenamiento de mensajes.
Flujo de Entrega de MMS
Entrega En Red (MM1)
Un suscriptor envía un MMS a otro suscriptor en la misma red.
Entrega Fuera de Red (MM4)
Un suscriptor envía un MMS a un suscriptor en un operador diferente.
MM4 Entrante (desde el Operador Peer)
Un suscriptor en otra red envía un MMS a un suscriptor en red.
SMS de Notificación MMS
El SMS de Notificación MMS es un SMS binario (DCS 0x44, datos de 8 bits) que contiene un PDU m-notification-ind codificado en WSP. Se divide en segmentos de 64 bytes, cada uno envuelto con un UDH de SMS concatenado, y se envía a OmniMessage como mensajes individuales a través de POST /api/messages.
La carga útil de notificación codifica la ubicación del contenido MMS como una URL HTTP que apunta al MMSc:
http://<mmsc.mms_domain>/<mms_message_id>.00
El dispositivo receptor utiliza esta URL para recuperar el MMS directamente del MMSc a través de MM1.
Determinación de En/Fuera de Red
El MMSc utiliza DNS ENUM (búsquedas NAPTR) para determinar si un suscriptor de destino está en red o fuera de red antes de decidir si enviar un SMS de Notificación MMS o retransmitir a través de MM4.
| Resultado | Acción |
|---|---|
El registro NAPTR coincide con una entrada enum_routing configurada con on_net: true | MMS almacenado localmente; SMS de notificación inyectado en la cola de OmniMessage |
El registro NAPTR coincide con una entrada con on_net: false | MMS almacenado localmente; reenviado a peer a través de retransmisión SMTP MM4 |
| No hay registro NAPTR o tiempo de espera de ENUM | Tratado como fuera de red; se intenta la retransmisión MM4 |
Configuración
El MMSc se configura a través de MMSc/config.yaml.
Ejemplo de Configuración
log_prefix: 'MMSc'
smsc_api:
url: 'https://10.4.10.215:8443'
mmsc:
host: 0.0.0.0
port: 8080
location: 'mmsc01.mnc001.mcc001.3gppnetwork.org'
mms_domain: "mms.example.com"
remote_mmsc_ip:
- 10.101.2.150
mm4_peers:
sinch:
- mm4_destination_host: mm4.sinch.com
mm4_destination_port: 25
mms_domain: mms1.mmsnni.carrier.net
database:
mysql:
server: 127.0.0.1
username: mmsc
password: changeme
database: mmsc
ping_before_query: true
prometheus:
listen_port: 8083
number_routing:
enum_domain: e164.arpa
enum_timeout_seconds: 1
enum_servers:
- 10.4.10.80
enum_routing:
- domain: 'mobile.example.local'
operator: 'ExampleMNO'
on_net: true
next_hop: 'internal'
destination_rewriting:
- regex_match: "^1(\d{10}$)"
regex_replace: "\1"
description: Eliminar el 1 inicial de un número NANP de 11 dígitos
default_route_mm4: 'sinch'
Parámetros de smsc_api
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
url | Cadena | Sí | — | URL base de la API REST de OmniMessage. Se utiliza para enviar mensajes SMS de Notificación MMS. |
api_key | Cadena | No | — | Token Bearer para autenticación de API, si es necesario. Omitir si la API no tiene autenticación configurada. |
hss_url | Cadena | No | — | URL base de una API HSS/PCRF para resolver direcciones IP de clientes a MSISDN en la interfaz MM1. Cuando se omite, la resolución de IP a MSISDN no está disponible y las solicitudes de IPs no locales serán rechazadas. |
Parámetros de mmsc
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
host | Cadena | No | 0.0.0.0 | Dirección de interfaz para vincular el servidor HTTP MM1. |
port | Entero | No | 8080 | Puerto TCP para el servidor HTTP MM1. |
location | Cadena | Sí | — | Cadena de identidad del nodo para este MMSc, utilizada como source_mmsc registrado contra los mensajes entregados. |
mms_domain | Cadena | Sí | — | Nombre de dominio de este MMSc. Codificado en la URL de ubicación del contenido MMS enviada en los mensajes de Notificación SMS (por ejemplo, mms.example.com). |
remote_mmsc_ip | Lista | No | [] | Direcciones IP de MMScs pares. Las solicitudes de estas IPs en el punto de recuperación no se reenvían recursivamente, evitando bucles. También se utilizan como fuentes de respaldo en un fallo de caché local. |
mm4_peers | Mapa | No | — | Grupos nombrados de destinos de retransmisión MM4. Cada clave es un nombre de grupo par; cada entrada es una lista de definiciones de puntos finales SMTP. Ver Parámetros de Peer MM4 a continuación. |
Parámetros de Peer MM4
Cada entrada bajo mmsc.mm4_peers.<nombre> es una lista. Cuando hay múltiples entradas presentes, se selecciona una al azar por intento de retransmisión.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
mm4_destination_host | Cadena | Sí | Nombre de host o IP del servidor SMTP MM4 del operador par. |
mm4_destination_port | Entero | Sí | Puerto SMTP en el MMSc par. Típicamente 25. |
mms_domain | Cadena | Sí | Dominio MMS del operador par. Utilizado en encabezados To de SMTP y direccionamiento de mensajes. |
Parámetros de database.mysql
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
server | Cadena | Sí | — | Nombre de host o IP del servidor MySQL. |
username | Cadena | Sí | — | Nombre de usuario de la base de datos. |
password | Cadena | Sí | — | Contraseña de la base de datos. |
database | Cadena | Sí | — | Nombre de la base de datos. Debe coincidir con el esquema creado desde MMSc/schema.sql. |
ping_before_query | Booleano | No | false | Reconectar a MySQL antes de cada consulta. Recomendado para procesos de larga duración para recuperarse de tiempos de espera de conexión del lado del servidor. |
Parámetros de number_routing
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
enum_domain | Cadena | Sí | — | Zona raíz DNS para búsquedas NAPTR ENUM (por ejemplo, e164.arpa). |
enum_timeout_seconds | Entero | No | 1 | Tiempo de espera de consulta DNS en segundos. Establecer en 0 para deshabilitar ENUM y tratar todos los destinos como fuera de red. |
enum_servers | Lista | No | DNS del sistema | Direcciones de resolutores DNS a utilizar para consultas ENUM. |
enum_routing | Lista | No | — | Lista ordenada de asignaciones de dominio a ruta NAPTR. Ver Parámetros de Enrutamiento ENUM a continuación. |
destination_rewriting | Lista | No | — | Lista ordenada de reglas de reescritura regex aplicadas a MSISDNs de destino antes de la búsqueda ENUM y la retransmisión MM4. La primera regla que coincida gana. |
default_route_mm4 | Cadena | Sí | — | Clave del grupo par MM4 (de mmsc.mm4_peers) a utilizar cuando no se aplica ninguna otra ruta. |
Parámetros de Enrutamiento ENUM
| Parámetro | Tipo | Descripción |
|---|---|---|
domain | Cadena | Cadena de dominio de reemplazo NAPTR para coincidir (coincidencia de subcadena). |
operator | Cadena | Nombre del operador legible por humanos para registro. |
on_net | Booleano | true — el suscriptor está en red; inyectar SMS de notificación. false — retransmitir a través de MM4. |
next_hop | Cadena | Opcional. Etiqueta informativa registrada en los registros; no utilizada para el enrutamiento. |
Parámetros de prometheus
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
listen_port | Entero | No | 8083 | Puerto en el que se exponen las métricas de Prometheus. Elegir un puerto que no entre en conflicto con el puerto de métricas del núcleo de OmniMessage (predeterminado 9568). |
Esquema de Base de Datos
El MMSc mantiene su propia base de datos MySQL para metadatos de MMS y estado de entrega. El esquema está definido en MMSc/schema.sql y consiste en una sola tabla.
cola_mms_message
| Columna | Tipo | Descripción |
|---|---|---|
id | INT UNSIGNED | Clave primaria autoincremental. |
unique_id | VARCHAR(64) | Identificador de mensaje asignado por el MMSc. También se utiliza como segmento de ruta de URL de recuperación. |
send_time | DATETIME | Marca de tiempo cuando el MMS fue recibido por este MMSc. |
expires | DATETIME | Tiempo de expiración del mensaje, después del cual no será entregado. |
source_msisdn | VARCHAR(32) | MSISDN del suscriptor que envía. |
destination_msisdn_unique | VARCHAR(32) | MSISDN del destinatario principal. |
mms_destinatination_msisdn_list | TEXT | Lista separada por comas de todos los MSISDNs de destinatarios (para MMS grupales). |
mms_subject | VARCHAR(255) | Línea de asunto del MMS. |
mms_file_path | VARCHAR(512) | Ruta al archivo de contenido MMS almacenado (stored_mms/<id>.mms). |
source_mmsc | VARCHAR(128) | Identidad del MMSc o par MM4 que originó el mensaje. |
dest_mmsc | VARCHAR(128) | Establecido en MM4_<peer> después de la retransmisión MM4 saliente, o a la ubicación del MMSc de recuperación después de la entrega local. |
mms_notify_time | DATETIME | Marca de tiempo cuando el SMS de Notificación MMS fue enviado a OmniMessage. |
mms_retrive_time | DATETIME | Marca de tiempo cuando el suscriptor recuperó el MMS. |
Procesos
El MMSc se ejecuta como dos procesos independientes.
Frontend HTTP MM1
Maneja las presentaciones de MMS WAP (m-send-req) y recuperaciones (GET /<id>) desde los dispositivos. Ejecutar a través de gunicorn:
gunicorn --bind 0.0.0.0:8080 MMSc:app
El frontend MM1 debe estar detrás de un proxy inverso (nginx, HAProxy) para la terminación TLS. Los dispositivos típicamente se conectan al APN del MMSc utilizando la configuración de proxy MMS del operador.
Servidor SMTP MM4
Escucha mensajes entrantes MM4_forward.REQ de MMScs de operadores pares. Ejecutar directamente:
python smtp_server.py
El puerto 25 requiere privilegios de root o CAP_NET_BIND_SERVICE. La retransmisión MM4 saliente utiliza smtplib integrado de Python y no requiere un MTA separado.
Métricas
El MMSc expone métricas de Prometheus en el puerto configurado bajo prometheus.listen_port.
Operaciones de MMS
Métrica: prom_mms_operations_count_total
Tipo: Contador
Descripción: Conteo de operaciones MMS procesadas.
Etiquetas:
method— Tipo de operación:HTTP_POST,m-send-req,m-notifyresp-ind,m-acknowledge-ind,InsertMMS,GetMMS,UpdateMMS,MMS_Get,MMS_Get_Fail,SMTP_Start,SMTP_Complete
Consultas de ejemplo:
# Tasa de envío de MMS
rate(prom_mms_operations_count_total{method="m-send-req"}[5m])
# Tasa de finalización de MM4 entrante
rate(prom_mms_operations_count_total{method="SMTP_Complete"}[5m])
Tiempos de Respuesta de API
Métrica: prom_mms_api_response_time
Tipo: Histograma
Descripción: Latencia del manejador HTTP MM1 en segundos.
Etiquetas:
result— Código de estado HTTP:200,404,500function— Manejador:m-send-req,m-notifyresp-ind,m-acknowledge-ind,GET MMS,GET MMS Remoto,desconocido
Consultas de ejemplo:
# Latencia de recuperación en el percentil 95
histogram_quantile(0.95,
rate(prom_mms_api_response_time_bucket{function="GET MMS"}[5m]))
Tiempos de Retransmisión MM4
Métrica: prom_mm4_response_time
Tipo: Histograma
Descripción: Latencia de retransmisión SMTP MM4 en segundos.
Etiquetas:
result—200(éxito) o000(fallo)direction—in(entrante desde el par) oout(saliente hacia el par)peer— Nombre del grupo par MM4
Consultas de ejemplo:
# Tasa de error saliente de MM4
sum(rate(prom_mm4_response_time_count{direction="out",result="000"}[5m]))
/ sum(rate(prom_mm4_response_time_count{direction="out"}[5m]))
Tiempos de Respuesta DNS
Métrica: prom_dns_response_time
Tipo: Histograma
Descripción: Latencia de consulta DNS ENUM en segundos. Un pico aquí retrasará las decisiones de entrega de MMS.