Früher habe ich " AMI. Versatile Originate. Anwendung in CTI-Anwendung " geschrieben. Zu dieser Zeit schien es mir, dass das Thema gelöst und erschöpft war. Es stellte sich jedoch heraus, dass noch Verbesserungspotenzial besteht.
Klassischer Ursprung
Action: Originate
Channel: PJSIP/201
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Beispiel für einen All-Peers- Kontext
[all-peers]
exten => _X!,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30,Tt)
same => n,Hangup()
201 wird 203 anrufen
callerid bei 201 wird , wie dargestellt 201 (der Wert der „ Callerid “ Parameter in dem Stammen Befehl )
Callerid bei 203 als 201 anzuzeigen - alles ist schön
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 .
Es bleibt nur NoCDR hinzuzufügen, um CDR- Einträge von lokalen Kanälen zu entfernen.
Letzte Option
Der AMI-Befehl hat folgende Form:
Action: Originate
Channel: Local/201@internal-orig
Context: all-peers
Exten: 203
Priority: 1
Callerid: 201
Variable: origCid=203
Beachten Sie beim endgültigen Wählplan die beiden darin enthaltenen NoCDR- Aufrufe :
[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()
Ein Datensatz wird in der CDR gespeichert
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
Was du brauchst! :) :)
Ergebnisse
Ich behaupte nicht, dass dies die einzige Lösung ist. Ich behaupte auch nicht, dass es für alle akzeptabel und wahr ist. Ich mag die Implementierung, ich war mit der Erfahrung und dem Ergebnis zufrieden.
Wir haben die beschriebene Technik erfolgreich in unserer kostenlosen Open Source PBX MikoPBX angewendet .