TR-369 / USP
¿Cómo funcionan las notificaciones y suscripciones USP en TR-369?
Respuesta corta
USP (TR-369) no tiene un mensaje Subscribe. Un Controlador se suscribe con un Add que crea una fila en la tabla Device.LocalAgent.Subscription. del Agente. Cuando ocurre el evento, el Agente envía un Notify con una notificación ValueChange, ObjectCreation, ObjectDeletion, OperationComplete o Event, como Boot!. Si NotifRetry está activo, el Agente pide respuesta y reintenta hasta recibirla o hasta que la notificación venza.
¿Sabías que…?
- USP no tiene un mensaje Subscribe. Un Controlador se suscribe creando una instancia del Subscription Object en el modelo de datos del Agente con un Add común y corriente.TR-369 §7.3.3.2, §7.6.1.1
- Una implementación debería cambiar su estado e iniciar la Notification en una ventana de no más de 10 segundos.TR-369 §7.6.1 (R-NOT.0a)
- Un ValueChange se envía aunque el cambio lo haya hecho el mismo Controlador suscrito. En TR-069, al ACS no se le notifican los cambios que él mismo provocó.TR-369 §7.6.1, §7.6.3.1
- Con los valores por defecto, los reintentos de una notificación empiezan con una espera de 5 a 10 segundos y se duplican hasta llegar a un rango fijo de 2560 a 5120 segundos.TR-369 §7.6.2 (R-NOT.1, R-NOT.2)
- OnBoardRequest nunca es objeto de una suscripción, y debe reintentarse hasta que el Controlador lo confirme. No vence.TR-369 §7.6.3.4 (R-NOT.6, R-NOT.6a)
Una plataforma de gestión de equipos está tan al día como lo último que le contó cada equipo. En USP (TR-369), qué reporta un Agente, a qué Controlador y con cuánta insistencia lo definen las suscripciones, y el reporte viaja en un mensaje Notify. Esta guía recorre el mecanismo tal como lo define la especificación.
¿Cómo se suscribe un Controlador a las notificaciones?
Una suscripción (Subscription) es la lógica que le indica a un Agente qué Notifications enviarle a un Controlador en
particular (§1.4). USP no tiene un mensaje Subscribe entre sus once tipos de request (§7.3.3.2). Las suscripciones viven
en el modelo de datos, como instancias del Multi-Instance Object Device.LocalAgent.Subscription.{i}., y sus reglas
normativas están en la descripción de ese Object en el Device:2 Data Model (§7.6.1, R-NOT.0). El Controlador crea una
con un mensaje Add común y corriente (§7.6.1.1).
Los Parameters de una suscripción responden cuatro preguntas:
- Qué vigilar.
ReferenceListcontiene los Path Names o Search Paths a los que aplica (§7.6.1.1). Para enterarse de cuándo una estación se une a la red Wi-Fi, el Controlador se suscribe a ObjectCreation sobreDevice.WiFi.AccessPoint.1.AssociatedDevice.. Para saber cuándo alguien más cambia el SSID, se suscribe a ValueChange sobreDevice.WiFi.SSID.1.SSID(§7.6.1.1). - Qué hacer.
TriggerActionhace que el Agente envíe un Notify, la opción por defecto, que actualice su propia configuración, o ambas cosas (§7.6.1.2). - Cuánto insistir.
NotifRetryyNotifExpirationdeciden si se confirma la entrega y cuándo se dejan de hacer reintentos (§7.6.2). - Para quién es. Cada suscripción tiene un
IDy unRecipient, una entrada de la tabla de Controladores del Agente, como en la expresión de búsqueda de un ejemplo de la especificación,[ID=="boot-1"&&Recipient=="Device.LocalAgent.Controller.1"](§7.5.1.1).
El Controlador también necesita permiso. Los permisos de un Role se escriben con cuatro caracteres, rwxn, donde n
es Notify (§8.9.2.1). Cuando ocurre un evento, la implementación debería cambiar su estado e iniciar la Notification en
una ventana de no más de 10 segundos (R-NOT.0a).
- AddEl Controlador se suscribeUna fila nueva en Device.LocalAgent.Subscription. indica las rutas, el tipo de notificación y el Recipient.
- EventoSe cumple la condiciónCambia un Parameter, se agrega o elimina una instancia, termina una operación o se dispara un Event (por ejemplo, Boot!).
- NotifyEl Agente reportaEl Notify lleva el subscription_id y, si NotifRetry es true, send_resp en true.
- NotifyRespEl Controlador confirmaDevuelve el mismo subscription_id. Si no hay respuesta, el Agente reintenta hasta NotifExpiration.
¿Qué tipos de notificación define USP?
Un Notify lleva exactamente uno de seis tipos de notificación (§7.6.4.2):
| Tipo | Se envía cuando | Qué lleva |
|---|---|---|
| ValueChange | Un Parameter suscrito cambia de valor, aunque el cambio lo haya hecho el Controlador suscrito (§7.6.3.1) | param_path, param_value |
| ObjectCreation | Se agrega una instancia a un Multi-Instance Object suscrito (§7.6.3.2) | obj_path y las unique_keys de la instancia |
| ObjectDeletion | Se elimina una instancia de un Multi-Instance Object suscrito (§7.6.3.2) | obj_path |
| OperationComplete | Termina una operación asíncrona, con éxito o no (§7.6.3.3) | command_name, obj_path, command_key, argumentos de salida o cmd_failure |
| OnBoardRequest | El Agente le pide el onboarding a un Controlador, probablemente por primera vez (§7.6.3.4) | oui, product_class, serial_number, versiones de USP soportadas |
| Event | Se dispara un evento definido en el modelo de datos, como Boot! (§7.6.3.5) | obj_path, event_name y los parámetros del evento |
Todo Notify lleva además el subscription_id que el Controlador definió al crear la suscripción. En un OnBoardRequest,
que no tiene suscripción, ese campo va vacío (R-NOT.7).
¿Cómo se ven Boot! y los demás eventos?
Los eventos se definen en el modelo de datos, ligados a Objects, y su nombre termina en signo de exclamación, como
Device.Boot! (§2.6.3). Boot! es además el ejemplo de notificación Event que da la especificación: su Notify indica
Device. como objeto y Boot! como evento, con parámetros como Cause, CommandKey, ParameterMap y
FirmwareUpdated (§7.6.4.1).
Los eventos y OperationComplete suelen trabajar juntos. Cuando un Controlador ejecuta un Command asíncrono con Operate,
el Agente crea un Request Object, lo elimina cuando termina la operación y envía el resultado en una notificación
OperationComplete, con el command_key que eligió el Controlador, a todos los Controladores suscritos (§7.7.2). Para
un cambio de firmware, la especificación recomienda suscribirse a un ValueChange de DeviceInfo.SoftwareVersion o al
evento Boot!: si la versión no cambió, o si FirmwareUpdated viene en false, puede que el equipo haya tenido problemas
para arrancar la imagen nueva (Apéndice II.2.1). El proceso completo está en
actualizaciones de firmware con USP.
¿Qué pasa si el Controlador no responde?
La entrega solo se confirma si la suscripción lo pide. Cada Notify tiene un indicador send_resp. Si el Parameter
NotifRetry de la suscripción es true, el Agente pone send_resp en true y solo da la notificación por entregada
cuando el Controlador responde. Si es false, el Agente debería ignorar el estado de la entrega (§7.6.2). Cuando
send_resp es false, el Controlador no debería responder (R-NOT.8), y cuando responde, debe devolver el mismo
subscription_id (R-NOT.10).
Si no hay respuesta, el Agente reintenta con un algoritmo fijo (R-NOT.1). Dos Parameters de cada entrada de la tabla de
Controladores del Agente marcan el ritmo: USPNotifRetryMinimumWaitInterval, 5 segundos por defecto, y
USPNotifRetryIntervalMultiplier, 2000 por defecto, que la fórmula divide entre 1000, así que cada rango se duplica:
| Reintento | Rango de espera por defecto |
|---|---|
| 1 | De 5 a 10 segundos |
| 2 | De 10 a 20 segundos |
| 3 | De 20 a 40 segundos |
| 4 a 9 | Se duplica, hasta llegar a 1280 a 2560 segundos |
| 10 en adelante | De 2560 a 5120 segundos |
Desde el décimo reintento, el rango queda fijo (R-NOT.2), y el Agente sigue intentando hasta que la notificación se
entrega o se alcanza el NotifExpiration de la suscripción (§7.6.2). El conteo de reintentos vuelve a cero después de
cada entrega exitosa y después de un reinicio (R-NOT.3, R-NOT.4). Un Controlador con los permisos adecuados puede
cambiar ambos Parameters en cualquier momento (R-NOT.1).
OnBoardRequest es la única notificación que nunca se rinde. Debe enviarse con send_resp en true y reintentarse hasta
que el Controlador la confirme con un Notify Response (R-NOT.6, R-NOT.6a), como si perteneciera a una suscripción con
NotifExpiration en 0, es decir, sin vencimiento (§7.6.3.4).
¿En qué se diferencia de TR-069?
La mayor diferencia es a quién se le avisa. La especificación incluye una nota para quienes vienen de TR-069: en CWMP, al ACS no se le notifican los cambios de valor que provocó el propio ACS, porque con un solo ACS no hace falta. En USP, el Agente sigue cada suscripción sin importar quién la creó (§7.6.1), y un ValueChange se envía aunque el cambio lo haya hecho el mismo Controlador que se suscribió (§7.6.3.1). Con varios Controladores en un mismo Agente, cada uno recibe las notificaciones de sus propias suscripciones, sin importar quién hizo el cambio.
Hay un matiz. Algunos eventos se definen por Controlador, como los de Device.BulkData. o
Device.LocalAgent.Threshold., y solo van al Controlador que configuró su origen, aunque otro Controlador tenga una
suscripción (§4.1.3.1, R-MTP.4e). Para la comparación completa entre ambos protocolos, lee
TR-069 vs TR-369, y para el resto de USP, empieza por qué es TR-369.
Preguntas frecuentes
- ¿Cómo se suscribe un Controlador a las notificaciones en USP?
- Envía un mensaje Add que crea una instancia de Device.LocalAgent.Subscription.{i}. en el Agente, con las rutas que le interesan en el Parameter ReferenceList y el tipo de notificación que quiere. No existe un mensaje Subscribe aparte.
- ¿Qué es una notificación ValueChange en TR-369?
- Una notificación que envía el Agente cuando un Parameter suscrito cambia de valor. Lleva la ruta del Parameter y su nuevo valor, y se envía aunque el cambio lo haya hecho el mismo Controlador suscrito.
- ¿Qué tipos de notificación soporta USP?
- ValueChange, ObjectCreation, ObjectDeletion, OperationComplete, OnBoardRequest y Event. Event lleva eventos definidos en el modelo de datos, como Boot!. OnBoardRequest es el único que no es objeto de una suscripción.
- ¿Qué significa send_resp en un Notify de USP?
- Le indica al Controlador si el Agente espera una respuesta. Cuando el Parameter NotifRetry de la suscripción es true, el Agente pone send_resp en true y solo da la notificación por entregada cuando el Controlador responde. Si no hay respuesta, reintenta.
- ¿Cada cuánto reintenta un Agente USP una notificación?
- Con los valores por defecto, el primer reintento espera de 5 a 10 segundos y cada rango siguiente se duplica, hasta 2560 a 5120 segundos desde el décimo reintento. El Agente se detiene cuando la notificación se entrega o cuando se alcanza el NotifExpiration de la suscripción.
- ¿Un Agente USP le notifica a un Controlador los cambios que hizo ese mismo Controlador?
- Sí. La especificación aclara que en TR-069 al ACS no se le notifican los cambios de valor que él provocó, porque hay un solo ACS, mientras que un Agente USP sigue cada suscripción sin importar quién la creó.
Fuentes
- Broadband Forum, TR-369 – The User Services Platform, Issue 1 Amendment 5 (USP 1.5), enero de 2026.
- Dodderware, documentación de producto e ingeniería de DWS Support.
- §1.4, §2.6.3Definiciones (Event, Notification, Subscription) y Event Path Names
- §4.1.3.1Eventos que solo van al Controlador que configuró su origen (destination_id)
- §7.3.3.2, §7.5.1.1Tipos de request, y el ejemplo de Get sobre la tabla de suscripciones
- §7.6, §7.6.1, §7.6.1.1, §7.6.1.2Mecanismo de suscripciones (R-NOT.0, R-NOT.0a), ReferenceList y TriggerAction
- §7.6.2send_resp, NotifRetry y el algoritmo de reintentos (R-NOT.1 a R-NOT.4)
- §7.6.3, §7.6.4Tipos de notificación, el mensaje Notify, sus ejemplos y sus campos (R-NOT.5 a R-NOT.10)
- §7.7.2Operaciones asíncronas y OperationComplete
- §8.9.2.1El permiso n (Notify) en los Roles de los Controladores
- Apéndice II.2.1Seguir un cambio de firmware con ValueChange o Boot!
TR-369 © The Broadband Forum. Todos los derechos reservados. Citado brevemente y parafraseado con fines explicativos; los diagramas son de Dodderware.