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

เชื่อม Asterisk กับ Huawei SoftX3000 แล้วโทรไม่ได้

โพสต์โพสต์แล้ว: 05 ม.ค. 2010 12:49
โดย voip4share
Huawei SoftX3000 เป็น Softswitch นะครับ มีความสามารถมากมาย เราๆท่านๆคงไม่มีโอกาสซื้อมาใช้หรอกครับเพราะราคาแพงม๊ากกกก ในประเทศไทยก็มีเฉพาะผู้ให้บริการรายใหญ่ๆเท่านั้นที่ใช้กัน เช่น True NetTalk, TOTnetcall และ TT&T

เมื่อก่อน SoftX3000 นี้มีปัญหากับ Asterisk มากนะครับ เรียกได้ว่าโทรจาก Asterisk ไปไม่ได้เลย โทรไปแล้วก็ได้รับ SIP message ตอบกลับมาเป็น "500 Server Internal Error" ตลอดเลย

แต่ตอนนี้ SoftX3000 ของทั้ง True NetTalk และ TOTnetcall ไม่เจอปัญหาดังกล่าวแล้ว แต่สำหรับ SoftX3000 ของ TT&T นั้นผมไม่แน่ใจครับว่ายังมีปัญหานี้อยู่อีกหรือไม่ (พอดีไม่มีแอ๊คเค๊าท์จะลองนะครับ :P )

ปัญหาที่ทำให้เกิด "500 Server Internal Error"

sip-invite-message-default.png
Default SIP Invite Message
sip-invite-message-default.png (17.79 KiB) เปิดดู 3322 ครั้ง


สังเกตุใน "Invite" นะครับ บรรทัดล่างสุดตรงที่ผมล้อมกรอบสีแดงไว้ a=silenceSupp:off ---- นี่แหล่ะต้นตอของปัญหาทั้งหมด Huawei มันไม่รู้จะทำยังไงกับข้อความนี้ ก็เลยส่งข้อความเออเร่อร์กลับมา ถ้าจะทำให้โทรได้ ต้องเอาข้อความนี้ออกจาก Invite ของ Asterisk ครับ

Note! ไอพีแอดเดรสในตัวอย่างเป็นของ True NetTalk นะครับ ผมเอามาให้ดูเป็นตัวอย่างเพื่อให้เห็นว่า a=silenceSupp:off ---- มันอยู่ตรงไหน

วิธีการเอา a=silenceSupp:off ---- ออกจาก Invite ของ Asterisk

Note! ถึงแม้จะเอาออกไปแล้วก็ตาม Asterisk ก็ยังทำงานได้ตามปกตินะครับ ไม่มีผลกระทบอะไร สบายใจได้

วิธีการเอาออกเราต้องไปแก้ไขที่ไฟล์ chan_sip.c ของ Asterisk นะครับ โดยให้ comment บรรทัดที่มีคำว่า a=silenceSupp:off ---- ไว้ซะ แล้วก็คอมไพล์ Asterisk ใหม่ แล้วก็จะใช้งานได้

ผมจะทำให้ดูทั้งเวอร์ชั่น 1.4 และ 1.6 เลยนะครับ เพราะไฟล์ chan_sip.c ของ Asterisk สองเวอร์ชั่นนี้มันแตกต่างกันนิดหน่อย

Asterisk เวอร์ชั่น 1.4
1. แตกไฟล์ซอร์สโค๊ดของ Asterisk 1.4 สมมติว่าแตกไปไว้ที่ /usr/src/asterisk-1.4.28
2. เข้าไปที่โฟลเดอร์ /usr/src/asterisk-1.4.28/channels
3. ใช้ Text Editor เช่น vi เปิดไฟล์ chan_sip.c
[root@sip channels]# vi chan_sip.c

ค้นหาคำว่า a=silenceSupp:off แล้วก็จะเจอ 2 บรรทัดนี้

if (!p->owner || !ast_internal_timing_enabled(p->owner))
ast_build_string(&a_audio_next, &a_audio_left, "a=silenceSupp:off - - - -\r\n");


4. เมื่อเจอแล้วให้ใส่เครื่องหมาย /* และ */ คร่อม ทั้งสองบรรทัด ดังนี้

/*
if (!p->owner || !ast_internal_timing_enabled(p->owner))
ast_build_string(&a_audio_next, &a_audio_left, "a=silenceSupp:off - - - -\r\n");

*/

เพื่อไม่ให้รวม 2 บรรทัดนี้เข้าไปด้วยตอนคอมไพล์

5. บันทึกไฟล์
6. คอมไพล์ Asterisk ใหม่
โดยให้ใช้คำสั่ง make clean ก่อนนะครับ แล้วค่อย make และ make install เอาแค่ make install ก็พอนะครับ ซึ่งมันจะก๊อบปี้โมดูล (ไฟล์นามสกุล .so) ทั้งหมดรวมทั้ง chan_sip.so ไปไว้ที่โฟลเดอร์ที่เก็บโมดูล เช่น /usr/lib/asterisk/modules
7. รีสตาร์ท Asterisk

Asterisk เวอร์ชั่น 1.6
1. แตกไฟล์ซอร์สโค๊ดของ Asterisk 1.6 สมมติว่าเอาไว้ที่โฟลเดอร์ /usr/src/asterisk-1.6.1.12 นะครับ
2. เขาไปที่โฟลเดอร์ /usr/src/asterisk-1.6.1.12/channels
3. ใช้ Text Editor เปิดไฟล์ chan_sip.c

[root@sip channels]# vi chan_sip.c

แล้วค้นหาคำว่า a=silenceSupp:off ก็จะเจอ 2 บรรทัดนี้

if (!p->owner || !ast_internal_timing_enabled(p->owner))
ast_str_append(&a_audio, 0, "a=silenceSupp:off - - - -\r\n");


4. ใส่เครื่องหมาย /* */ คร่อม 2 บรรทัดนี้ ดังตัวอย่าง

/*
if (!p->owner || !ast_internal_timing_enabled(p->owner))
ast_str_append(&a_audio, 0, "a=silenceSupp:off - - - -\r\n");
*/


เพื่อไม่ให้รวม 2 บรรทัดนี้เข้าไปด้วยตอนคอมไพล์

5. บันทึกไฟล์
6. คอมไพล์ Asterisk ใหม่ โดยให้ make clean ก่อน ตามด้วย make และตามด้วย make install นะครับ
7. รีสตาร์ท Asterisk ใหม่

คำแนะนำ

วิธีที่ผมแนะนำมานี้ ใช้ได้เฉพาะคนที่ลง Asterisk เองนะครับ ไม่ได้ใช้ Elastix, Trixbox หรือ PBX In A Flash ใดๆทั้งสิ้น สำหรับท่านที่ใช้แบบรวมโปรแกรม เช่น Elastix หรือ Trixbox หรือ PBX In A Flash จะใช้วิธีนี้แบบตรงๆไม่ได้นะครับ ไม่เช่นนั้นอาจจะเกิดปัญหากับระบบของท่านได้ ผมแนะนำว่าให้เข้าไปที่เว็บไซต์ของโปรแกรมที่ใช้ จากนั้นดาวน์โหลดโมดูล Asterisk ที่เขาแก้ไขมาแล้ว แล้วเอามาคอมไพล์ใหม่ ติดตั้งใหม่ จะปลอดภัยที่สุด