Anteriormente escribí " AMI. Versatile Originate. Aplicación en la aplicación CTI ". En ese momento, me pareció que el tema estaba resuelto, agotado. Pero resultó que hay margen de mejora.
Origen clásico
Action: Originate
Channel: PJSIP/201
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Ejemplo de contexto de todos los pares
[all-peers]
exten => _X!,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30,Tt)
same => n,Hangup()
201 llamará 203
callerid en 201 se mostrará como 201 (el valor del parámetro " Callerid " en el comando Originate )
callerid en 203 para que se muestre como 201 : todo es hermoso
2021-05-17 16:34:17|2021-05-17 16:34:20|2021-05-17 16:34:32|201|PJSIP/201-0000000a|203|PJSIP/203-0000000b
.
:
201 , , ,
, 201 contact. , 201
extensions.conf
[internal-orig]
exten => _X!,1,Set(DST_CONTACT=${PJSIP_DIAL_CONTACTS(${EXTEN})})
same => n,ExecIf($["${DST_CONTACT}x" != "x"]?Dial(${DST_CONTACT},30,Tt))
Originate :
Action: Originate
Channel: Local/201@internal-orig
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
, . , CDR :
2021-05-17 17:01:09|2021-05-17 17:01:12|2021-05-17 17:01:17|203|Local/201@internal-orig-00000006;2|201|PJSIP/201-00000012
2021-05-17 17:01:09|2021-05-17 17:01:12|2021-05-17 17:01:17|201|Local/201@internal-orig-00000006;1|203|PJSIP/203-00000013
Local
, .
CallerID
AMI origCid=203:
Action: Originate
Channel: Local/201@internal-orig
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Variable: origCid=203
"Exten" AMI.
dialplan:
[internal-orig]
exten => _X!,1,Set(D_CONT=${PJSIP_DIAL_CONTACTS(${EXTEN})})
same => n,Set(CALLERID(num)=${origCid})
same => n,ExecIf($["${D_CONT}x" != "x"]?Dial(${D_CONT},${ringlength},Tt))
callerid.
CDR
. .
:
Local (hangup)
Local CDR
.
" " ( Local) U(orig-answer-channel) Dial
orig-answer-channel :
[orig-answer-channel]
exten => s,1,Set(MASTER_CHANNEL(O_SRC_CHAN)=${CHANNEL})
same => n,return
- .
. Local " " :
[all-peers]
exten => _X!,1,ExecIf($[ "${O_SRC_CHAN}x" != "x" ]?ChannelRedirect(${O_SRC_CHAN},${CONTEXT},${EXTEN},1))
same => n,ExecIf($[ "${O_SRC_CHAN}x" != "x" ]?Hangup())
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30,Tt)
same => n,Hangup()
"all-peers" Local . verbose :
Executing [203@all-peers:1] ExecIf("Local/201@internal-orig-00000009;1", "1?NoCDR()")
Executing [203@all-peers:2] ExecIf("Local/201@internal-orig-00000009;1", "1?ChannelRedirect(PJSIP/201-00000016,all-peers,203,1)")
Executing [203@all-peers:3] ExecIf("Local/201@internal-orig-00000009;1", "1?Hangup()")
"ChannelRedirect" , Local .
Executing [203@all-peers:1] ExecIf("PJSIP/201-00000016", "0?NoCDR()")
Executing [203@all-peers:2] ExecIf("PJSIP/201-00000016", "0?ChannelRedirect(,all-peers,203,1)")
Executing [203@all-peers:3] ExecIf("PJSIP/201-00000016", "0?Hangup()")
Executing [203@all-peers:4] Dial("PJSIP/201-00000016", "PJSIP/203/sip:203@172.16.156.1:59442;ob,30,Tt")
"all-peers" , sip , Originate .
Solo queda agregar NoCDR para eliminar los registros cdr de los canales locales.
Opción final
El comando AMI tendrá la forma:
Action: Originate
Channel: Local/201@internal-orig
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Variable: origCid=203
El plan de marcado final, observe las dos llamadas NoCDR en él :
[internal-orig]
exten => _X!,1,NoCDR()
same => n,Set(MASTER_CHANNEL(O_DST_CHAN)=${origCid})
same => n,Set(CALLERID(num)=${origCid})
same => n,Set(DST_CONTACT=${PJSIP_DIAL_CONTACTS(${EXTEN})})
same => n,ExecIf($["${DST_CONTACT}x" != "x"]?Dial(${DST_CONTACT},${ringlength},TtU(orig-answer-channel),s,1)))
[orig-answer-channel]
exten => s,1,Set(MASTER_CHANNEL(O_SRC_CHAN)=${CHANNEL})
same => n,return
[all-peers]
exten => _X!,1,ExecIf($[ "${O_SRC_CHAN}x" != "x" ]?NoCDR())
same => n,ExecIf($[ "${O_SRC_CHAN}x" != "x" ]?ChannelRedirect(${O_SRC_CHAN},${CONTEXT},${O_DST_CHAN},1))
same => n,ExecIf($[ "${O_SRC_CHAN}x" != "x" ]?Hangup())
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30,Tt)
same => n,Hangup()
Un registro se almacenará en el CDR.
2021-05-17 17:29:07|2021-05-17 17:29:10|2021-05-17 17:29:14|201|PJSIP/201-00000018|203|PJSIP/203-00000019
¡Que necesitas! :)
Resultados
No estoy sugiriendo que esta sea la única solución. Además, no estoy afirmando que sea aceptable para todos y que sea cierto. Me gusta la implementación, quedé satisfecho con la experiencia y el resultado.
Aplicamos con éxito la técnica descrita en nuestro PBX de código abierto gratuito MikoPBX .