Blog sobre temas como: Asterisk, VoIP, Mikrotik, Wireless, Web, Publicidad, …
16 Sep
La semana pasada me surgió la necesidad de configurar la salida de las llamadas a móviles por dos líneas diferentes según el horario. Para hacerlo con FreePBX (versión 2.3), lo que hice fue:
exten => _6XXXXXXXX,1,Answer()
;exten => _6XXXXXXXX,n,GotoIfTime(9:00-13:00|*|*|*?orange1)
exten => _6XXXXXXXX,n,GotoIfTime(16:00-20:00|*|*|*?orange2)exten => _6XXXXXXXX,n(orange1),Dial(ZAP/3/${EXTEN})
exten => _6XXXXXXXX,n,Dial(ZAP/4/${EXTEN})
exten => _6XXXXXXXX,n,Dial(ZAP/2/${EXTEN})
exten => _6XXXXXXXX,n,Hangup()exten => _6XXXXXXXX,n(orange2),Dial(ZAP/4/${EXTEN})
exten => _6XXXXXXXX,n,Dial(ZAP/3/${EXTEN})
exten => _6XXXXXXXX,n,Dial(ZAP/2/${EXTEN})exten => 6XXXXXXXX,n,Hangup()
Es un ejemplo muy sencillo, pero seguro que a alguien le puede venir bien.
14 Jul
Eterna discusión.
Los más puristas de Asterisk se muestran siempre en contra de esta herramienta y sus similares. Estoy de acuerdo en que se debe tener un profundo conocimiento de Asterisk, y saber configurarlo sin problemas con sus ficheros de configuración. Si no se tiene una base, cuando aparecen problemas con FreePBX estás perdido.
En cambio, desde un punto de vista empresarial, tanto por ofrecer una herramienta gráfica al cliente como por la velocidad de reacción ante peticiones, creo que FreePBX es una herramienta muy potente.
Eso sí, con clientes me refiero a administradores de sistemas de la empresa, con unos conocimientos adecuados y una pequeña formación acerca de lo que tiene y puede hacer.
Además, FreePBX es ya bastante flexible en cuanto a la edición de ficheros adicionales que no te limiten la funcionalidad de Asterisk (editando directamente).
Concluyendo, creo que la herramienta es adecuada y muy potente. El problema, es que lo ves, lo instalas y voila! funciona!. Ahora, amigo, tienes que tener un conocimiento de lo que hay detrás, porque cuando llegan problemas o peticiones “fuera de la interfaz” …. Vamos, que creo que el problema no está en la herramienta, sino en el uso que se le da.
6 Jul
He tenido un problema con FreePBX (sí, ya…, ya lo sé…), porque el Caller ID de una línea no prevalecía sobre el Caller ID definido en la extensión. Este problema suponía que no se pudiese utilizar el proveedor IP, ya que no aceptaba la llamada al intentar meter un CID que no era el suyo.
Finalmente, he conseguido solucionar el problema de momento modificando el extensions_additional.conf. La macro que mete el CID de la llamada extenerna es “macro-outbound-callerid”, y “de serie” viene así:
[macro-outbound-callerid]
include => macro-outbound-callerid-custom
exten => s,1,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})
exten => s,n(start),Noop(REALCALLERIDNUM is ${REALCALLERIDNUM})
exten => s,n,GotoIf($["${KEEPCID}" != "TRUE"]?normcid)
exten => s,n,GotoIf($["x${OUTKEEPCID_${ARG1}}" = "xon"]?normcid)
exten => s,n,GotoIf($["foo${REALCALLERIDNUM}" = "foo"]?normcid)
exten => s,n,Set(USEROUTCID=${REALCALLERIDNUM})
exten => s,n,GotoIf($["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]?bypass:normcid)
exten => s,n(normcid),Set(USEROUTCID=${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)})
exten => s,n(bypass),Set(EMERGENCYCID=${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)})
exten => s,n,Set(TRUNKOUTCID=${OUTCID_${ARG1}})
exten => s,n,GotoIf($["${EMERGENCYROUTE:1:2}" = ""]?trunkcid)
exten => s,n,GotoIf($["${EMERGENCYCID:1:2}" = ""]?trunkcid)
exten => s,n,Set(CALLERID(all)=${EMERGENCYCID})
exten => s,n,Goto(report)
exten => s,n(trunkcid),GotoIf($["${TRUNKOUTCID:1:2}" = ""]?usercid)
exten => s,n,Set(CALLERID(all)=${TRUNKOUTCID})
exten => s,n(usercid),GotoIf($["${USEROUTCID:1:2}" = ""]?report)
exten => s,n,Set(CALLERID(all)=${USEROUTCID})
exten => s,n,GotoIf($["x${CALLERID(name)}"!="xhidden"]?report:hidecid)
exten => s,n(hidecid),SetCallerPres(prohib_passed_screen)
exten => s,n(report),Noop(CallerID set to ${CALLERID(all)}); end of [macro-outbound-callerid]
Bueno, pues al comprobar si tenemos marcada la opción “Never Override CallerID” (GotoIf($["x${OUTKEEPCID_${ARG1}}"...), que se supone que nos mantiene el CID definido en la linea sobre cualquier otro, nos manda a la etiqueta "normcid", que marca el CID como el definido en la extensión del usuario.
Para que esto funcione como es debido podemos cambiar la macro a una como la de abajo:
[macro-outbound-callerid]
include => macro-outbound-callerid-custom
exten => s,1,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})
exten => s,n(start),Noop(REALCALLERIDNUM is ${REALCALLERIDNUM})
exten => s,n,GotoIf($["x${OUTKEEPCID_${ARG1}}" = "xon"]?lineacid)
exten => s,n,GotoIf($["${KEEPCID}" != "TRUE"]?normcid)
exten => s,n,GotoIf($["foo${REALCALLERIDNUM}" = "foo"]?normcid)
exten => s,n,Set(USEROUTCID=${REALCALLERIDNUM})
exten => s,n,GotoIf($["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]?bypass:normcid)
exten => s,n(normcid),Set(USEROUTCID=${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)})
exten => s,n(bypass),Set(EMERGENCYCID=${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)})
exten => s,n(lineacid),Set(TRUNKOUTCID=${OUTCID_${ARG1}})
exten => s,n,GotoIf($["${EMERGENCYROUTE:1:2}" = ""]?trunkcid)
exten => s,n,GotoIf($["${EMERGENCYCID:1:2}" = ""]?trunkcid)
exten => s,n,Set(CALLERID(all)=${EMERGENCYCID})
exten => s,n,Goto(report)
exten => s,n(trunkcid),GotoIf($["${TRUNKOUTCID:1:2}" = ""]?usercid)
exten => s,n,Set(CALLERID(all)=${TRUNKOUTCID})
exten => s,n(usercid),GotoIf($["${USEROUTCID:1:2}" = ""]?report)
exten => s,n,Set(CALLERID(all)=${USEROUTCID})
exten => s,n,GotoIf($["x${CALLERID(name)}"!="xhidden"]?report:hidecid)
exten => s,n(hidecid),SetCallerPres(prohib_passed_screen)
exten => s,n(report),Noop(CallerID set to ${CALLERID(all)}); end of [macro-outbound-callerid]