Enviado por admin el
En OpenSIPS 3.6 (todavía en versión BETA) se introdujo un enfoque mejorado para el manejo de ramas SIP (branches), especialmente útil en escenarios de forking (paralelo o secuencial). Este artículo explica cómo funcionan los Branch de mensaje y los Branch de transacción, y cómo el relay SIP (función t_relay) convierte unas en otras, facilitando un control más detallado en cada etapa del proceso.
Tipos de Branch en OpenSIPS
1. Branch de mensaje: etapa de preparación. Se define el destino antes de iniciar cualquier señalización SIP.
2. Branch de transacción: etapa de señalización. Tras enviar las ramas por t_relay, se gestionan respuestas, éxito o no éxito de la llamada.
Hasta la versión 3.5, existían tres limitaciones importantes en el script de OpenSIPs:
- No había correlación directa entre el Branch de mensaje y el Branch de transacción.
- No se podían añadir datos personalizados (atributos o flags) que perduraran después del t_relay.
- Desde el script, no era posible acceder a datos de otros Branch en rutas como, por ejemplo, onreply.
OpenSIPS 3.6 introduce variables unificadas para ambas etapas:
- Branch de mensaje: $msg.branch.uri, $msg.branch.attr(...), etc.
- Branch de transacción: $tm.branch.uri, $tm.branch.attr(...), etc.
Esto permite una correlación perfecta entre ambas etapas, facilitando scripts más claros y eficaces, incluso en forking paralelo donde antes esto no era posible. Ahora es posible adjuntar datos personalizados al crear cada rama:
Ejemplos:
$msg.branch.attr(pref_codec) = "PCMU";
append_msg_branch("sip:dest2@sip.com");
$msg.branch.attr(pref_codec) = "G722";
t_relay();
branch_route[info] {
xlog("branch $T_branch_idx tiene pref_codec $tm.branch.attr(pref_codec)\n");
}
```
Así, atributos como pref_codec persisten a lo largo de la transación y se pueden utilizar posteriormente. La versión 3.6 permite indexar y acceder a atributos de cualquier Branch:
- Índice absoluto: $(tm.branch.attr(foo)[2])
- Índice relativo al último forking paralelo: $(tm.branch.attr(foo)[1/active])
- Índice global: …[2/all]
Además, la función t_get_branch_idx_by_attr() permite buscar ramas por atributos:
```
if (t_get_branch_idx_by_attr("name","pstn",,$var(idx))) {
xlog("índice de rama pstn: $var(idx)\n");
}
```
Estas nuevas funcionalidades permite una getsión más detallada, precisa, persistente cuando los destinatarios de una llamadas son más de uno y se quieren diferenciar los atributos o branderas que se utilizarán en cada Branch; esto con la ventaja que los valores configurados no se perderán después de utilizar la función t_relay del modulo TM
Comentarios recientes