Saltar al contenido principal

Sh RepositoryData (Datos Transparentes)

OmniHSS actúa como un repositorio transparente para los datos de servicio que los Servidores de Aplicaciones (AS) almacenan contra un suscriptor a través de la interfaz Sh. Documentos como MMTEL-Services (servicios suplementarios / desvío de llamadas, espera de llamadas, OIP/OIR, restricción) y IMS-ODB-Information (restricción determinada por el operador) son escritos por el AS, mantenidos por el HSS y leídos a demanda.

"Transparente" tiene un significado preciso en 3GPP TS 29.328: el HSS entiende estos datos sintácticamente pero no semánticamente. Es XML opaco propiedad del AS. OmniHSS almacena y devuelve la carga útil ServiceData byte por byte. Nunca vuelve a analizar ni a serializar la carga útil. Un documento que un AS etiqueta o suma de verificación (por ejemplo XCAP/MMTel) se devuelve exactamente como fue escrito.

Los mismos documentos también pueden ser gestionados fuera de banda por sistemas de aprovisionamiento/CRM a través de la API de Aprovisionamiento REST.

Tabla de Contenidos​

Conceptos​

Un suscriptor puede tener cualquier número de documentos transparentes independientes, cada uno identificado por una Service-Indication (el "nombre del archivo"). Un documento tiene tres partes:

ElementoPropietarioSignificado
Service-IndicationGestionado por HSSNombra el documento (por ejemplo, MMTEL-Services, IMS-ODB-Information).
SequenceNumberGestionado por HSSContador de versión utilizado para concurrencia optimista. Ver SequenceNumber y Concurrencia.
ServiceDataPropiedad del AS (opaco)La carga útil XML en sí. Almacenada y devuelta textualmente.

El HSS solo interpreta Service-Indication y SequenceNumber. El cuerpo ServiceData se trata como bytes opacos.

Modelo de Datos​

Todos los documentos transparentes de un suscriptor se mantienen en un solo campo, subscriber_state.sh_repository_data, como un objeto JSON indexado por Service-Indication. Cada entrada almacena la versión y la carga útil textual:

{
"MMTEL-Services": { "sequence_number": "0", "service_data": "<MMTelServices …>…</MMTelServices>" },
"IMS-ODB-Information": { "sequence_number": "1", "service_data": "<OdbForImsOrientedServices xmlns=\"odb.mmtel.omnitou.ch\"/>" }
}
CampoDescripción
sequence_numberLa versión actual de este documento, según lo aceptado por última vez por el HSS. Devuelto en cada UDA y utilizado para validar actualizaciones.
service_dataEl cuerpo XML opaco, almacenado exactamente como lo envió el AS (sin normalización de espacio de nombres, orden de atributos o espacios en blanco). Un documento sin elemento ServiceData (los datos de repositorio vacíos de la especificación) omite este campo.

Este modelo significa que un solo suscriptor puede tener muchos documentos distintos, cada uno versionado de forma independiente, sin un esquema fijo impuesto por el HSS.

Flujos de Mensajes Sh​

RepositoryData se transporta en el AVP User-Data como un documento XML Sh-Data. RepositoryData se selecciona con valor Data-Reference 0. Un AVP Service-Indication opcional restringe una solicitud a un solo documento.

Solicitud de Datos de Usuario (UDR/UDA): Leer​

El AS lee uno o todos los documentos transparentes. Con un Service-Indication, solo se devuelve el documento correspondiente; sin uno, se devuelven todos los documentos almacenados, cada uno como su propio elemento <RepositoryData>.

Un suscriptor desconocido o no IMS recibe Experimental-Result 5001 (DIAMETER_ERROR_USER_UNKNOWN).

Solicitud de Actualización de Perfil (PUR/PUA): Escribir​

El AS crea o actualiza un solo documento. La carga útil ServiceData se almacena textualmente. La actualización se acepta solo si su SequenceNumber es válido (ver más abajo).

