|
dome
|
 |
« Reply #5 on: October 16, 2007, 02:25:46 AM » |
|
ลองตามที่ stp แนะนำน่าจะใช้ได้นะครับ
ขออธิบายแนวคิดเรื่องสายเรียกซ้อนดังนี้นะครับ ขอแยก *70 (For Activate), *71 (For Cancel) ทิ้งไปก่อนนะครับ มันไม่ใช้ feature ของ Asterisk เป็น Feature ของ Freepbx ที่เขียน script ใน dial plan ขึ้นมาแทนการเรัยกใช้ คำสั่ง Dial แบบตรงๆ เป็นเรื่องที่ทำให้ developer ของ Asterisk หงุดหงิดมานาน เพราะ user มันจะนึกว่าลง Asterisk แล่วทำไมกด *70 ไม่ได้
ถ้าเรา create sip user ขึ้นมาแบบไม่ได้กำหนด call-limits Asterisk จะไม่สนใจเลยว่า เราจะอยู่ใน status ไหน มีคน call ปุ๊ป มันก็ส่งไปเลย เช่น exten => 222,1,Dial(SIP/dome) มีใครกด 222 มันก็ ส่ง sip ไปหา dome ตลอด โดยผลักภาระการทำ busy , accept call ไปให้ sip device เลย ถ้า sip device เช่น X-Lite มี 2 Line คนที่โทรไปเป็นคนที่ 2 ก็จะได้ไปเข้า line ที่ 2 ของ X-Lite คนที่ 3 ถึงจะได้ busy tone
Freepbx ได้กำหนด แนวคิดการโทรโดยการใช้ประโยชน์จาก internal DB ของ Asterisk (File ชื่อ astdb ) ซึ่งเป็น DB4 มีความพยายามจะเป็นเป็น SQLite แต่ยังไม่เร่งด่วนอะไร จริงๆ Asterisk ใช้ internal DB นี้ในการเก็บ Registry ของ User เพื่อจะได้ call ถูก IP , Port เวลาคนโทรหา สามารถดูได้จาก *CLI> database show /SIP/Registry/dome : 192.168.5.123:41816:3600:dome:sip:dome@192.168.5.123:41816;rinstance=c8d8cb26281e2c6a /dundi/secret : uTWkNq8mID8guggvYBvKUA== /dundi/secretexpiry : 1192474109 /mychan/dome : IAX2/dome-3 5 results found.
Internal DB นี่เราสามารถเขียนได้ ลบได้ Freepbx เลยเอามาเก็บค่า พวก * ทั้งหลายเอาไว้ เวลาจะโทรแทนที่จะ dial เลยก๋ทำเท่ห์ โดยการไปเป็น DB ก่อน เช่นเรื่อง call waiting จุกประสงค์ทำขึ้นมาเพื่อจะ ไม่รับสายเรียกซ้อน เพราะ default ของ asterisk ส่ง call ไปทั้งหมดอยู่แล้ว ตัวอย่างง่ายๆ exten => *71,1,Answer exten => *71,n,dbDel(CW/${CALLERID(number)}) exten => *71,n,Playback(call-waiting&de-activated)
exten => *70,n,Answer exten => *70,n,Set(DB(CW/${CALLERID(number)})=ENABLED) exten => *70,n,Playback(call-waiting&activated)
พอจะโทร จากเดิม exten => 222,1,Dial(SIP/dome) ก็ส่งไปใ้ห้ AGI ก่อน โดยจะเช็ค DB และ ExtensionState ผ่านทาง AGI Manager ได้ status กลับมา 0-idle; 1-busy; 4-unavail; 8-ringing แล้วค่อย dial ไป พวก CFx ทั้งหลายก็เช่นกัน
การใช้ internal DB มาทำอะไรแบบนี้จะมีปัญหามากกับการใช้ Dynamic Realtime User เพราะจะต้องหาทางอ้อมมา เปิด ปิด DB ผ่าน manager port วุ่นวาย เลยต้องแก้ด้วยการเขียน script dial ขึ้นมาใหม่ แล้วไปเรียกค่าพวก CW CFx จาก Realtime DB แทน ซึ่งสะดวกสำหรับการเขียน Web และทำ Hosted PBX สำหรับหลายองค์กร ได้สะดวกกว่า
|