Asterisco. E novamente AMI Originate

Anteriormente eu escrevi " AMI. Versatile Originate. Application in CTI application ". Naquela época, parecia-me que o assunto estava resolvido, esgotado. Mas descobriu-se que há espaço para melhorias.





Originate Clássico

Action: Originate
Channel: PJSIP/201
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
      
      



Exemplo de contexto de todos os pares





[all-peers]
exten => _X!,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30,Tt)
	same => n,Hangup()
      
      



  • 201 ligará para 203





  • callerid em 201 será exibido como 201 (o valor do parâmetro " Callerid " no comando Originate )





  • identificador de chamadas em 203 para exibir como 201 - tudo é lindo









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 .





Resta apenas adicionar NoCDR para remover registros cdr de canais locais.





Opção final

O comando AMI terá a forma:





Action: Originate
Channel: Local/201@internal-orig
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Variable: origCid=203
      
      



O plano de discagem final, observe as duas chamadas NoCDR nele :





[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()
	
      
      



Um registro será armazenado no 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
      
      



O que você precisa! :)





Resultados

Não estou sugerindo que essa seja a única solução. Além disso, não estou afirmando que seja aceitável para todos e seja verdade. Gosto da implementação, fiquei satisfeito com a experiência e com o resultado.





Aplicamos com sucesso a técnica descrita em nosso PBX MikoPBX de código aberto gratuito .





Recursos Úteis

  • AMI. Originar versátil. Aplicação na aplicação CTI





  • ManagerAction_Originate





  • Application_ChannelRedirect





  • MikoPBX








All Articles