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
- Modelo de Datos
- Flujos de Mensajes Sh
- SequenceNumber y Concurrencia
- API de Aprovisionamiento REST
- Tablas de Referencia
- Resolución de Problemas
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:
| Elemento | Propietario | Significado |
|---|---|---|
| Service-Indication | Gestionado por HSS | Nombra el documento (por ejemplo, MMTEL-Services, IMS-ODB-Information). |
| SequenceNumber | Gestionado por HSS | Contador de versión utilizado para concurrencia optimista. Ver SequenceNumber y Concurrencia. |
| ServiceData | Propiedad 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\"/>" }
}
| Campo | Descripción |
|---|---|
sequence_number | La 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_data | El 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
0está 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"
}'
| Campo | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
service_indication | Cadena | Sí | - | El nombre del documento a crear/actualizar (por ejemplo, MMTEL-Services). |
service_data | Cadena | No | - | La carga útil XML opaca, almacenada textualmente. Omitir para almacenar un documento vacío (solo Service-Indication y SequenceNumber). |
sequence_number | Cadena | No | 0 | La 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" }'
| Campo | Tipo | Requerido | Por Defecto | Descripción |
|---|---|---|---|---|
service_indication | Cadena | Sí | - | El documento a eliminar. |
La respuesta devuelve los documentos restantes para el suscriptor.
Tablas de Referencia
Valores de Data-Reference (RepositoryData)
| Valor | Nombre | Descripción | Referencia |
|---|---|---|---|
| 0 | RepositoryData | Datos de servicio transparentes identificados por Service-Indication | 3GPP TS 29.328 §7.6 |
Códigos de Resultado y Experimental-Result
| Código | Nombre | Significado | Referencia |
|---|---|---|---|
| 2001 | DIAMETER_SUCCESS | UDR/PUR/SNR procesados con éxito | RFC 6733 §7.1.1 |
| 5001 | DIAMETER_ERROR_USER_UNKNOWN | Suscriptor no encontrado o no habilitado para IMS | 3GPP TS 29.329 |
| 5105 | DIAMETER_ERROR_TRANSPARENT_DATA_OUT_OF_SYNC | El SequenceNumber de actualización no es el sucesor del valor almacenado | 3GPP TS 29.329 |
ID de Aplicación
| ID | Interfaz | Descripción | Referencia |
|---|---|---|---|
| 16777217 | Sh | AS ↔ HSS datos de usuario | 3GPP TS 29.329 |
Indicaciones de Servicio Comunes
| Service-Indication | Contenido Típico |
|---|---|
MMTEL-Services | Servicios suplementarios MMTel (desvío de llamadas, espera/suspensión de comunicación, OIP/OIR, conferencias): XML simservs |
IMS-ODB-Information | Informació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:
- Lee el documento actual con un UDR para obtener el SequenceNumber actualizado.
- Re-emite el PUR con SequenceNumber = almacenado + 1.
- 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
ServiceDatabyte 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:
- Compara los bytes en bruto devueltos en la respuesta
UDA/REST contra los bytes en bruto enviados, no una representación reanalizada. - 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:
- Lista todos los documentos con
GET /api/subscriber/repository_data/:imsipara ver qué está almacenado. - Verifica el IMSI con Obtener Suscriptor por IMSI.