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

Asterisk Opensource IP Pbx

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

โพสต์โดย nuiz » 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 บน Asterisk

มาดูวิธีการติดตั้งการ์ด 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 (หาได้จากในเว็บแชร์ไฟล์ทั่วไป)

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

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

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

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
** งานเร่งด่วนติดต่อที่เบอร์ 085-161-9439 อีเมล์ iamaladin@gmail.com ไลน์ไอดี nuizvoip ครับ ผมหนุ่ยครับ**
nuiz
Diamond Member
 
โพสต์: 7327
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

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

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

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

cron