เทคนิคการติดตั้งการ์ด TDM410P บน Asterisk
โพสต์แล้ว: 19 มี.ค. 2012 12:00
เทคนิคการติดตั้ง Asterisk 17.x + DAHDI 3.1.0 บน CentOS 7
*** เป็นบทความแสดงขั้นตอนการติดตั้ง Asterisk + TDM410P ภาษาไทยที่ละเอียดที่สุดเท่าที่จะหาได้ในขณะนี้ ทำตามแล้วเวอร์คเลย พร้อมคำอธิบาย ***
TDM410P เป็นการ์ดของ Digium รองรับ FXS/FXO 4 พอร์ต บนการ์ดสามารถใส่โมดูล FXS (สีเขียว) FXS (สีแดง) ได้สูงสุด 4 โมดูล (4 พอร์ต) ใส่ผสมกันก็ได้ การ์ดนี้ไม่ต้องติดตั้งไดร์เวอร์เพิ่มเติมแต่อย่างใด ไดร์เวอร์ของมันมีรวมอยู่ใน DAHDI อยู่แล้วครับ แค่ติดตั้ง DAHDI ก็ใช้งานได้แล้ว
มาดูวิธีการติดตั้งการ์ด TDM410P กันเลยครับ
เครื่องที่ใช้ทดสอบมีเสป็คตามนี้ครับ Celeron Dual Core (รันแบบ 64 บิตได้), Ram 2 GB, HDD SATA 120 GB ติดตั้งโปรแกรมหลักๆดังต่อไปนี้
- CentOS 5.8 x86_64
- Asterisk 1.6.2.23
- Dahdi 2.5.0.2
อย่าลืมปิด SELinux บน CentOS ด้วยนาครับ ไม่งั้นอาจจะเกิดเหตุการณ์อันน่าปวดหัวได้ เป็นต้นว่า ลงโปรแกรมไม่ได้ คอมไพล์ไม่ผ่าน
และมีโปรแกรมอื่นๆอีกซึ่งอาจจะยังไม่ได้ใช้งานในขณะนี้
** บทความต่อไปนี้จะบอกวิธีการติดตั้ง Asterisk 1.6.2.23 ด้วยนะครับ ซึ่งก็เหมาะสำหรับมือใหม่ **
1. ติดตั้งโปรแกรมอื่นที่จำเป็น
เครื่องผมลง CentOS x86_64 นะครับ เวลาติดตั้งโปรแกรมก็เลยต้องเอาให้ชัวร์ว่าเป็นแบบ x86_64 ไม่ติดตั้ง i386 ด้วย (บางโปรแกรมถ้าเราไม่ได้ระบุ มันก็จะติดตั้งทั้ง i386 และ x86_64)
ติดตั้ง PHP (ถ้ายังไม่มีแผนว่าจะรันเว็บในเครื่องนี้หรือเขียน php scripts บนเครื่องนี้ก็ยังไม่ต้องติดตั้งก็ได้นะครับ หรือจะติดตั้งเลยก็ได้ ไม่หน่วงเครื่องและแทบไม่เปลืองฮาร์ดดิสก์)
แก้ไขไฟล์ /etc/php.ini
เช็คดูว่าเครื่องมองเห็นการ์ดหรือไม่ รันคำสั่ง
ก็จะเห็นบรรทัดประมาณนี้ครับ นี่คือการ์ด TDM410P
ติดตั้ง Radiusclient-ng
ติดตั้ง Spandsp
สร้างไฟล์ /usr/include/linux/compiler.h
ใส่ข้อมูลตามนี้
ติดตั้ง Pwlib
พิมพ์บรรทัดต่อไปนี้
ติดตั้ง OpenH323
2. ติดตั้ง DAHDI 2.5.0.2 และ OSLEC
พิมพ์คำสั่งต่อไปนี้
ติดตั้ง Libpri
3. ติดตั้ง Asterisk 1.6.2.23
เลือกออปชั่นที่จะติดตั้ง ปกติผมก็จะเลือกเพิ่ม Core Sound Packages ให้มีไฟล์เสียง G.729 ด้วยและติดตั้งไฟล์เสียง G.729 ใน Extras Sound Packages
4. ติดตั้ง Asterisk Add-Ons
** เอา Channel Drivers -> chan_ooh323 ออก **
5. คอนฟิก DAHDI เพิ่มเติม
5.1 ไฟล์ /etc/dahdi/modules
ใส่ # หน้าบรรทัดไดร์เวอร์ที่ไม่ได้ใช้งานครับ การ์ด TDM410P ใช้ไดร์เวอร์ชื่อ wctdm24xxp ดังนั้นบรรทัดอื่นที่ไม่ใช่อันนี้ควรจะใส่เครื่องหมาย # ไว้หน้าเพื่อไม่ให้โหลด
5.2 ไฟล์ /etc/dahdi/genconf_parameters
เครื่องผมมีอยู่ 2 บรรทัดแค่นี้ครับ บรรทัดแรกกำหนดชื่อ context มีชื่อเป็น from-pstn (ชื่อดีฟอลท์) แต่เราก็เปลี่ยนชื่อได้ตามใจชอบ ชื่อ context นี้สำคัญนะครับมันเอาไว้สร้าง Dialplan ตอนรับสายเข้ามา ประมาณว่าถ้าอ้างชื่อผิดไปแม้แต่ตัวอักษรเดียวก็จะโทรไม่เข้า
ส่วนบรรทัดที่ 2 กำหนดว่าเราจะใช้ Echo canceller (แบบ Software) แบบ OSLEC หาอ่านบทความเกี่ยวกับ OSLEC ได้ที่ลิ้งค์ท้ายบทความ
5.3 สตาร์ท DAHDI
รันคำสั่งนี้
ผลลัพธ์
5.4 สร้างไฟล์ /etc/dahdi/system.conf
รันคำสั่งต่อไปนี้
ไม่มีอะไรโชว์ขึ้นมานะครับ แต่เมื่อเช็คดูในไฟล์ /etc/dahdi/system.conf จะเห็นแบบนี้
5.5 ไฟล์ /etc/asterisk/dahdi-channels.conf
ไฟล์นี้ถูกสร้างตอนรันคำสั่ง dahdi_genconf
5.6 ตรวจสอบ DAHDI Status
รันคำสั่งนี้
ผลลัพธ์
มันเหมือนจะ OK ครับแต่ว่ามันยังไม่ได้บอกเราว่ามันจะใช้ Echo Canceller แบบไหน
5.7 รีสตาร์ท DAHDI อีกครั้ง
รีสตาร์ทคราวนี้เพื่อให้มันรู้ว่ามันต้องใช้ Echo Cancanceller
ผลลัพธ์
ตอนนี้ OK หล่ะครับ มันใช้ Echo Canceller แบบ OSLEC
5.8 ไฟล์ /etc/asterisk/chan_dahdi.conf
เป็นไฟล์ที่ Asterisk จะติดต่อกับการ์ด TDM410P ครับ ไฟล์นี้มีข้อมูลเยอะมากมาย ผมแนะนำให้สร้างไฟล์ขึ้นมาใหม่จะดีกว่าครับให้มีข้อมูลเท่าที่จำเป็นจริงๆ
ให้มีข้อมูลประมาณนี้ครับ
อย่าลืมบรรทัดสุดท้ายนะครับเป็นการเรียกไฟล์ dahdi-channels.conf ถ้าเราไม่เพิ่มไฟล์นี้เข้าไปก็จะมีปัญหาเวลารัน Asterisk มันจะมองไม่เห็นการ์ด
6. Asterisk
6.1 สตาร์ท Asterisk
6.2 ให้ Asterisk สตาร์ทตอนเปิดเครื่อง
6.3 เช็ค Process
ผลลัพธ์
root 6234 1 0 06:06 pts/0 00:00:00 /bin/sh /usr/sbin/safe_asterisk
root 6239 6234 1 06:06 pts/0 00:00:00 /usr/sbin/asterisk -f -vvvg -c
6.4 ติดตั้ง Codec G.723 และ G.729
รายละเอียดจริงๆของวิธีการติดตั้ง Free codecs G.723.1 และ G.729 อ่านได้จากบทความนี้ครับ ติดตั้ง G.723.1 และ G.729 ให้ Asterisk
ได้ว่าเครื่องผมต้องใช้ไฟล์ 2 ไฟล์นี้
6.5 เช็คว่า Asterisk มองเห็นการ์ด (พอร์ต) หรือไม่
รันคำสั่งนี้
ผลลัพธ์
ก็มองเห็นครับ
6.6 โชว์หมายเลขพอร์ตบนการ์ดที่ Asterisk มองเห็น
รันคำสั่งนี้
ผลลัพธ์
มองเห็นทั้ง 4 พอร์ต แต่ละพอร์ตอยู่ใน Context ชื่อ from-pstn เวลาเราคอนฟิก Dialplan เรียกใช้งานพอร์ตเหล่านี้ก็อ้างอิงหมายเลขพอร์ตตามที่โชว์นั่นแหล่ะครับ
ดูพอร์ตที่ 1 ซึ่งผมต่อสายโทรศัพท์ไว้ รันคำสั่งนี้
ผลลัพธ์
ก็เป็นอันว่า Asterisk มองเห็นการ์ด TDM410P เรียบร้อยแล้ว ก็พร้อมจะคอนฟิกให้โทรออกและรับสายเรียกเข้าผ่านทางการ์ดได้แล้ว
7. รีสตาร์ทเครื่อง และเช็ค DAHDI Status อีกรอบ
รอจนบู๊ตเสร็จ แล้วรันคำสั่งนี้
ผลลัพธ์ OK
8. SIP Extensions ไว้เพื่อทดสอบ
8.1 สร้าง SIP Extensions ไว้เพื่อทดสอบ
ผมจะสร้างเบอร์ Extensions 2 เบอร์คือ 88000 และ 88001 เปิดไฟล์ /etc/asterisk/sip.conf ขึ้นมา ค้นหาบรรทัด [basic-options](!) แล้ว paste บรรทัดต่อไปนี้ไว้ก่อนบรรทัดนั้น
รันคำสั่งต่อไปนี้
8.2 ปิด iptables ก่อนชั่วคราว
ไว้ให้เทสผ่านก่อนแล้วค่อยเปิดและคอนฟิกให้ VoIP ผ่านได้
รันคำสั่งต่อไปนี้
8.3 รีจิสเตอร์ SIP Account
คอนฟิก Softphone (เพราะง่ายสุด) ให้รีจิสเตอร์ ผมใช้โปรแกรม Zoiper เวอร์ชั่นที่มี G.729 (หาได้จากในเว็บแชร์ไฟล์ทั่วไป)
8.4 เช็คว่าบน Asterisk เห็นยูสเซอร์รีจิสเตอร์
รันคำสั่งนี้
ผลลัพธ์
ผลลัพธ์
จะเห็นว่าเบอร์ 88000 รีจิสเตอร์เข้ามาแล้ว พร้อมทดสอบ
8.5 คอนฟิก Dialplan อย่างง่ายๆ
ให้ SIP Account โทรเข้ามาทดสอบได้
ไฟล์ /etc/asterisk/extensions.conf
เปลี่ยนชื่อไฟล์ /etc/asterisk/extensions.conf ไฟล์เดิมให้เป็นชื่อใหม่ก่อน
แล้วสร้างไฟล์ขึ้นมาใหม่
ให้มีข้อมูลตามนี้
8.6 รีโหลด Dialplan
รันคำสั่งนี้
เทสโทรจาก Softphone กด 1234 ถ้าได้ยินเสียงก็แสดงว่าเวอร์คแล้ว มาดูข้อความบน Asterisk Console ขณะโทรเข้ามาเทสครับ
เข้า Asterisk Console พิมพ์คำสั่งนี้
ข้อความที่โชว์
เราก็พร้อมจะทำการทดสอบโทรเข้าและออกผ่านทางการ์ด TDM410P แล้ว
9. คอนฟิกแบ่ง Group
ปกติถ้าในเครื่องมีการ์ดเดียว (หรือหลายๆการ์ด) เราควรจะแบ่งพอร์ตให้ชัดเจนเลยว่าจะใช้พอร์ตไหนโทรเข้า พอร์ตไหนไว้โทรออก หรือพอร์ตไหนไว้เป็นเบอร์แฟกซ์ ยกตัวอย่าง โทรเข้าพอร์ต 1,2 โทรออกพอร์ต 3,4
เพราะฉะนั้นเราก็แบ่งออกเป็น 2 Groups เอาเป็น Group 0, 1 หล่ะกันครับ โดยที่พอร์ต 1-2 อยู่ Group 0 พอร์ต 3-4 อยู่ Group 1
เราแบ่ง Group ในไฟล์ /etc/asterisk/dahdi-channels.conf โดยแก้เลข 0 ในบรรทัด group=0 เป็นค่าที่เราต้องการ
*** ถ้ายังมองประโยชน์ของการแบ่ง Group ไม่เคลียร์นะครับ ให้นึกเอาว่า ตอนเราโทรออก (โทรจาก Softphone ผ่านการ์ดออกไปภายนอก) ถ้ามันออกทางพอร์ตที่เราไม่ต้องการให้ออก เป็นต้นว่าพอร์ตนั้นเอาไว้รับสายเข้า พอร์ตนั้นเอาไว้ให้คนส่งแฟกซ์เข้ามา พอร์ตนั้นต่อกับเบอร์ที่มีค่าโทรแพงๆ มันก็ไม่ค่อยจะดีใช่ป่ะครับ ***
รันคำสั่งต่อไปนี้
เช็ค Group ด้วยคำสั่งต่อไปนี้
ผลลัพธ์
ก็เป็นอันว่าเราแบ่งทั้ง 4 พอร์ตออกเป็น 2 Groups เรียบร้อยแล้ว เวลาเรียกใช้งานพอร์ตเราสามารถอ้างค่าหมายเลข Group ของมันแทนได้ ซึ่ง Asterisk จะเช็คว่ามีพอร์ตไหนว่างอยู่ก็จะใช้พอร์ตนั้น ถ้าไม่มีพอร์ตว่างและเราไม่ได้ให้มันส่งออกไปทางอื่นก็จะส่ง busy ให้ได้ยิน
การอ้างอิงหมายเลข Group ทำได้ 4 แบบครับ โดยใช้ตัวอักษร G, g, R, r ตามด้วยหมายเลข group ยกตัวอย่าง
G0 หมายถึงใช้พอร์ตในกรุ๊ปโดยใช้พอร์ตที่มีหมายเลขน้อยสุดก่อน ถ้าไม่ว่างค่อยใช้พอร์ตหมายเลขสูงกว่า (พอร์ตแรกในกรุ๊ปจะถูกใช้งานเยอะที่สุด)
g0 หมายถึงใช้พอร์ตในกรุ๊ปโดยใช้พอร์ตที่มีหมายเลขมากที่สุดก่อน ถ้าไม่ว่างค่อยใช้พอร์ตหมายเลขต่ำกว่า (พอร์ตสุดท้ายในกรุ๊ปจะถูกใช้งานเยอะสุด)
R0 หมายถึงใช้พอร์ตในกรุ๊ปแบบวนไปเรื่อยๆ หรือที่เราเรียกว่า Round Robbin โดยเริ่มจากพอร์ตที่มีหมายเลขต่ำสุดก่อน แล้ววนไปเรื่อยๆ (ทุกพอร์ตถูกใช้งานเท่าๆกัน)
r0 หมายถึงใช้พอร์ตในกรุ๊ปแบบวนไปเรื่อยๆ (แบบเดียวกับ R0) แต่เริ่มจากพอร์ตหมายเลขสูงที่สุดก่อน
*** เปลี่ยนหมายเลข Group แล้ว ห้ามมมมมมมม รันคำสั่ง dahdi_genconf อีกนะครับ ไม่อย่างนั้นก็ต้องมาทำใหม่อีก ยกเว้นต้องการเลิกแบ่ง Group แล้ว ***
10. คอนฟิก Dialplan โทรออกผ่านการ์ด
ตั้งเงื่อนไขการโทรออกพอร์ต FXO ว่า กด 0 นำหน้าตามด้วยเลขอะไรก็ได้
ไฟล์ /etc/asterisk/extensions.conf
เซฟไฟล์แล้วรีโหลด Dialplan
ทดสอบโทรออก
เข้า Asterisk Console เพื่อดู Events ที่เกิดขึ้นขณะเราทดสอบ จาก Softphone โทรออกสายนอกกด 0x ได้เลย เช่น 0851619439
ข้อความขณะโทรออก
-- Executing [0851619439@from-internal:1] Dial("SIP/88000-00000001", "DAHDI/G0/0851619439,60") in new stack
-- Called G0/0851619439
-- DAHDI/1-1 answered SIP/88000-00000001
ก็คุยได้ครับ เป็นอันว่าคอนฟิกโทรออกผ่านการ์ดได้แล้ว
11. คอนฟิก Dialplan รับสายเข้า
ตอนคอนฟิกการ์ดให้รับสายเข้า จะยุ่งยากนิดนึงก็ตรงเรื่องของ Context ครับ ซึ่งถ้าสังเกตุในไฟล์ /etc/asterisk/dahdi-channels.conf จะเห็นมีบรรทัด context=from-pstn อยู่ในทุกๆพอร์ต
;;; line="1 WCTDM/0/0 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
context ชื่อ from-pstn เป็นค่าดีฟอลท์ของพอร์ต FXO แต่เราจะแก้ไขเป็นค่าอื่นก็ได้เช่น from-zaptel (แต่ถ้ารันคำสั่ง dahdi_genconf ก็จะกลับมาเป็นค่าเดิมอีก ยกเว้นเราไปใส่บรรทัด context_lines from-zaptel ไว้ในไฟล์ /etc/dahdi/genconf_parameters ไม่ว่าจะรัน dahdi_genconf อีกกี่รอบมันก็จะไม่เปลี่ยน)
context เอาไว้คอนโทรลตอนรับสายเข้าครับ แต่ละพอร์ต (ที่ใช้รับสายเข้า) ก็ไม่จำเป็นว่าต้องมี context ชื่อเดียวกัน เราคอนฟิกได้ว่าถ้าโทรมาเข้าพอร์ตๆนี้จะให้ไปรันหรือเรียกอะไรขึ้นมาทำงาน ตอนโทรเข้าจะไม่เกี่ยวกับ Group แล้วนะครับ (Group มันเอาไว้ตอนโทรออกอย่างเดียว) ถึงเราจะคอนฟิกให้พอร์ตที่รับสายเข้ามีหลายๆพอร์ต เราก็แยกได้ว่าแต่ละพอร์ตเอาไว้ทำอะไร เป็นอิสระจากกันเลย
มาดูตัวอย่างกันครับจะเข้าใจง่ายขึ้น ผมตั้งเงื่อนไขการโทรเข้าไว้อย่างง่ายๆว่า โทรเข้าแล้วให้ดังที่เบอร์ Extensions 88000 เลย
ไฟล์ /etc/asterisk/extensions.conf
รีโหลด Dialplan
โทรเข้าเบอร์ที่ต่ออยู่ บนหน้าจอ Asterisk Console จะปรากฏข้อความคล้ายๆแบบนี้
เบอร์ Extensions 88000 ที่ผมรีจิสเตอร์อยู่ด้วย Softphone จะ Ring รับสายแล้วคุยกันได้เลย
บทความที่เกี่ยวข้อง
กำจัดเสียง Echo เวลาโทรผ่านการ์ด FXS/FXO/E1 ด้วย OSLEC
ติดตั้ง G.723.1 และ G.729 ให้ Asterisk
เชื่อมต่อ TDM410P กับ GSM Fixed Wireless Terminal
เทคนิคการติดตั้งการ์ด TDM400P บน Asterisk
*** เป็นบทความแสดงขั้นตอนการติดตั้ง Asterisk + TDM410P ภาษาไทยที่ละเอียดที่สุดเท่าที่จะหาได้ในขณะนี้ ทำตามแล้วเวอร์คเลย พร้อมคำอธิบาย ***
TDM410P เป็นการ์ดของ Digium รองรับ FXS/FXO 4 พอร์ต บนการ์ดสามารถใส่โมดูล FXS (สีเขียว) FXS (สีแดง) ได้สูงสุด 4 โมดูล (4 พอร์ต) ใส่ผสมกันก็ได้ การ์ดนี้ไม่ต้องติดตั้งไดร์เวอร์เพิ่มเติมแต่อย่างใด ไดร์เวอร์ของมันมีรวมอยู่ใน DAHDI อยู่แล้วครับ แค่ติดตั้ง DAHDI ก็ใช้งานได้แล้ว
มาดูวิธีการติดตั้งการ์ด TDM410P กันเลยครับ
เครื่องที่ใช้ทดสอบมีเสป็คตามนี้ครับ Celeron Dual Core (รันแบบ 64 บิตได้), Ram 2 GB, HDD SATA 120 GB ติดตั้งโปรแกรมหลักๆดังต่อไปนี้
- CentOS 5.8 x86_64
- Asterisk 1.6.2.23
- Dahdi 2.5.0.2
อย่าลืมปิด SELinux บน CentOS ด้วยนาครับ ไม่งั้นอาจจะเกิดเหตุการณ์อันน่าปวดหัวได้ เป็นต้นว่า ลงโปรแกรมไม่ได้ คอมไพล์ไม่ผ่าน
และมีโปรแกรมอื่นๆอีกซึ่งอาจจะยังไม่ได้ใช้งานในขณะนี้
** บทความต่อไปนี้จะบอกวิธีการติดตั้ง Asterisk 1.6.2.23 ด้วยนะครับ ซึ่งก็เหมาะสำหรับมือใหม่ **
1. ติดตั้งโปรแกรมอื่นที่จำเป็น
เครื่องผมลง CentOS x86_64 นะครับ เวลาติดตั้งโปรแกรมก็เลยต้องเอาให้ชัวร์ว่าเป็นแบบ x86_64 ไม่ติดตั้ง i386 ด้วย (บางโปรแกรมถ้าเราไม่ได้ระบุ มันก็จะติดตั้งทั้ง i386 และ x86_64)
- โค้ด: เลือกทั้งหมด
yum -y install kernel-devel.x86_64 kernel-headers.x86_64 gcc.x86_64 gcc-c++.x86_64 bison.x86_64 flex.x86_64 patch.x86_64 make.x86_64 ncurses.x86_64 ncurses-devel.x86_64 newt.x86_64 newt-devel.x86_64 autoconf automake libxml2-devel.x86_64 mysql.x86_64 mysql-devel.x86_64 mysql-server.x86_64 libtiff.x86_64 libtiff-devel.x86_64 net-snmp.x86_64 net-snmp-libs.x86_64 net-snmp-devel.x86_64 net-snmp-utils.x86_64 net-snmp-perl.x86_64 wireshark.x86_64 httpd.x86_64 httpd-devel.x86_64 libc-client.x86_64 libmcrypt.x86_64 mod_ssl.x86_64 ntp.x86_64 gmp.x86_64 libxslt.x86_64 libxslt-devel.x86_64
- โค้ด: เลือกทั้งหมด
yum -y update openssl.x86_64 openssl-devel.x86_64 mod_ssl.x86_64
ติดตั้ง PHP (ถ้ายังไม่มีแผนว่าจะรันเว็บในเครื่องนี้หรือเขียน php scripts บนเครื่องนี้ก็ยังไม่ต้องติดตั้งก็ได้นะครับ หรือจะติดตั้งเลยก็ได้ ไม่หน่วงเครื่องและแทบไม่เปลืองฮาร์ดดิสก์)
- โค้ด: เลือกทั้งหมด
rpm -ihv 'http://www.voip4share.com/sources/php-5.2.17-1.x86_64.rpm' --nodeps
rpm -ivh 'http://www.voip4share.com/sources/php-common-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-cli-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-bcmath-5.2.17-1.x86_64.rpm'
rpm -ihv 'http://www.voip4share.com/sources/php-devel-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-gd-5.2.17-1.x86_64.rpm'
rpm -ihv 'http://www.voip4share.com/sources/php-imap-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-ldap-5.2.17-1.x86_64.rpm'
rpm -ihv 'http://www.voip4share.com/sources/php-mbstring-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-mcrypt-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-pdo-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-mysql-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-ncurses-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-readline-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-snmp-5.2.17-1.x86_64.rpm'
rpm -ihv 'http://www.voip4share.com/sources/php-soap-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-xml-5.2.17-1.x86_64.rpm'
rpm -ivh 'http://www.voip4share.com/sources/php-xmlrpc-5.2.17-1.x86_64.rpm'
แก้ไขไฟล์ /etc/php.ini
- โค้ด: เลือกทั้งหมด
upload_max_filesize = 20M
max_execution_time = 60
memory_limit = 64M
เช็คดูว่าเครื่องมองเห็นการ์ดหรือไม่ รันคำสั่ง
- โค้ด: เลือกทั้งหมด
lspci
ก็จะเห็นบรรทัดประมาณนี้ครับ นี่คือการ์ด TDM410P
- โค้ด: เลือกทั้งหมด
02:03.0 Ethernet controller: Digium, Inc. TDM400P (rev 11)
ติดตั้ง Radiusclient-ng
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/radiusclient-ng-0.5.6.tar.gz'
tar xzvf radiusclient-ng-0.5.6.tar.gz -C /usr/src/
cd /usr/src/radiusclient-ng-0.5.6
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var
make && make install
ติดตั้ง Spandsp
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/spandsp-0.0.6pre18.tgz'
tar xzvf spandsp-0.0.6pre18.tgz -C /usr/src
cd /usr/src/spandsp-0.0.6
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var
make clean
make
make install
สร้างไฟล์ /usr/include/linux/compiler.h
- โค้ด: เลือกทั้งหมด
vi /usr/include/linux/compiler.h
ใส่ข้อมูลตามนี้
- โค้ด: เลือกทั้งหมด
#ifndef __LINUX_COMPILER_H
#define __LINUX_COMPILER_H
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
#endif /* __LINUX_COMPILER_H */
ติดตั้ง Pwlib
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/pwlib-v1_10_3-src-tar.gz'
tar xzvf pwlib-v1_10_3-src-tar.gz -C /usr/src
cd /usr/src/pwlib_v1_10_3
./configure --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc
make clean
make optshared
make install
พิมพ์บรรทัดต่อไปนี้
- โค้ด: เลือกทั้งหมด
export PWLIBDIR=/usr/src/pwlib_v1_10_3
export OPENH323DIR=/usr/src/openh323_v1_18_0
export LD_LIBRARY_PATH=$PWLIBDIR/lib:$OPENH323DIR/lib
ติดตั้ง OpenH323
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/openh323-v1_18_0-src-tar.gz'
tar xzvf openh323-v1_18_0-src-tar.gz -C /usr/src
cd /usr/src/openh323_v1_18_0
./configure --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc
make clean
make optshared
make install
2. ติดตั้ง DAHDI 2.5.0.2 และ OSLEC
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/dahdi-linux-complete-2.5.0.2+2.5.0.2.tar.gz'
wget 'http://www.voip4share.com/sources/oslec-dahdi.tar.gz'
tar xzvf dahdi-linux-complete-2.5.0.2+2.5.0.2.tar.gz -C /usr/src
tar xzvf oslec-dahdi.tar.gz -C /usr/src/dahdi-linux-complete-2.5.0.2+2.5.0.2/linux/drivers
พิมพ์คำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
sed -i "s|#obj-m += dahdi_echocan_oslec.o|obj-m += dahdi_echocan_oslec.o|" /usr/src/dahdi-linux-complete-2.5.0.2+2.5.0.2/linux/drivers/dahdi/Kbuild
sed -i "s|#obj-m += ../staging/echo/|obj-m += ../staging/echo/|" /usr/src/dahdi-linux-complete-2.5.0.2+2.5.0.2/linux/drivers/dahdi/Kbuild
echo 'obj-m += echo.o' > /usr/src/dahdi-linux-complete-2.5.0.2+2.5.0.2/linux/drivers/staging/echo/Kbuild
- โค้ด: เลือกทั้งหมด
cd /usr/src/dahdi-linux-complete-2.5.0.2+2.5.0.2
make all
make install
make config
chkconfig dahdi on
ติดตั้ง Libpri
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/libpri-1.4.12.tar.gz'
tar xzvf libpri-1.4.12.tar.gz -C /usr/src
cd /usr/src/libpri-1.4.12
make
make install
3. ติดตั้ง Asterisk 1.6.2.23
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/asterisk-1.6.2.23.tar.gz'
tar xzvf asterisk-1.6.2.23.tar.gz -C /usr/src
cd /usr/src/asterisk-1.6.2.23
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var
make menuselect
เลือกออปชั่นที่จะติดตั้ง ปกติผมก็จะเลือกเพิ่ม Core Sound Packages ให้มีไฟล์เสียง G.729 ด้วยและติดตั้งไฟล์เสียง G.729 ใน Extras Sound Packages
- โค้ด: เลือกทั้งหมด
make
make install
make samples
make config
4. ติดตั้ง Asterisk Add-Ons
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/asterisk-addons-1.6.2.4.tar.gz'
tar xzvf asterisk-addons-1.6.2.4.tar.gz -C /usr/src
cd /usr/src/asterisk-addons-1.6.2.4
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var
make menuselect
** เอา Channel Drivers -> chan_ooh323 ออก **
- โค้ด: เลือกทั้งหมด
make
make install
make samples
5. คอนฟิก DAHDI เพิ่มเติม
5.1 ไฟล์ /etc/dahdi/modules
- โค้ด: เลือกทั้งหมด
vi /etc/dahdi/modules
ใส่ # หน้าบรรทัดไดร์เวอร์ที่ไม่ได้ใช้งานครับ การ์ด TDM410P ใช้ไดร์เวอร์ชื่อ wctdm24xxp ดังนั้นบรรทัดอื่นที่ไม่ใช่อันนี้ควรจะใส่เครื่องหมาย # ไว้หน้าเพื่อไม่ให้โหลด
- โค้ด: เลือกทั้งหมด
wctdm24xxp
5.2 ไฟล์ /etc/dahdi/genconf_parameters
เครื่องผมมีอยู่ 2 บรรทัดแค่นี้ครับ บรรทัดแรกกำหนดชื่อ context มีชื่อเป็น from-pstn (ชื่อดีฟอลท์) แต่เราก็เปลี่ยนชื่อได้ตามใจชอบ ชื่อ context นี้สำคัญนะครับมันเอาไว้สร้าง Dialplan ตอนรับสายเข้ามา ประมาณว่าถ้าอ้างชื่อผิดไปแม้แต่ตัวอักษรเดียวก็จะโทรไม่เข้า
ส่วนบรรทัดที่ 2 กำหนดว่าเราจะใช้ Echo canceller (แบบ Software) แบบ OSLEC หาอ่านบทความเกี่ยวกับ OSLEC ได้ที่ลิ้งค์ท้ายบทความ
- โค้ด: เลือกทั้งหมด
context_lines from-pstn
echo_can oslec
5.3 สตาร์ท DAHDI
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
service dahdi start
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Loading DAHDI hardware modules:
wctdm24xxp: [ OK ]
Running dahdi_cfg: [ OK ]
5.4 สร้างไฟล์ /etc/dahdi/system.conf
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
dahdi_genconf
ไม่มีอะไรโชว์ขึ้นมานะครับ แต่เมื่อเช็คดูในไฟล์ /etc/dahdi/system.conf จะเห็นแบบนี้
- โค้ด: เลือกทั้งหมด
# Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
fxsks=1
echocanceller=oslec,1
fxsks=2
echocanceller=oslec,2
fxsks=3
echocanceller=oslec,3
fxsks=4
echocanceller=oslec,4
# Global data
loadzone = us
defaultzone = us
5.5 ไฟล์ /etc/asterisk/dahdi-channels.conf
ไฟล์นี้ถูกสร้างตอนรันคำสั่ง dahdi_genconf
- โค้ด: เลือกทั้งหมด
; Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
;;; line="1 WCTDM/0/0 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/0/1 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/0/2 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
callerid=
group=
context=default
;;; line="4 WCTDM/0/3 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 4
callerid=
group=
context=default
5.6 ตรวจสอบ DAHDI Status
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
service dahdi status
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
### Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
1 FXO FXSKS
2 FXO FXSKS RED
3 FXO FXSKS RED
4 FXO FXSKS RED
มันเหมือนจะ OK ครับแต่ว่ามันยังไม่ได้บอกเราว่ามันจะใช้ Echo Canceller แบบไหน
5.7 รีสตาร์ท DAHDI อีกครั้ง
รีสตาร์ทคราวนี้เพื่อให้มันรู้ว่ามันต้องใช้ Echo Cancanceller
- โค้ด: เลือกทั้งหมด
service dahdi restart
service dahdi status
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
### Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
1 FXO FXSKS (EC: OSLEC - INACTIVE)
2 FXO FXSKS (EC: OSLEC - INACTIVE) RED
3 FXO FXSKS (EC: OSLEC - INACTIVE) RED
4 FXO FXSKS (EC: OSLEC - INACTIVE) RED
ตอนนี้ OK หล่ะครับ มันใช้ Echo Canceller แบบ OSLEC
5.8 ไฟล์ /etc/asterisk/chan_dahdi.conf
เป็นไฟล์ที่ Asterisk จะติดต่อกับการ์ด TDM410P ครับ ไฟล์นี้มีข้อมูลเยอะมากมาย ผมแนะนำให้สร้างไฟล์ขึ้นมาใหม่จะดีกว่าครับให้มีข้อมูลเท่าที่จำเป็นจริงๆ
- โค้ด: เลือกทั้งหมด
mv /etc/asterisk/chan_dahdi.conf /etc/asterisk/chan_dahdi.conf.backup
- โค้ด: เลือกทั้งหมด
vi /etc/asterisk/chan_dahdi.conf
ให้มีข้อมูลประมาณนี้ครับ
- โค้ด: เลือกทั้งหมด
[trunkgroups]
[channels]
usercallerid=yes
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
;relaxdtmf=yes
;rxgain=2.0
;txgain=3.0
group=1
callgroup=1
pickupgroup=1
;immediate=yes
callerid=asreceived
busydetect=yes
busycount=3
;busypattern=500,500
;answeronpolarityswitch=yes
;hanguponpolarityswitch=yes
; -- FXO --
;ringtimeout=8000
;pulsedial=yes
;faxdetect=both
;faxbuffer=6,full
;jitter=4
#include dahdi-channels.conf
อย่าลืมบรรทัดสุดท้ายนะครับเป็นการเรียกไฟล์ dahdi-channels.conf ถ้าเราไม่เพิ่มไฟล์นี้เข้าไปก็จะมีปัญหาเวลารัน Asterisk มันจะมองไม่เห็นการ์ด
6. Asterisk
6.1 สตาร์ท Asterisk
- โค้ด: เลือกทั้งหมด
service asterisk start
6.2 ให้ Asterisk สตาร์ทตอนเปิดเครื่อง
- โค้ด: เลือกทั้งหมด
chkconfig asterisk on
6.3 เช็ค Process
- โค้ด: เลือกทั้งหมด
ps -ef | grep asterisk
ผลลัพธ์
root 6234 1 0 06:06 pts/0 00:00:00 /bin/sh /usr/sbin/safe_asterisk
root 6239 6234 1 06:06 pts/0 00:00:00 /usr/sbin/asterisk -f -vvvg -c
6.4 ติดตั้ง Codec G.723 และ G.729
รายละเอียดจริงๆของวิธีการติดตั้ง Free codecs G.723.1 และ G.729 อ่านได้จากบทความนี้ครับ ติดตั้ง G.723.1 และ G.729 ให้ Asterisk
ได้ว่าเครื่องผมต้องใช้ไฟล์ 2 ไฟล์นี้
- โค้ด: เลือกทั้งหมด
cd /tmp
wget http://asterisk.hosting.lv/bin162/codec_g723-ast16-gcc4-glibc-x86_64-pentium4.so
wget http://asterisk.hosting.lv/bin162/codec_g729-ast16-gcc4-glibc-x86_64-pentium4.so
- โค้ด: เลือกทั้งหมด
cp codec_g729-ast16-gcc4-glibc-x86_64-pentium4.so /usr/lib/asterisk/modules/codec_g729.so
cp codec_g723-ast16-gcc4-glibc-x86_64-pentium4.so /usr/lib/asterisk/modules/codec_g723.so
asterisk -rx "module load codec_g723.so"
asterisk -rx "module load codec_g729.so"
6.5 เช็คว่า Asterisk มองเห็นการ์ด (พอร์ต) หรือไม่
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show status"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show status"
Description Alarms IRQ bpviol CRC4 Fra Codi Options LBO
Wildcard TDM410P OK 0 0 0 CAS Unk 0 db (CSU)/0-133 feet (DSX-1)
ก็มองเห็นครับ
6.6 โชว์หมายเลขพอร์ตบนการ์ดที่ Asterisk มองเห็น
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show channels"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Chan Extension Context Language MOH Interpret Blocked State
pseudo default default In Service
1 from-pstn default In Service
2 from-pstn default In Service
3 from-pstn default In Service
4 from-pstn default In Service
มองเห็นทั้ง 4 พอร์ต แต่ละพอร์ตอยู่ใน Context ชื่อ from-pstn เวลาเราคอนฟิก Dialplan เรียกใช้งานพอร์ตเหล่านี้ก็อ้างอิงหมายเลขพอร์ตตามที่โชว์นั่นแหล่ะครับ
ดูพอร์ตที่ 1 ซึ่งผมต่อสายโทรศัพท์ไว้ รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show channel 1"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Channel: 1
File Descriptor: 23
Span: 1
Extension:
Dialing: no
Context: from-pstn
Caller ID:
Calling TON: 0
Caller ID name:
Mailbox: none
Destroy: 0
InAlarm: 0
Signalling Type: FXS Kewlstart
Radio: 0
Owner: <None>
Real: <None>
Callwait: <None>
Threeway: <None>
Confno: -1
Propagated Conference: -1
Real in conference: 0
DSP: no
Busy Detection: yes
Busy Count: 3
Busy Pattern: 0,0
TDD: no
Relax DTMF: no
Dialing/CallwaitCAS: 0/0
Default law: ulaw
Fax Handled: no
Pulse phone: no
DND: no
Echo Cancellation:
128 taps
currently OFF
Wait for dialtone: 0ms
Actual Confinfo: Num/0, Mode/0x0000
Actual Confmute: No
Hookstate (FXS only): Offhook
ก็เป็นอันว่า Asterisk มองเห็นการ์ด TDM410P เรียบร้อยแล้ว ก็พร้อมจะคอนฟิกให้โทรออกและรับสายเรียกเข้าผ่านทางการ์ดได้แล้ว
7. รีสตาร์ทเครื่อง และเช็ค DAHDI Status อีกรอบ
- โค้ด: เลือกทั้งหมด
reboot
รอจนบู๊ตเสร็จ แล้วรันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
service dahdi status
ผลลัพธ์ OK
- โค้ด: เลือกทั้งหมด
### Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
1 FXO FXSKS (EC: OSLEC - INACTIVE)
2 FXO FXSKS (EC: OSLEC - INACTIVE) RED
3 FXO FXSKS (EC: OSLEC - INACTIVE) RED
4 FXO FXSKS (EC: OSLEC - INACTIVE) RED
8. SIP Extensions ไว้เพื่อทดสอบ
8.1 สร้าง SIP Extensions ไว้เพื่อทดสอบ
ผมจะสร้างเบอร์ Extensions 2 เบอร์คือ 88000 และ 88001 เปิดไฟล์ /etc/asterisk/sip.conf ขึ้นมา ค้นหาบรรทัด [basic-options](!) แล้ว paste บรรทัดต่อไปนี้ไว้ก่อนบรรทัดนั้น
- โค้ด: เลือกทั้งหมด
[test-basic-options](!)
dtmfmode=rfc2833
context=from-internal
type=friend
port=5060
host=dynamic
nat=yes
rtptimeout=30
rtpholdtimeout=60
qualify=yes
canreinvite=no
[test-my-codecs](!)
disallow=all
allow=g729
allow=ulaw
[88000](test-basic-options,test-my-codecs)
defaultuser=88000
secret=bkk88000
[88001](test-basic-options,test-my-codecs)
defaultuser=88001
secret=bkk88001
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "sip reload"
asterisk -rx "sip show peers"
8.2 ปิด iptables ก่อนชั่วคราว
ไว้ให้เทสผ่านก่อนแล้วค่อยเปิดและคอนฟิกให้ VoIP ผ่านได้
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
service iptables stop
8.3 รีจิสเตอร์ SIP Account
คอนฟิก Softphone (เพราะง่ายสุด) ให้รีจิสเตอร์ ผมใช้โปรแกรม Zoiper เวอร์ชั่นที่มี G.729 (หาได้จากในเว็บแชร์ไฟล์ทั่วไป)
8.4 เช็คว่าบน Asterisk เห็นยูสเซอร์รีจิสเตอร์
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "sip show peers"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
asterisk -rx "sip show peers"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Name/username Host Dyn Nat ACL Port Status
88000/88000 192.168.100.88 D N 5060 OK (72 ms)
88001/88001 (Unspecified) D N 5060 UNKNOWN
จะเห็นว่าเบอร์ 88000 รีจิสเตอร์เข้ามาแล้ว พร้อมทดสอบ
8.5 คอนฟิก Dialplan อย่างง่ายๆ
ให้ SIP Account โทรเข้ามาทดสอบได้
ไฟล์ /etc/asterisk/extensions.conf
เปลี่ยนชื่อไฟล์ /etc/asterisk/extensions.conf ไฟล์เดิมให้เป็นชื่อใหม่ก่อน
- โค้ด: เลือกทั้งหมด
mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.backup
แล้วสร้างไฟล์ขึ้นมาใหม่
- โค้ด: เลือกทั้งหมด
vi /etc/asterisk/extensions.conf
ให้มีข้อมูลตามนี้
- โค้ด: เลือกทั้งหมด
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
CONSOLE=Console/dsp
IAXINFO=guest
TRUNK=DAHDI/G2
[from-internal]
exten => 1234,1,Playback(demo-congrats)
exten => 1234,n,Hangup
8.6 รีโหลด Dialplan
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dialplan reload'
เทสโทรจาก Softphone กด 1234 ถ้าได้ยินเสียงก็แสดงว่าเวอร์คแล้ว มาดูข้อความบน Asterisk Console ขณะโทรเข้ามาเทสครับ
เข้า Asterisk Console พิมพ์คำสั่งนี้
- โค้ด: เลือกทั้งหมด
asterisk -r
ข้อความที่โชว์
- โค้ด: เลือกทั้งหมด
-- Executing [1234@from-internal:1] Playback("SIP/88000-00000001", "demo-congrats") in new stack
-- <SIP/88000-00000001> Playing 'demo-congrats.g729' (language 'en')
-- Executing [1234@from-internal:2] Hangup("SIP/88000-00000001", "") in new stack
== Spawn extension (from-internal, 1234, 2) exited non-zero on 'SIP/88000-00000001'
เราก็พร้อมจะทำการทดสอบโทรเข้าและออกผ่านทางการ์ด TDM410P แล้ว
9. คอนฟิกแบ่ง Group
ปกติถ้าในเครื่องมีการ์ดเดียว (หรือหลายๆการ์ด) เราควรจะแบ่งพอร์ตให้ชัดเจนเลยว่าจะใช้พอร์ตไหนโทรเข้า พอร์ตไหนไว้โทรออก หรือพอร์ตไหนไว้เป็นเบอร์แฟกซ์ ยกตัวอย่าง โทรเข้าพอร์ต 1,2 โทรออกพอร์ต 3,4
เพราะฉะนั้นเราก็แบ่งออกเป็น 2 Groups เอาเป็น Group 0, 1 หล่ะกันครับ โดยที่พอร์ต 1-2 อยู่ Group 0 พอร์ต 3-4 อยู่ Group 1
เราแบ่ง Group ในไฟล์ /etc/asterisk/dahdi-channels.conf โดยแก้เลข 0 ในบรรทัด group=0 เป็นค่าที่เราต้องการ
- โค้ด: เลือกทั้งหมด
; Span 1: WCTDM/0 "Wildcard TDM410P"
;;; line="1 WCTDM/0/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/0/1 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/0/2 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=1
context=from-pstn
channel => 3
callerid=
group=
context=default
;;; line="4 WCTDM/0/3 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=1
context=from-pstn
channel => 4
callerid=
group=
context=default
*** ถ้ายังมองประโยชน์ของการแบ่ง Group ไม่เคลียร์นะครับ ให้นึกเอาว่า ตอนเราโทรออก (โทรจาก Softphone ผ่านการ์ดออกไปภายนอก) ถ้ามันออกทางพอร์ตที่เราไม่ต้องการให้ออก เป็นต้นว่าพอร์ตนั้นเอาไว้รับสายเข้า พอร์ตนั้นเอาไว้ให้คนส่งแฟกซ์เข้ามา พอร์ตนั้นต่อกับเบอร์ที่มีค่าโทรแพงๆ มันก็ไม่ค่อยจะดีใช่ป่ะครับ ***
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi restart"
เช็ค Group ด้วยคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show channels group 0"
asterisk -rx "dahdi show channels group 1"
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Chan Extension Context Language MOH Interpret Blocked State
1 from-pstn default In Service
2 from-pstn default In Service
- โค้ด: เลือกทั้งหมด
Chan Extension Context Language MOH Interpret Blocked State
3 from-pstn default In Service
4 from-pstn default In Service
ก็เป็นอันว่าเราแบ่งทั้ง 4 พอร์ตออกเป็น 2 Groups เรียบร้อยแล้ว เวลาเรียกใช้งานพอร์ตเราสามารถอ้างค่าหมายเลข Group ของมันแทนได้ ซึ่ง Asterisk จะเช็คว่ามีพอร์ตไหนว่างอยู่ก็จะใช้พอร์ตนั้น ถ้าไม่มีพอร์ตว่างและเราไม่ได้ให้มันส่งออกไปทางอื่นก็จะส่ง busy ให้ได้ยิน
การอ้างอิงหมายเลข Group ทำได้ 4 แบบครับ โดยใช้ตัวอักษร G, g, R, r ตามด้วยหมายเลข group ยกตัวอย่าง
G0 หมายถึงใช้พอร์ตในกรุ๊ปโดยใช้พอร์ตที่มีหมายเลขน้อยสุดก่อน ถ้าไม่ว่างค่อยใช้พอร์ตหมายเลขสูงกว่า (พอร์ตแรกในกรุ๊ปจะถูกใช้งานเยอะที่สุด)
g0 หมายถึงใช้พอร์ตในกรุ๊ปโดยใช้พอร์ตที่มีหมายเลขมากที่สุดก่อน ถ้าไม่ว่างค่อยใช้พอร์ตหมายเลขต่ำกว่า (พอร์ตสุดท้ายในกรุ๊ปจะถูกใช้งานเยอะสุด)
R0 หมายถึงใช้พอร์ตในกรุ๊ปแบบวนไปเรื่อยๆ หรือที่เราเรียกว่า Round Robbin โดยเริ่มจากพอร์ตที่มีหมายเลขต่ำสุดก่อน แล้ววนไปเรื่อยๆ (ทุกพอร์ตถูกใช้งานเท่าๆกัน)
r0 หมายถึงใช้พอร์ตในกรุ๊ปแบบวนไปเรื่อยๆ (แบบเดียวกับ R0) แต่เริ่มจากพอร์ตหมายเลขสูงที่สุดก่อน
*** เปลี่ยนหมายเลข Group แล้ว ห้ามมมมมมมม รันคำสั่ง dahdi_genconf อีกนะครับ ไม่อย่างนั้นก็ต้องมาทำใหม่อีก ยกเว้นต้องการเลิกแบ่ง Group แล้ว ***
10. คอนฟิก Dialplan โทรออกผ่านการ์ด
ตั้งเงื่อนไขการโทรออกพอร์ต FXO ว่า กด 0 นำหน้าตามด้วยเลขอะไรก็ได้
ไฟล์ /etc/asterisk/extensions.conf
- โค้ด: เลือกทั้งหมด
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
CONSOLE=Console/dsp
IAXINFO=guest
TRUNK=DAHDI/G2
[from-internal]
exten => 1234,1,Playback(demo-congrats)
exten => 1234,n,Hangup
exten => _0X.,1,Dial(DAHDI/G0/${EXTEN},60)
exten => _0X.,n,Hangup
เซฟไฟล์แล้วรีโหลด Dialplan
- โค้ด: เลือกทั้งหมด
asterisk -rx "dialplan reload"
ทดสอบโทรออก
เข้า Asterisk Console เพื่อดู Events ที่เกิดขึ้นขณะเราทดสอบ จาก Softphone โทรออกสายนอกกด 0x ได้เลย เช่น 0851619439
- โค้ด: เลือกทั้งหมด
asterisk -rvvvv
ข้อความขณะโทรออก
-- Executing [0851619439@from-internal:1] Dial("SIP/88000-00000001", "DAHDI/G0/0851619439,60") in new stack
-- Called G0/0851619439
-- DAHDI/1-1 answered SIP/88000-00000001
ก็คุยได้ครับ เป็นอันว่าคอนฟิกโทรออกผ่านการ์ดได้แล้ว
11. คอนฟิก Dialplan รับสายเข้า
ตอนคอนฟิกการ์ดให้รับสายเข้า จะยุ่งยากนิดนึงก็ตรงเรื่องของ Context ครับ ซึ่งถ้าสังเกตุในไฟล์ /etc/asterisk/dahdi-channels.conf จะเห็นมีบรรทัด context=from-pstn อยู่ในทุกๆพอร์ต
;;; line="1 WCTDM/0/0 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
context ชื่อ from-pstn เป็นค่าดีฟอลท์ของพอร์ต FXO แต่เราจะแก้ไขเป็นค่าอื่นก็ได้เช่น from-zaptel (แต่ถ้ารันคำสั่ง dahdi_genconf ก็จะกลับมาเป็นค่าเดิมอีก ยกเว้นเราไปใส่บรรทัด context_lines from-zaptel ไว้ในไฟล์ /etc/dahdi/genconf_parameters ไม่ว่าจะรัน dahdi_genconf อีกกี่รอบมันก็จะไม่เปลี่ยน)
context เอาไว้คอนโทรลตอนรับสายเข้าครับ แต่ละพอร์ต (ที่ใช้รับสายเข้า) ก็ไม่จำเป็นว่าต้องมี context ชื่อเดียวกัน เราคอนฟิกได้ว่าถ้าโทรมาเข้าพอร์ตๆนี้จะให้ไปรันหรือเรียกอะไรขึ้นมาทำงาน ตอนโทรเข้าจะไม่เกี่ยวกับ Group แล้วนะครับ (Group มันเอาไว้ตอนโทรออกอย่างเดียว) ถึงเราจะคอนฟิกให้พอร์ตที่รับสายเข้ามีหลายๆพอร์ต เราก็แยกได้ว่าแต่ละพอร์ตเอาไว้ทำอะไร เป็นอิสระจากกันเลย
มาดูตัวอย่างกันครับจะเข้าใจง่ายขึ้น ผมตั้งเงื่อนไขการโทรเข้าไว้อย่างง่ายๆว่า โทรเข้าแล้วให้ดังที่เบอร์ Extensions 88000 เลย
ไฟล์ /etc/asterisk/extensions.conf
- โค้ด: เลือกทั้งหมด
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
CONSOLE=Console/dsp
IAXINFO=guest
TRUNK=DAHDI/G2
[from-internal]
exten => 1234,1,Playback(demo-congrats)
exten => 1234,n,Hangup
exten => _0X.,1,Dial(DAHDI/G0/${EXTEN},60)
exten => _0X.,n,Hangup
[from-pstn]
exten => s,1,Dial(SIP/88000)
exten => s,n,Hangup
รีโหลด Dialplan
- โค้ด: เลือกทั้งหมด
asterisk -rx "dialplan reload"
โทรเข้าเบอร์ที่ต่ออยู่ บนหน้าจอ Asterisk Console จะปรากฏข้อความคล้ายๆแบบนี้
- โค้ด: เลือกทั้งหมด
-- Starting simple switch on 'DAHDI/1-1'
-- Executing [s@from-pstn:1] Dial("DAHDI/1-1", "SIP/88000") in new stack
== Using SIP RTP CoS mark 5
-- Called 88000
-- SIP/88000-00000002 is ringing
-- SIP/88000-00000002 is ringing
-- SIP/88000-00000002 answered DAHDI/1-1
[Mar 18 15:32:55] WARNING[2198]: chan_dahdi.c:6497 dahdi_handle_event: Ring/Off-hook in strange state 6 on channel 1
== Spawn extension (from-pstn, s, 1) exited non-zero on 'DAHDI/1-1'
-- Hungup 'DAHDI/1-1'
เบอร์ Extensions 88000 ที่ผมรีจิสเตอร์อยู่ด้วย Softphone จะ Ring รับสายแล้วคุยกันได้เลย
บทความที่เกี่ยวข้อง
กำจัดเสียง Echo เวลาโทรผ่านการ์ด FXS/FXO/E1 ด้วย OSLEC
ติดตั้ง G.723.1 และ G.729 ให้ Asterisk
เชื่อมต่อ TDM410P กับ GSM Fixed Wireless Terminal
เทคนิคการติดตั้งการ์ด TDM400P บน Asterisk