Asterisco. Y de nuevo AMI Originate

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 .





Recursos útiles

  • AMI. Origen versátil. Aplicación en aplicación CTI





  • ManagerAction_Originate





  • Application_ChannelRedirect





  • MikoPBX








All Articles