Cuando un PUR se resuelve a múltiples suscriptores (una Identidad Pública con comodín), la actualización se aplica de forma atómica: si algún documento está fuera de sincronización, ninguno se persiste.

Solicitud de Notificaciones de Suscripción (SNR/SNA): Suscribirse​

El AS se suscribe a los datos de un suscriptor y puede solicitar que se devuelva el valor actual de inmediato (Send-Data-Indication). OmniHSS responde al SNR y, cuando se solicita, incluye el RepositoryData actual.

SequenceNumber y Concurrencia​

El SequenceNumber proporciona control de concurrencia optimista para que dos Servidores de Aplicaciones no puedan sobrescribirse silenciosamente entre sí, según 3GPP TS 29.328.

  • Crear un nuevo documento utiliza SequenceNumber 0 (el valor 0 está reservado exclusivamente para datos recién añadidos).
  • Actualizar un documento existente debe llevar el sucesor inmediato del SequenceNumber almacenado (almacenado + 1).
  • El contador envuelve de 65535 de vuelta a 1 (no a 0, ya que 0 está reservado).
  • Una actualización cuyo SequenceNumber no es el sucesor esperado se rechaza con Experimental-Result 5105 (DIAMETER_ERROR_TRANSPARENT_DATA_OUT_OF_SYNC) y el documento almacenado queda sin cambios.

Ejemplo: un documento se almacena en SequenceNumber 0. Un PUR con SequenceNumber 5 es rechazado con 5105 y nada cambia. Un PUR con SequenceNumber 1 es aceptado y el documento avanza a la versión 1.

API de Aprovisionamiento REST​

Los mismos documentos pueden ser leídos y escritos directamente por sistemas de aprovisionamiento/CRM. El suscriptor se dirige por IMSI en la ruta; el documento se identifica por service_indication (en el cuerpo de la solicitud para actualizaciones, o la cadena de consulta para lecturas/eliminaciones). El opaco service_data se envía byte por byte, exactamente como a través de Sh.

Todas las respuestas utilizan el sobre estándar de la API:

{ "status": "success", "response": { } }

A diferencia de la ruta Sh, la API REST es un acceso de aprovisionamiento autoritativo y no aplica la verificación de desincronización del SequenceNumber. Una escritura establece el documento directamente.

Listar Todos los Documentos​

Devuelve todos los documentos almacenados para el suscriptor.

Endpoint: GET /api/subscriber/repository_data/:imsi

curl -k https://hss.example.com:8443/api/subscriber/repository_data/001001123456789
{
"status": "success",
"response": {
"MMTEL-Services": { "sequence_number": "0", "service_data": "<MMTelServices …/>" },
"IMS-ODB-Information": { "sequence_number": "1", "service_data": "<OdbForImsOrientedServices xmlns=\"odb.mmtel.omnitou.ch\"/>" }
}
}

Obtener un Solo Documento​

Devuelve un documento por Service-Indication.

Endpoint: GET /api/subscriber/repository_data/:imsi?service_indication=:service_indication

curl -k "https://hss.example.com:8443/api/subscriber/repository_data/001001123456789?service_indication=MMTEL-Services"
{
"status": "success",
"response": { "sequence_number": "0", "service_data": "<MMTelServices …/>" }
}

Crear o Actualizar un Documento​

Crea el documento si está ausente, o lo sobrescribe.

Endpoint: PUT /api/subscriber/repository_data/:imsi

curl -k -X PUT https://hss.example.com:8443/api/subscriber/repository_data/001001123456789 \
-H "Content-Type: application/json" \
-d '{
"service_indication": "MMTEL-Services",
"service_data": "<MMTelServices version=\"1\"/>",
"sequence_number": "0"
}'
CampoTipoRequeridoPor DefectoDescripción
service_indicationCadenaSí-El nombre del documento a crear/actualizar (por ejemplo, MMTEL-Services).
service_dataCadenaNo-La carga útil XML opaca, almacenada textualmente. Omitir para almacenar un documento vacío (solo Service-Indication y SequenceNumber).
sequence_numberCadenaNo0La versión a registrar para el documento.

