1. ตัวแปร
จากตัวอย่างในตอนที่แล้ว เราได้ extensions.conf ดังนี้
====================================================
[from-sip] ; context สำหรับโทรภายใน และโทรออก
exten => 2000,1,Answer()
exten => 2000,n,Dial(SIP/2000,20)
exten => 2000,n,Hangup()
exten => 2001,1,Answer(0)
exten => 2001,n,Dial(SIP/2001,20)
exten => 2001,n,Hangup()
exten => _0[689]XXXXXXXX,1,Dial(SIP/voip/${EXTEN},30)
exten => _0[23457]XXXXXXX,1,Dial(SIP/voip/${EXTEN},30)
====================================================
จะเห็นว่าใน 2 บรรทัดสุดท้ายมี ${EXTEN} สักษณะเช่นนี้ คือ ${NAME} เรียกว่าตัวแปร
${EXTEN} มีค่าเท่ากับ เลขหมายปลายทางที่ผู้โทรกด
${EXTEN:1} มีค่าเท่ากับ ตัดตัวเลขตัวแรกออกจากเลขหมายปลายทางที่ผู้โทรกด
ตัวอย่างเช่น
exten => _90[689]XXXXXXXX,Dial(SIP/voip/${EXTEN:1})
ถ้าเรากด 90818067894 ระบบจะตัด 9 ออกแล้ว Dial เฉพาะ 0818067894
2. Application Goto()
ใน extensions.conf ของเรา เมื่อมีสายเข้ามา ระบบจะ ring ที่ extension 2000
ถ้าเราต้องการให้มีระบบตอบรับอัตโนมัติเราจะต้องใช้ Application Goto() มาช่วย
Application Goto() จะใช้ในการบังคับให้ระบบข้ามไป process ในบรรทัดที่ต้องการ
มีรูปแบบ ดังนี้
exten => 123,1,Goto(context,extension,priority)
หรือ
exten => 123,1,Goto(extension,priority) ถ้าอยู่ใน context เดียวกัน
3. Branching with Application GotoIf()
entensions.conf ในข้อ 2 สามารถทำงานได้ แต่อาจจะเกิด loop ไม่รู้จบได้ สมมติว่ามีผูโทรเข้ามา
แล้วไม่กดอะไรเลย ระบบจะรอจน timeout (default = 10s) แล้ว play mainmenu และจะวน
loop อย่างนี้ไปเรื่อยๆ ระบบจะเสีย incoming trunk ไปโดยเปล่าประโยชน์ จะต้องมีการกำหนดให้นับ
จำนวน loop ถ้าครบก็ให้ Hangup()
GotoIf() จะมีการใช้งาน ดังนี้
exten => 123,1,GotoIf(Expression?destination1:destination2)
โดยที่ destination1, destination2 คือ
- priority label หรือ
- extention,priority label หรือ
- contect,extension,priority label
ดูตัวอย่าง
======================================================
[from-voip]
exten => s,1,Answer()
exten => s,2,Set(COUNT=0) ; Set counter = 0
exten => s,3,Background(th-mainmenu)
exten => s,4,Set(COUNT=$[${COUNT} + 1]) ; เพิ่ม counter
exten => s,5,GotoIf($[${COUNT} = 3]?stopping:goingon) ; เช็ค counter = 3 หรือไม่ (กำหนด maximum loop ที่นี่)
exten => s,6(stopping),Hangup() ; counter = 3 ให้ Hangup()
exten => s,7(goingon),WaitExten() ; counter < 3 ให้ทำงานต่อ
exten => t,1,Goto(s,3)
exten => i,1,Playback(th-invalid)
exten => i,2,Goto(s,3)
exten => 2000,1,Dial(SIP/2000,20)
exten => 2001,1,Dial(SIP/2001,20)
[from-sip]
exten => 2000,1,Answer()
exten => 2000,n,Dial(SIP/2000,20)
exten => 2000,n,Hangup()
exten => 2001,1,Answer()
exten => 2001,n,Dial(SIP/2001,20)
exten => 2001,n,Hangup()
exten => _0[689]XXXXXXXX,1,Dial(SIP/voip/${EXTEN},30)
exten => _0[23457]XXXXXXX,1,Dial(SIP/voip/${EXTEN},30)