หน้า 1 จากทั้งหมด 1

Context ของ SIP และ Context ของ Extension

โพสต์โพสต์แล้ว: 21 ธ.ค. 2009 17:34
โดย voip4share
ถ้าโทรเข้าทาง SIP Trunk แล้วต้องการให้ไปดังที่เบอร์ Extension แต่ไม่เวอร์ค และถ้าอยากโทรจากเบอร์ Extension ออกไปทาง SIP Trunk ไม่เวอร์คเช่นกัน ถ้ามีปัญหานี้หล่ะก็ ลองอ่านข้อความข้างล่างนี้ดูครับ

คงจะสังเกตเห็นกันมาบ้างนะครับว่าตอนที่เราคอนฟิก Extension ในไฟล์ extensions.conf และคอนฟิก SIP Trunk (SIP Peer) ในไฟล์ sip.conf นั้นมีบรรทัด context= อยู่ด้วย ซึ่งถ้าชื่อ context ไม่ตรงกันก็จะโทรจาก Extension ไป SIP และโทรจาก SIP ไป Extension ไม่ได้ครับ

1. จาก SIP ไป Extension ซึ่งก็คือรับคอลเข้ามาทาง SIP Trunk แล้วส่งไปที่ Extension
เมื่อเราโทรจากภายนอกเข้าไปที่ Asterisk ผ่านทาง SIP Trunk (สมมติว่าเราคอนฟิก SIP Trunk ไว้เรียบร้อยแล้วนะครับ) Asterisk จะมองบรรทัด context ใน SIP Trunk สมมติว่า context=from-internal จากนั้นจะไปมองที่ไฟล์ extensions.conf (หรือไฟล์อื่นที่ถูก include เข้าไป) แล้วเช็คว่ามี context=from-internal อยู่หรือไม่ ถ้ามีก็จะโทรเข้าไปได้ ถ้าไม่มีก็จะตัดสายทิ้ง สรุปว่า context ของทั้งสองที่ต้องเหมือนกันครับถึงจะโทรหากันได้
2. จาก Extension ไป SIP ซึ่งก็คือเบอร์ Extension โทรออกไปภายนอกผ่าน SIP Trunk ก็เช่นเกียวกันครับ context ต้องชื่อเดียวกัน
3. จาก Extension ไป Extension ซึ่งก็คือการโทรใน Server เดียวกัน

ถ้าเราสร้างเบอร์ Extension แบบ SIP ขึ้นมา จะทำให้ Context ของเบอร์ Extension จะอยู่ที่ไฟล์ sip.conf นะครับ (สมมติว่าสร้างเบอร์ Extension ไว้ในไฟล์นี้นะครับ) เมื่อมีการโทรจากเบอร์ Extension หนึ่งไปยังอีกเบอร์หนึ่ง Asterisk มันจะเช็ค 3 ขั้นตอนดังต่อไปนี้
1. ดูที่ไฟล์ sip.conf เช็คว่าเบอร์ต้นทางอยู่ใน context อะไร (บรรทัด context=from-internal)
2. มีชื่อ context นี้อยู่ในไฟล์ extensions.conf หรือไม่ (เช็คว่ามี [from-internal] หรือไม่)
3. ที่ [from-internal] มีคำสั่งให้โทรไปเบอร์ Extension ปลายทางหรือไม่ (หาบรรทัด Dial ไปยังเบอร์ปลายทาง)
ถ้าสำเร็จทั้ง 3 ขั้นตอนมันก็จะโทรไปได้ แต่ถ้าไม่สำเร็จที่ขั้นตอนใดขั้นตอนหนึ่งหล่ะก็จะโทรไม่ได้ครับ ดูตัวอย่างกันดีกว่า

ไฟล์ sip.conf
[100]
host=dynamic
context=from-internal

[101]
host=dynamic
context= from-internal

สองเบอร์นี้มี context=from-internal เหมือนกัน

ไฟล์ extensions.conf
[from-internal]
exten => 100,1,Dial(SIP/100)
exten => 100,n,Hangup

exten => 101,1,Dial(SIP/101)
exten => 101,n,Hangup

