เทคนิคการติดตั้งการ์ด TDM400P บน Asterisk

Asterisk Opensource IP Pbx

เทคนิคการติดตั้งการ์ด TDM400P บน Asterisk

โพสต์โดย nuiz » 22 มี.ค. 2012 09:36

TDM400P เป็นการ์ดของ Digium รองรับ FXS/FXO 4 พอร์ต บนการ์ดสามารถใส่โมดูล FXS (สีเขียว) FXS (สีแดง) ได้สูงสุด 4 โมดูล (4 พอร์ต) ใส่ผสมกันก็ได้ การ์ดนี้ไม่ต้องติดตั้งไดร์เวอร์เพิ่มเติมเพราะว่ามันมีรวมอยู่ใน DAHDI อยู่แล้วครับ แค่ติดตั้ง DAHDI ก็เรียกใช้งานการ์ดได้แล้ว

** การ์ดนี้จะคล้ายๆกับการ์ด 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 ทำงานหรือไม่
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7058
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 6 ท่าน

cron