Limitar llamadas en Asterisk - Funciones GROUP y GROUP_COUNT

Este articulo nace antes que nada de una necesidad que tenía. Ya que la opción call-limit desde la versión 1.6.X en adelante ha sido etiquetada como “deprecated”, para limitar las llamadas entrantes y salientes hay que utilizar estas dos funciones:

  • GROUP
  • GROUP_COUNT

¿Cómo funcionan?

Mi ejemplo practico.

Tengo unas cuantas extensiones configuradas en mi sip.conf y quiero que cada una pueda sacar solamente 2 llamadas externas a la vez. Al mismo tiempo mi proveedor VoIP me brinda como máximo 10 canales.

Lo que tengo que hacer es construir un dialplan donde si una extensión intente sacar 3 llamadas a la vez o ya se están utilizando los 10 canales disponibles de mi proveedor VoIP, las llamadas vayan a una prioridad que avise el usuario que ya no hay más canales disponibles.

Si no hago esto, los canales utilizables por una extensión o pasando por el proveedor VoIP serían los que aparecen en negrita:

asterisk –rvvvvvvvvvvvvvvvvvvvvvvvvvv

CLI> sip show inuse

1000                                      0/0/0           2147483647
1001                                      0/0/0           2147483647
proveedorVoIP                0/0/0           2147483647

Después de unas cuantas pruebas, este es el dialplan que he utilizado:

[externas]

exten => _00X.,1,NoOp
same => n,Set(ext=${CALLERID(num)})
same => n,Set(GROUP()=voip)
same => n,Set(GROUP(salida)=${ext})
same => n,Set(numsal=${GROUP_COUNT(voip)})
same => n,Set(extsal=${GROUP_COUNT(${ext}@salida)})
same => n,NoOp(Hay ${extsal} llamadas desde la extension ${ext} y ${numsal} con el proveedor VoIP)
same => n,Gotoif($[${extsal} > 2 | ${numsal} > 10]?busy)
same => n,Dial(SIP/ProveedorVoIP/${EXTEN})
same => n,Hangup
same => n(busy),Playback(all-outgoing-lines-unavailable)
same => n,Hangup

En la segunda línea asigno a la variable ext el valor del callerID de la extensión que está llamando.

En la tercera y cuarta línea creo dos grupos: uno para el proveedor VoIP y otro para la extensión que en ese momento está llamando.

En la cuarta y quinta línea sumo un canal a cada grupo y los asigno a dos variables distintas: numsal para el proveedor VoIP y extsal para las extensiones.

En la línea del Gotoif comparo los canales que se están utilizando en ese momento. La lógica es esta: si hay más de dos canales utilizados por la misma extensión o más de diez canales abiertos con el proveedor VoIP envío la llamada a la línea donde aparece la etiqueta busy sino saco la llamada normalmente.

En la línea con la etiqueta busy anunciaré al usuario que todas las líneas salientes no están disponibles.

El resultado haciendo unas cuantas pruebas de llamadas es:

    -- Executing [00XXXXXXXXXXXX@phones:1] NoOp("SIP/1000-000002e8", "") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:2] Set("SIP/1000-000002e8", "ext=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:3] Set("SIP/1000-000002e8", "GROUP()=voip") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:4] Set("SIP/1000-000002e8", "GROUP(salida)=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:5] Set("SIP/1000-000002e8", "numsal=1") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:6] Set("SIP/1000-000002e8", "extsal=1") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:7] NoOp("SIP/1000-000002e8", "Hay 1 llamadas desde la extensión 1000 y 1 con el proveedor VoIP")

   -- Executing [00XXXXXXXXXXXX@phones:8] GotoIf("SIP/1000-000002e8", "0?busy") in new stack

   -- Executing [00XXXXXXXXXXXX@phones:1] NoOp("SIP/1000-000002e9", "") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:2] Set("SIP/1000-000002e9", "ext=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:3] Set("SIP/1000-000002e9", "GROUP()=voip") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:4] Set("SIP/1000-000002e9", "GROUP(salida)=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:5] Set("SIP/1000-000002e9", "numsal=2") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:6] Set("SIP/1000-000002e9", "extsal=2") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:7] NoOp("SIP/1000-000002e9", "Hay 2 llamadas desde la extensión 1000 y 2 con el proveedor VoIP") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:8] GotoIf("SIP/1000-000002e9", "0?busy") in new stack
 

   -- Executing [00XXXXXXXXXXXX@phones:1] NoOp("SIP/1001-000002ea", "") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:2] Set("SIP/1001-000002ea", "ext=1001") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:3] Set("SIP/1001-000002ea", "GROUP()=voip") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:4] Set("SIP/1001-000002ea", "GROUP(salida)=1001") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:5] Set("SIP/1001-000002ea", "numsal=3") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:6] Set("SIP/1001-000002ea", "extsal=1") in new stack
   -- Executing [00XXXXXXXXXXXXX@phones:7] NoOp("SIP/1001-000002ea", "Hay 1 llamadas desde la extensión 1001 y 3 con el proveedor VoIP") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:8] GotoIf("SIP/1001-000002ea", "0?busy") in new stack
  

   -- Executing [00XXXXXXXXXXXX@phones:1] NoOp("SIP/1000-000002eb", "") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:2] Set("SIP/1000-000002eb", "ext=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:3] Set("SIP/1000-000002eb", "GROUP()=voip") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:4] Set("SIP/1000-000002eb", "GROUP(salida)=1000") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:5] Set("SIP/1000-000002eb", "numsal=4") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:6] Set("SIP/1000-000002eb", "extsal=3") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:7] NoOp("SIP/1000-000002eb", "Hay 3 llamadas desde la extension 1000 y 4 con el proveedor VoIP") in new stack
   -- Executing [00XXXXXXXXXXXX@phones:8] GotoIf("SIP/1000-000002eb", "1?busy") in new stack
   -- Goto (phones,003907331941188,12)
   -- Executing [003907331941188@phones:12] Playback("SIP/1000-000002eb", "all-outgoing-lines-unavailable") in new stack

Cuando la extensión 1000 intenta sacar la tercera llamada, el Gotoif es verdadero y el dialplan sigue desde la prioridad con la etiqueta busy.

Ningún problema cuando hay dos canales utilizados por la extensión 1000 y efectúa otra llamada la extensión 1001

Me parece una forma muy sencilla de controlar los canales para las llamadas salientes.

Lo mismo se puede hacer para las llamadas entrantes (si queremos limitarlas).

Es todo

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Limitar llamadas en Asterisk - Funciones GROUP y GROUP_COUNT" Suscribirse a VozToVoice - Todos los comentarios