** การ์ดนี้จะคล้ายๆกับการ์ด TDM410P นะครับ แต่ขนาดจะสั้นกว่าและวางโมดูลในแนวนอน **
เทียบขนาดการ์ด TDM400P กับ TDM410P
มาดูวิธีการติดตั้งการ์ด TDM400P กันเลยครับ การ์ดในตัวอย่างนี้ผมใส่โมดูล FXO 3 โมดูล
เครื่องที่ใช้ทดสอบมีเสป็คตามนี้ครับ Celeron Dual Core (รันแบบ 64 บิตได้), Ram 2 GB, HDD SATA 120 GB ติดตั้งโปรแกรมหลักๆดังต่อไปนี้
- CentOS 5.8 x86_64
- Asterisk 1.6.2.23
- Dahdi 2.6.0
อย่าลืมปิด SELinux บน CentOS ด้วยนาครับ ไม่งั้นอาจจะเกิดเหตุการณ์อันน่าปวดหัวได้ เป็นต้นว่า ลงโปรแกรมไม่ได้ คอมไพล์ไม่ผ่าน
เช็คว่าปิด SELinux หรือยัง เปิดไฟล์ /etc/selinux/config ขึ้นมา ดูบรรทัด SELINUX ครับ ถ้าเห็นเป็น disabled แบบนี้ก็แสดงว่าปิดแล้ว
- โค้ด: เลือกทั้งหมด
SELINUX=disabled
และมีโปรแกรมอื่นๆอีกซึ่งอาจจะยังไม่ได้ใช้งานในขณะนี้
** บทความต่อไปนี้จะบอกวิธีการติดตั้ง 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 Communication controller: Tiger Jet Network Inc. Tiger3XX Modem/ISDN interface
ติดตั้ง 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.6.0 และ OSLEC
- โค้ด: เลือกทั้งหมด
cd /tmp
wget 'http://www.voip4share.com/sources/dahdi-linux-complete-2.6.0+2.6.0.tar.gz'
wget 'http://www.voip4share.com/sources/oslec-dahdi.tar.gz'
tar xzvf dahdi-linux-complete-2.6.0+2.6.0.tar.gz -C /usr/src
tar xzvf oslec-dahdi.tar.gz -C /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers
พิมพ์คำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
sed -i "s|#obj-m += dahdi_echocan_oslec.o|obj-m += dahdi_echocan_oslec.o|" /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/dahdi/Kbuild
sed -i "s|#obj-m += ../staging/echo/|obj-m += ../staging/echo/|" /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/dahdi/Kbuild
echo 'obj-m += echo.o' > /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/staging/echo/Kbuild
- โค้ด: เลือกทั้งหมด
cd /usr/src/dahdi-linux-complete-2.6.0+2.6.0
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
ติดตั้ง DAHDI 2.6.0 อีกรอบ
** สาเหตุที่ต้องติดตั้งอีกรอบเพราะว่า ผมเจอปัญหาว่า Asterisk โหลด dahdi ไม่ได้ (ใช้คำสั่ง dahdi บน Asterisk ไม่ได้ เช่น dahdi show version, dahdi show channels) **
- โค้ด: เลือกทั้งหมด
cd /tmp
tar xzvf dahdi-linux-complete-2.6.0+2.6.0.tar.gz -C /usr/src
tar xzvf oslec-dahdi.tar.gz -C /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers
sed -i "s|#obj-m += dahdi_echocan_oslec.o|obj-m += dahdi_echocan_oslec.o|" /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/dahdi/Kbuild
sed -i "s|#obj-m += ../staging/echo/|obj-m += ../staging/echo/|" /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/dahdi/Kbuild
echo 'obj-m += echo.o' > /usr/src/dahdi-linux-complete-2.6.0+2.6.0/linux/drivers/staging/echo/Kbuild
cd /usr/src/dahdi-linux-complete-2.6.0+2.6.0
make all
make install
make config
chkconfig dahdi on
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 เช็คว่าการ์ด TDM400P ใช้ไดร์เวอร์ชื่ออะไร
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
dahdi_hardware
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
pci:0000:02:03.0 wctdm- e159:0001 Wildcard S400P Prototype
มันใช้ไดร์เวอร์ชื่อ wctdm ครับ
5.2 ไฟล์ /etc/dahdi/modules
เปิดไฟล์ รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
vi /etc/dahdi/modules
ใส่ # หน้าบรรทัดไดร์เวอร์ที่ไม่ได้ใช้งานครับ การ์ด TDM400P ใช้ไดร์เวอร์ชื่อ wctdm ดังนั้นบรรทัดอื่นที่ไม่ใช่อันนี้ควรจะใส่เครื่องหมาย # ไว้หน้าเพื่อไม่ให้โหลด
- โค้ด: เลือกทั้งหมด
wctdm
5.3 ไฟล์ /etc/dahdi/genconf_parameters
ข้อมูลดีฟอลท์ในไฟล์ /etc/dahdi/genconf_parameters มีข้อมูลเยอะมากครับ แต่เราต้องการใช้เพียงหน่อยเดียว ผมเลือกที่จะเปลี่ยนชื่อไฟล์ไปเป็นไฟล์ใหม่แล้วสร้างไฟล์ชื่อเดียวกันขึ้นมา แล้วใส่ข้อมูลเฉพาะที่ต้องการ ดังตัวอย่าง
- โค้ด: เลือกทั้งหมด
mv /etc/dahdi/genconf_parameters /etc/dahdi/genconf_parameters.backup
- โค้ด: เลือกทั้งหมด
vi /etc/dahdi/genconf_parameters
เครื่องผมมีอยู่ 2 บรรทัดแค่นี้ครับ บรรทัดแรกกำหนดชื่อ context มีชื่อเป็น from-pstn (ชื่อดีฟอลท์) แต่เราก็เปลี่ยนชื่อได้ตามใจชอบ ชื่อ context นี้สำคัญนะครับมันเอาไว้สร้าง Dialplan ตอนรับสายเข้ามา ประมาณว่าถ้าอ้างชื่อผิดไปแม้แต่ตัวอักษรเดียวก็จะโทรไม่เข้า
ส่วนบรรทัดที่ 2 กำหนดว่าเราจะใช้ Echo canceller (แบบ Software) แบบ OSLEC หาอ่านบทความเกี่ยวกับ OSLEC ได้ที่ลิ้งค์ท้ายบทความ
- โค้ด: เลือกทั้งหมด
context_lines from-pstn
echo_can oslec
5.4 สตาร์ท DAHDI
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
service dahdi start
ผลลัพธ์
- โค้ด: เลือกทั้งหมด
Loading DAHDI hardware modules:
wctdm: [ OK ]
Running dahdi_cfg: [ OK ]
5.4 สร้างไฟล์ /etc/dahdi/system.conf
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
dahdi_genconf
ไม่มีอะไรโชว์ขึ้นมานะครับ แต่เมื่อเช็คดูในไฟล์ /etc/dahdi/system.conf จะเห็นแบบนี้
- โค้ด: เลือกทั้งหมด
# Span 1: WCTDM/4 "Wildcard S400P Prototype Board 5" (MASTER)
fxsks=1
echocanceller=oslec,1
fxsks=2
echocanceller=oslec,2
fxsks=3
echocanceller=oslec,3
# channel 4, WCTDM/4/3, no module.
# Global data
loadzone = us
defaultzone = us
5.5 ไฟล์ /etc/asterisk/dahdi-channels.conf
ไฟล์นี้ถูกสร้างตอนรันคำสั่ง dahdi_genconf
- โค้ด: เลือกทั้งหมด
; Span 1: WCTDM/4 "Wildcard S400P Prototype Board 5" (MASTER)
;;; line="1 WCTDM/4/0 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/4/1 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/4/2 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
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/4 "Wildcard S400P Prototype Board 5" (MASTER)
1 FXO FXSKS (EC: OSLEC - INACTIVE)
2 FXO FXSKS (EC: OSLEC - INACTIVE) RED
3 FXO FXSKS (EC: OSLEC - INACTIVE) RED
4 unknown Reserved
ตอนนี้ 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 S400P Prototype Board 5 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 พอร์ต แต่ละพอร์ตอยู่ใน 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: yes
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 มองเห็นการ์ด TDM400P เรียบร้อยแล้ว ก็พร้อมจะคอนฟิกให้โทรออกและรับสายเรียกเข้าผ่านทางการ์ดได้แล้ว
7. รีสตาร์ทเครื่อง และเช็ค DAHDI Status อีกรอบ
- โค้ด: เลือกทั้งหมด
reboot
รอจนบู๊ตเสร็จ แล้วรันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
service dahdi status
ผลลัพธ์ OK
- โค้ด: เลือกทั้งหมด
### Span 1: WCTDM/4 "Wildcard S400P Prototype Board 5" (MASTER)
1 FXO FXSKS (In use) (EC: OSLEC - INACTIVE)
2 FXO FXSKS (In use) (EC: OSLEC - INACTIVE) RED
3 FXO FXSKS (In use) (EC: OSLEC - INACTIVE) RED
4 unknown Reserved
8. SIP Extensions ไว้เพื่อทดสอบ
8.1 สร้าง SIP Extensions ไว้เพื่อทดสอบ
ผมจะสร้างเบอร์ Extensions 2 เบอร์คือ 88000 และ 88001 ไฟล์คอนฟิกดีฟอลท์มีไฟล์เดียวคือ /etc/asterisk/sip.conf แต่ผมจะแยกให้เป็น 2 ไฟล์นะครับ ไฟล์แรก /etc/asterisk/sip.conf ไฟล์เดิมแต่ว่าให้มีเฉพาะข้อมูลที่คาดว่าน่าจะใช้งาน และอีกไฟล์คือ /etc/asterisk/sipclients.conf เก็บคอนฟิกสำหรับ SIP Clients
- โค้ด: เลือกทั้งหมด
mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.backup
สร้างไฟล์ /etc/asterisk/sip.conf ขึ้นมาใหม่
- โค้ด: เลือกทั้งหมด
vi /etc/asterisk/sip.conf
ให้มีข้อมูลต่อไปนี้
- โค้ด: เลือกทั้งหมด
[general]
context=default
udpbindaddr=0.0.0.0:5060
tcpenable=no
tcpbindaddr=0.0.0.0:5060
tlsenable=no
tlsbindaddr=0.0.0.0:5062
srvlookup=yes
maxexpiry=300
minexpiry=60
defaultexpiry=120
disallow=all
allow=g729
allow=g723
allow=gsm
allow=ulaw
allow=alaw
canreinvite=no
nat=yes
realm=sip-server.com
callerid=sip-server
useragent=sip-server
sdpsession=sip-server
usereqphone=yes
dtmfmode=rfc2833
videosupport=yes
t38pt_udptl=yes
t38pt_usertpsource=yes
registertimeout=30
registerattempts=0
rtcachefriends=yes
rtsavesysname=no
rtupdate=yes
rtautoclear=yes
rtptimeout=30
rtpholdtime=60
;sendrpid=yes
;trustrpid=no
;localnet=10.255.255.0/255.255.255.0
;externip=203.203.203.203
;stunaddr=stun.xten.com:3478
;externhost=ddns.homelinux.com
;externrefresh=15
allowsubscribe=yes
subscribecontext=from-internal-subscribe
alwaysauthreject=yes
#include sipclients.conf
ต่อไปสร้างไฟล์ /etc/asterisk/sipclients.conf
- โค้ด: เลือกทั้งหมด
vi /etc/asterisk/sipclients.conf
ให้มีข้อมูลต่อไปนี้
- โค้ด: เลือกทั้งหมด
[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"
ก็จะเห็นเบอร์ Extension 88000 และ 88001
8.2 ปิด iptables ก่อนชั่วคราว
ไว้ให้เทสผ่านก่อนแล้วค่อยเปิดและคอนฟิกให้ VoIP ผ่านได้
รันคำสั่งต่อไปนี้
- โค้ด: เลือกทั้งหมด
service iptables stop
8.3 รีจิสเตอร์ SIP Account
คอนฟิก Softphone (เพราะง่ายสุด) ให้รีจิสเตอร์ ผมใช้โปรแกรม Zoiper เวอร์ชั่นที่มี G.729 (หาได้จากในเว็บแชร์ไฟล์ทั่วไป)
8.4 เช็คว่าบน Asterisk เห็นยูสเซอร์รีจิสเตอร์
รันคำสั่งนี้
- โค้ด: เลือกทั้งหมด
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
[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
เพราะฉะนั้นเราก็แบ่งออกเป็น 2 Groups เอาเป็น Group 0, 1 หล่ะกันครับ โดยที่พอร์ต 1-2 อยู่ Group 0 พอร์ต 3 อยู่ Group 1
เราแบ่ง Group ในไฟล์ /etc/asterisk/dahdi-channels.conf โดยแก้เลข 0 ในบรรทัด group=0 เป็นค่าที่เราต้องการ
- โค้ด: เลือกทั้งหมด
; Span 1: WCTDM/4 "Wildcard S400P Prototype Board 5" (MASTER)
;;; line="1 WCTDM/4/0 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/4/1 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/4/2 FXSKS (EC: OSLEC - INACTIVE)"
signalling=fxs_ks
callerid=asreceived
group=1
context=from-pstn
channel => 3
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
ก็เป็นอันว่าเราแบ่งทั้ง 3 พอร์ตออกเป็น 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/4/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
[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
เทคนิคการติดตั้งการ์ด TDM410P บน Asterisk
เทคนิคการติดตั้งการ์ด BL1600A (16 FXO) บน Asterisk
วิธีเช็คว่า Echo Canceller ทำงานหรือไม่