ถ้าเบอร์ 100 กดโทรไปหา 101 Asterisk จะเช็คเจอว่าเบอร์ 100 อยู่ใน context=from-internal มันก็จะมามองหา [from-internal] ในไฟล์ extensions.conf และเมื่อเจอก็จะมองหาคำสั่งที่จะโทรไปเบอร์ 101 (ซึ่งก็จะเจอเพราะเราคอนฟิกไว้) ก็จะโทรไปได้ แต่ถ้าในไฟล์ extensions.conf ไม่มี [from-internal] ก็จะโทรไม่ได้เหมือนกัน เช่นลืมใส่หรือว่าพิมพ์ชื่อผิด และถ้าเจอ [from-internal] แต่ไม่มีคำสั่งที่จะโทรไปเบอร์ 101 ก็จะโทรไปไม่ได้ จะได้ยินเสียงว่า "All circuits are busy now, please try your call again later" ประมาณนี้ครับ

ทีนี้มาดูคอนฟิกแบบนี้บ้าง สองเบอร์อยู่กันคนละ context

ไฟล์ sip.conf แบบย่อๆ
[100]
context=from-internal-1

[100]
context=from-internal-2

ไฟล์ extensions.conf แบบย่อๆ

[from-internal-1]
exten => 100,1,Dial(SIP/100)
exten => 100,n,Hangup

[from-internal-2]
exten => 101,1,Dial(SIP/101)
exten => 101,n,Hangup

จะเกิดอะไรขึ้นถ้าเบอร์ 100 โทรไปหา 101 คำตอบคือ โทรไม่ได้ครับ All circuit are busy now, please try.... เพราะว่า Asterisk รู้ว่าเบอร์ 100 อยู่ที่ context=from-internal-1 มันจะมามองที่ [from-internal-1] ในไฟล์ extensions.conf และก็จะมองไม่เห็นคำสั่งให้ Dial ไปที่เบอร์ 101 ก็เลยโทรไม่ได้

ถ้าจะแก้ไขให้โทรได้จะต้องทำอย่างไร ง่ายๆครับคือต้องบอก Asterisk ว่า เมื่อมามองหาที่ [from-internal-1] แล้วอย่าลืมไปดูที่ [from-internal-2] ด้วยหล่ะ เขียนแบบนี้ครับ

[from-internal-1]
include => from-internal-2
exten => 100,1,Dial(SIP/100)
exten => 100,n,Hangup

[from-internal-2]
exten => 101,1,Dial(SIP/101)
exten => 101,n,Hangup

คือเพิ่มบรรทัด include => from-internal-2 เข้าไปใน [from-internal-1]

คำถามต่อมาคือใน Dial Plan แบบที่ 2 นี้ เบอร์ 101 จะโทรไปหาเบอร์ 100 ได้หรือไม่และเพราะอะไร
คำตอบคือ "ไม่ได้ครับ" เพราะว่า เมื่อเบอร์ 101 โทรออก Asterisk จะเช็คและเจอว่าเบอร์ 101 อยู่ใน context=from-internal-2 มันก็จะมามองหา [from-internal-2] ในไฟล์ extensions.conf และก็แน่นอนว่าไม่เจอคำสั่งให้ Dial ไปที่เบอร์ 100 ก็เลยโทรไม่ได้ยังไงหล่ะครับ

วิธีแก้ไขก็คือ ต้องบอก Asterisk ว่า เมื่อมามองหาที่ [from-internal-2] แล้วอย่าลืมไปดูที่ [from-internal-1] ด้วย เขียนแบบนี้ครับ

[from-internal-1]
include => from-internal-2
exten => 100,1,Dial(SIP/100)
exten => 100,n,Hangup

[from-internal-2]
include => form-internal-1
exten => 101,1,Dial(SIP/101)
exten => 101,n,Hangup

ระวังนิดนึงครับสำหรับการ include ไปๆมาๆแบบนี้ เบอร์ Extension จะต้องไม่ซ้ำกันนะครับ ไม่งั้นอาจทำให้เซ็งได้