La respuesta refleja el documento almacenado:

{
"status": "success",
"response": { "sequence_number": "0", "service_data": "<MMTelServices version=\"1\"/>" }
}

Eliminar un Documento​

Elimina un solo documento por Service-Indication.

Endpoint: DELETE /api/subscriber/repository_data/:imsi

curl -k -X DELETE https://hss.example.com:8443/api/subscriber/repository_data/001001123456789 \
-H "Content-Type: application/json" \
-d '{ "service_indication": "MMTEL-Services" }'
CampoTipoRequeridoPor DefectoDescripción
service_indicationCadenaSí-El documento a eliminar.

La respuesta devuelve los documentos restantes para el suscriptor.

Tablas de Referencia​

Valores de Data-Reference (RepositoryData)​

ValorNombreDescripciónReferencia
0RepositoryDataDatos de servicio transparentes identificados por Service-Indication3GPP TS 29.328 §7.6

Códigos de Resultado y Experimental-Result​

CódigoNombreSignificadoReferencia
2001DIAMETER_SUCCESSUDR/PUR/SNR procesados con éxitoRFC 6733 §7.1.1
5001DIAMETER_ERROR_USER_UNKNOWNSuscriptor no encontrado o no habilitado para IMS3GPP TS 29.329
5105DIAMETER_ERROR_TRANSPARENT_DATA_OUT_OF_SYNCEl SequenceNumber de actualización no es el sucesor del valor almacenado3GPP TS 29.329

ID de Aplicación​

IDInterfazDescripciónReferencia
16777217ShAS ↔ HSS datos de usuario3GPP TS 29.329

Indicaciones de Servicio Comunes​

Service-IndicationContenido Típico
MMTEL-ServicesServicios suplementarios MMTel (desvío de llamadas, espera/suspensión de comunicación, OIP/OIR, conferencias): XML simservs
IMS-ODB-InformationInformación de restricción determinada por el operador para servicios orientados a IMS

Los valores de Service-Indication son definidos por el Servidor de Aplicaciones y su correspondiente esquema XML; el HSS no impone ninguna lista fija.

Resolución de Problemas​

El Servidor de Aplicaciones recibe 5105 en la actualización​

Síntomas: Un PUR es respondido con Experimental-Result 5105 y el documento no cambia.

Causas posibles:

  • El AS envió un SequenceNumber que no es el sucesor inmediato del valor almacenado en el HSS (su copia en caché está obsoleta).
  • Una actualización concurrente de otro AS avanzó el SequenceNumber.

Resolución:

  1. Lee el documento actual con un UDR para obtener el SequenceNumber actualizado.
  2. Re-emite el PUR con SequenceNumber = almacenado + 1.
  3. Para forzar un valor administrativamente, configúralo a través de la API REST, que no aplica la verificación de concurrencia.

ServiceData devuelto difiere de lo que fue escrito​

Síntomas: El AS cree que la carga útil fue alterada por el HSS.

Causas posibles:

  • Esto no debería ocurrir. OmniHSS almacena y devuelve ServiceData byte por byte. Las diferencias aparentes generalmente provienen de la propia biblioteca XML del AS que re-serializa el documento (cambiando los prefijos de espacio de nombres, el orden de los atributos o los espacios en blanco) antes de la comparación.

Resolución:

  1. Compara los bytes en bruto devueltos en la respuesta UDA/REST contra los bytes en bruto enviados, no una representación reanalizada.
  2. Confirma que el AS no está normalizando el XML en su lado antes de la comparación.

Documento no encontrado a través de REST​

Síntomas: GET …/repository_data/:imsi?service_indication=… devuelve un error.

Causas posibles:

  • No hay documento con esa Service-Indication almacenado para el suscriptor.
  • El IMSI no corresponde a un suscriptor existente.

Resolución:

  1. Lista todos los documentos con GET /api/subscriber/repository_data/:imsi para ver qué está almacenado.
  2. Verifica el IMSI con Obtener Suscriptor por IMSI.