เขียน dialplan ขั้นพื้นฐาน (ต่อ)
1. ตัวแปร
จากตัวอย่างในตอนที่แล้ว เราได้ extensions.conf ดังนี้
====================================================
[from-mm] ; context สำหรับ incoming จาก Mouthmun
exten => s,1,Answer() ; รับ call
exten => s,n,Dial(SIP/2000,20) ; Dial extension 2000 โดยมี timeout = 20 วินาที
exten => s,n,Hangup()
[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 => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
====================================================
จะเห็นว่าใน 3 บรรทัดสุดท้ายมี ${EXTEN} สักษณะเช่นนี้ คือ ${NAME} เรียกว่าตัวแปร
${EXTEN} มีค่าเท่ากับ เลขหมายปลายทางที่ผู้โทรกด
${EXTEN:1} มีค่าเท่ากับ ตัดตัวเลขตัวแรกออกจากเลขหมายปลายทางที่ผู้โทรกด
ตัวอย่างเช่น
exten => _900XXXXXXXX,Dial(SIP/mm/${EXTEN:1})
ถ้าเรากด 90018067894 ระบบจะตัด 9 ออกแล้ว Dial เฉพาะ 0018067894
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 เดียวกัน
มาดูตัวอย่างกันเลย modify จาก extensions.conf เดิม ปรับเฉพาะ context ขาเข้า
context โทรภายในและโทรออกคงไว้เช่นเดิม
====================================================
[from-mm] ; context สำหรับ incoming จาก Mouthmun
exten => s,1,Answer() ; รับ call
exten => s,2,Background(th-mainmenu) ; ข้อความต้อนรับ บอกให้ผู้โทรกดเลขหมายต่างๆ
exten => s,3,WaitExten() ; รอรับตัวเลขที่ผู้โทรกด
exten => t,1,Goto(s,2) ; ถ้าผู้โทรไม่กดนานกว่า timeout (10s) ให้กลับไปที่
; mainmenu
exten => i,1,Playback(th-invalid) ; ถ้าผู้โทรกดเลขหมายนอกเหนือจากที่กำหนดให้ระบบ
; play soundfile เพื่อบอกผู้โทร
exten => i,2,Goto(s,2) ; แล้วกลับไปที่ mainmenu
exten => 2000,1,Dial(SIP/2000,20) ; ถ้าผู้โทรกด 2000 ให้ระบบ ring extension 2000
exten => 2001,1,Dial(SIP/2001,20) ; ถ้าผู้โทรกด 2001 ให้ระบบ ring extension 2001
[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 => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
====================================================
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
ดูตัวอย่าง โดยการ modify extensions.conf ในข้อ 2 เพื่อไม่ให้เกิด loop ไม่รู้จบ
======================================================
[from-mm]
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 => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
======================================================
4. ส่งท้าย
ลองคอนฟิกดูครับ มี feedback อะไรก็ mail มาได้ครับที่
adventek@adventek.biz