BMS-HOSxP Community
		HOSxP => Linux => ข้อความที่เริ่มโดย: กรรมคือการกระทำ ที่ เมษายน 06, 2010, 10:04:13 AM
		
			
			- 
				http://www.voip4share.com/asterisk-sip-server-f12/asterisk-1-6-2-0-centos-5-4-t271.html
 ติดตั้ง Asterisk 1.6.2.0 ตอนที่ 1
 ติดตั้ง Asterisk 1.6.2.0 ตอนที่ 2
 ติดตั้ง Asterisk 1.6.2.0 ตอนที่ 3
 ติดตั้ง Asterisk 1.6.2.0 ตอนที่ 4
 
 http://www.be2hand.com/scripts/shop.php?do=view_article&user=adventek&pagetopic=1
 อุปกรณ์
 http://www.adventekshop.com/
 
 ขั้นตอนการติดตั้ง Asterisk 1_6_1_1 บน CentOS 5_3
 
 1. Hardware
 ผมจะติดตั้ง Asterisk 1.6.1.1 บน CentOS 5.3 บน Notebook Compaq nx9040
 วางแผนไว้ว่าจะไม่ใช้ GUI (FreePBX, Asterisk-GUI) สเปค Notebook nx9040 คือ
 - CPU Centrino 1.5 GHz
 - RAM 1 GB
 - HD ประมาณ 20 GB
 - LAN card 100 Mbps
 ขั้นแรกผมลง Centos 5.3 โดยเลือกแบบ server ไม่มี GUI   ขณะที่ลง OS ก็มี
 Internet connection อยู่
 
 2. Compile Asterisk
 เนื่องจากผมไม่สามารถหา RPM binary file ของ Asterisk ได้   จำเป็นต้อง compile
 การ compile Asterisk 1.6.x บน CentOS 5.x ผมอ่านจากเอกสารใน www.voip-info.org
 ลอง search ดู หรือไม่ก็อ่านที่ผมสรุปจากการลอง compile ดูก็ได้ ดังนี้
 
 2.1 ติดตั้ง dependencies และ packages ที่จำเป็นในการ compile
 #yum -y install gcc gcc-c++ kernel-devel bison openssl-devel \
 libtermcap-devel ncurses-devel doxygen curl-devel newt-devel \
 mlocate lynx tar wget nmap bzip2 mod_ssl crontabs vixie-cron \
 speex speex-devel unixODBC unixODBC-devel libtool-ltdl \
 libtool-ltdl-devel mysql-connector-odbc mysql mysql-devel \
 mysql-server php-mysql php-mbstring php-mcrypt flex screen\
 subversion
 
 2.2 เช็ค kernel.xxx kernel-devel และ kernel-headers ต้องเป็น version เดียวกัน
 ถ้าไม่เป็น version เดียวกันก็จัดการด้วย
 #yum -y install kernel.xxx kernel-devel kernel-headers
 (xxx หมายถึง architecture ของ CPU)
 
 2.3 จะยังไม่ติดตั้ง mysql-server และ asterisk-addons packages
 
 2.4 ทำตามขั้นตอนได้เลย
 #mkdir -p /usr/src/asterisk
 #cd /usr/src/asterisk
 #wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz
 #wget http://downloads.digium.com/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
 #wget http://downloads.digium.com/pub/libpri/libpri-1.4-current.tar.gz
 #tar -zxvf dahdi-linux-complete-current.tar.gz
 #tar -zxvf asterisk-1.4-current.tar.gz
 #tar -zxvf libpri-1.4-current.tar.gz
 
 #cd /usr/src/asterisk/libpri-VERSION          (แทน VERSION ด้วยตัวเลข version ทีมีอยู่จริง)
 #make clean
 #make
 #make install
 
 #cd /usr/src
 #ln -s kernels linux
 #cd /usr/src/asterisk/dahdi-linux-complete-VERSION
 #make all
 #make install
 #make config
 #chkconfig dahdi on
 #service dahdi start
 
 #cd /usr/src/asterisk/asterisk-VERSION
 #make clean
 #./configure
 
 #Choose which options to install ... (ตาม default ก็ OK)
 
 #make menuselect
 #make
 #make install
 
 Install sample files in /etc/asterisk, install docs/manpages and set to start on boot ...
 
 #make samples
 #make progdocs
 #make config
 #chkconfig asterisk on
 #service asterisk start
 
 ถึงตอนนี้ Asterisk server ก็น่าจะ run แล้ว ลอง connect ดู
 #asterisk -r
 ก็จะได้ message ว่า Asterisk 1.6.1.1 กำลัง run อยู่
 เป็นอันเสร็จสิ้นการติดตั้ง
 
 อ่านบทความอื่นๆ
 http://www.be2hand.com/scripts/shop.php?user=adventek&do=view_article
 
 
 adventek:
 คอนฟิก Asterisk 1.6.1.1 เบื้องต้นครับ
 
 1. คอนฟิกไฟล์ของ Asterisk จะอยู่ที่ /etc/asterisk โดยมีคอนฟิกไฟล์เบื้องต้น ดังนี้
 - /etc/zaptel.conf   เป็นคอนฟิกไฟล์เกี่ยวกับ driver ของการ์ดต่างๆ เช่น
 TDM400P, X100P เป็นต้น
 - /etc/asterisk/zapata.conf   เป็นคอนฟิกไฟล์ของ Asterisk ที่กำหนดพารามิเตอร์
 ต่างๆ ให้กับ channels ของการ์ดที่ติดตั้ง
 - /etc/asterisk/sip.conf   เป็นคอนฟิกไฟล์สำหรับ sip protocol
 - /etc/asterisk/iax.conf   เป็นคอนฟิกไฟล์สำหรับ iax protocol
 - /etc/asterisk/extensions.conf เป็นคอนฟิกไฟล์ที่กำหนด dial plan ทำให้ระบบ
 ทำงานตาม flow ที่ต้องการ
 - /etc/asterisk/voicemail.conf   เป็นคอนฟิกไฟล์ที่กำหนด voicemail
 
 เนื่องจากระบบที่เราติดตั้งในตอนที่ 1 ไม่มีการ์ดใดๆ (TDM400P, X100P etc.)
 เลย ดังนั้นเราไม่จำเป็นต้องคอนฟิก /etc/zaptel.conf และ /etc/asterisk/zapata.conf
 เราจะคอนฟิก 3 ไฟล์ คือ
 - /etc/asterisk/sip.conf
 - /etc/asterisk/extensions.conf
 - /etc/asterisk/voicemail.conf
 
 2. ก่อนลงมือให้ backup ไฟล์เดิมไว้ก่อน
 #cd /etc/asterisk                 ; ไปที่ directory ที่ต้องการ
 #mv sip.conf sip.conf.bak      ; เปลี่ยนชื่อไฟล์ต้นฉบับ
 #touch sip.conf                   ; สร้างไฟล์ใหม่ ขณะนี้ยังเป็นไฟล์ที่ว่างเปล่า
 แล้ว edit ไฟล์ sip.conf ดังนี้
 
 
 [general]
 
 register=username:password@voip.mouthmun.com   ; Register to Mouthmun, ต้องไปสร้าง account
 ; Mountmun ก่อนนะครับ
 port=5060                                   ; Port to bind to (SIP is 5060)
 bindaddr=0.0.0.0                          ; Address to bind to (all addresses on machine)
 allow=all                                       ; Allow all codecs
 match_auth_username=yes            ; What is it?
 
 [mm]                                           ; This is for outgoing SIP trunk to Mouthmun
 
 username=yourusername                ; Username that you get from Mouthmun
 type=friend
 secret=password                           ; Password from Mouthmun
 nat=yes
 host=voip.mouthmun.com              ; Mouthmun SIP server
 fromuser=yourusername                 ; Username that you get from Mouthmun
 fromdomain=voip.mouthmun.com    ; Mouthmun SIP server
 dtmfmode=rfc2833
 disallow=all
 defaultexpirey=20
 canreinvite=no
 allow=g729
 allow=ulaw
 allow=alaw
 context=from-sip                             ; This will relate to /etc/asterisk/extensions.conf
 
 [yourusername]                                 ; Incoming from Mouthmun, ใช้ username ที่ได้จาก Mouthmun มาเป็น context
 ; ที่จริงแล้วจะตั้งชื่ออะไรก็ได้
 canreinvite=no
 quality=no
 type=user
 fromuser=yourusername                   ; Username that you get from Mouthmun
 username=yourusername                  ; Username that you get from Mouthmun
 secret=password                             ; Password from Mouthmun
 context=from-mm                           ; This will relate to /etc/asterisk/extensions.conf
 
 [2000]                                           ; This is our extension nember
 
 type=friend                                     ; This device takes and makes calls
 username=2000                               ; Username on device
 secret=1234                                   ; Password for device
 host=dynamic                                  ; This host is not on the same IP addr every time
 context=from-sip                              ; Inbound calls from this host go here
 mailbox=100@default                        ; Define voicemail for extension 2000
 ; This will relate to /etc/asterisk/voicemail.conf
 
 [2001]                                            ; Same patterm as of extension 2000
 
 type=friend
 username=2001
 secret=1234
 host=dynamic
 context=from-sip
 mailbox=101@default
 
 
 3. edit /etc/asterisk/extensions.conf ดังนี้ (อย่าลืม backup ไฟล์ต้นฉบับ)
 
 
 [general]
 
 static=yes           ; These two lines prevent the command-line interface
 writeprotect=yes ; from overwriting the config file. Leave them here.
 
 [from-sip]
 
 ;
 ; If the number dialed by the calling party was "2000", then
 ; Dial the user "2000" via the SIP channel driver. Let the number
 ; ring for 20 seconds, and if no answer, proceed to priority 2.
 ;
 
 exten => 2000,1,Dial(SIP/2000,20)
 
 ;
 ;
 
 exten => 2000,2,Voicemail(100@default)
 exten => 2000,3,PlayBack(vm-goodbye)
 exten => 2000,4,Hangup
 
 ;
 ; Now, what if the number dialed was "2001"?
 ;
 
 exten => 2001,1,Dial(SIP/2001,20)
 exten => 2001,2,Voicemail(101@default)
 exten => 2001,3,PlayBack(vm-goodbye)
 exten => 2001,4,Hangup
 
 ;
 ; Define a way so that users can dial a number to reach
 ; voicemail. Call the VoicemailMain application with the
 ; number of the caller already passed as a variable, so
 ; all the user needs to do is type in the password.
 ;
 
 exten => 2999,1,VoicemailMain()
 
 ;
 ; According to SIP in sip.conf - sip outbound to mm
 ;
 
 exten => _00[1-9].,1,Dial(SIP/mm/${EXTEN})     ; Dial Mouthmun user
 exten => _66[1-9].,1,Dial(SIP/mm/${EXTEN})     ; Dial fixed or mobile phone
 ; in Thailand (66 is Thailand
 ; country code
 
 ;
 ; sip inbound from mm
 ;
 
 [from-mm]
 exten => s,1,Answer
 exten => s,n,Dial(SIP/2000,20)                          ; route inbound call to extension 2000
 exten => s,n,Hangup
 
 
 4. edit /etc/asterisk/voicemail.conf ดังนี้ (อย่าลืม backup ไฟล์ต้นฉบับ)
 
 
 [general]
 
 format=wav|gsm
 
 ;
 ; format: password, name, email address for attached voicemail msgs
 ;
 
 [default]
 100 => 1234,Vitaya P,vitaya@adventek.biz
 101 => 1234,Vitaya P,vitaya@adventek-th.com
 
 
 5. หลังจากคอนฟิกไฟล์เรียบร้อยแล้วให้ reload Asterisk ดังนี้
 
 เข้าสู่ Asterisk CLI interface
 
 [root@ast16 asterisk]# asterisk -r
 Asterisk 1.6.1.1, Copyright (C) 1999 - 2008 Digium, Inc. and others.
 Created by Mark Spencer <markster@digium.com>
 Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
 This is free software, with components licensed under the GNU General Public
 License version 2 and other licenses; you are welcome to redistribute it under
 certain conditions. Type 'core show license' for details.
 =========================================================================
 Connected to Asterisk 1.6.1.1 currently running on ast16 (pid = 3600)
 Verbosity is at least 3
 ast16*CLI>
 
 แล้วใช้คำสั่ง reload ดังนี้
 
 ast16*CLI>reload
 
 ถึงตอนนี้ Asterisk ก็ run ด้วยคอนฟิกใหม่เรียบร้อยแล้ว ให้คอนฟิก softphone
 2 เครื่อง เบอร์ 2000 และ 2001 ต่อเข้าระบบ Asterisk แล้วเริ่มทดสอบได้เลย
 
 ดูการคอนฟิก softphone (x-lite) ได้จากลิ้งค์
 http://www.be2hand.com/scripts/shop.php?do=article_detail&news_id=5886&user=adventek
 
 
 adventek:
 เขียน dialplan ขั้นพื้นฐาน
 
 1. บทเริ่ม
 Asterisk dialplan เป็นกลไกของระบบที่จะควบคุม call flow ตามที่เราต้องการ
 dialplan จะอยู่ในไฟล์ /etc/asterisk/extensions.conf   dialplan ประกอบด้วย
 4 ส่วนหลักๆ คือ contexts, extensions, priority และ applications
 
 2. Contexts
 Context คือ section ย่อยของ dialplan   context เป็นกลุ่มของ extensions
 extensions ใน context หนึ่ง จะแยกจากกันอย่าเด็ดขาดจาก extensions ใน
 context อื่นๆ     context จะมีรูปแบบ ดังนี้
 
 [context-name1]
 exten => xxx,1,app1()
 exten => xxx,n,app2()
 ...
 ...
 [context-name2]
 exten => 123,1,app1()
 extex => 123,n,app2()
 ...
 ...
 
 extensions ที่ถัดจาก context ใดๆ ก็จะอยู่ใน context นั้น จนกว่าจะเริ่ม context ใหม่
 ชื่อ context จะประกอบด้วย A-Z, a-z, 0-9, - (hyphen), _ (underscore)
 ตัวอย่างเช่น
 [incoming]
 [outbound-sip-trunk]
 [iax_trunk] เป็นต้น
 อย่าใช้ [globals] หรือ [general] เพราะ [general] จะใช้กำหนดเรื่องทั่วไปของ dialplan ส่วน
 [globals] จะกำหนด global variables ซึ่งเราจะเรีบนรู้ต่อไป
 
 ชื่อ context ยาวได้ถึง 79 ตัวอักษร !!!   มีเวลาก็ลองทดสอบดู !!!
 
 3. Extensions
 Extension คือ step ในการทำงานของระบบ   เมื่อมี call เข้ามาระบบต้องเช็คว่า call จัดอยู่ใน context ใด
 ระบบก็จะใช้ extensions ใน context นั้นๆ ในการ process โดยจะทำตาม priority ที่เราจะกล่าวถึงต่อไป
 รูปแบบของ extension
 exten => name,priority,application
 ตัวอย่าง
 exten => 2000,1,Answer()
 extension name = 2000
 priority = 1
 application = Answer()
 
 s extension (start extension)
 ในกรณีที่มี incoming call มาจาก trunks เช่น PSTN (TOT เป็นต้น), SIP trunk (Voip providers)
 calls เหล่านี้จะไม่มีข้อมูล extension (เลขหมายภายใน) ปลายทาง   ดังนั้นจะต้องมี
 extension พิเศษรับ calls เหล่านี้ นั่นคือ extension s
 
 exten => s,1,Answer()
 exten => s,n,App1()
 exten => s,n,App2()
 ...
 ...
 
 i extension (invalid extension)
 ในบางกรณีระบบต้องการรับ input จากผู้โทร   ถ้าผู้โทรกด input ที่นอกเหนือจากที่ระบบต้องการ
 call นั้นจะถูกส่งไปที่ i extension เพื่อ run app ที่แจ้งให้ผู้โทรทราบว่ากดผิด (เช่น ระบบ IVR)
 
 exten => i,1,App1()
 
 t extension (timeout extension)
 ในกรณีที่ระบบต้องการ input จากผู้โทร   แต่ผู้โทรไม่กด input ใดๆ จนกะทั่ง timeout ระบบ
 ก็จะส่ง call นั้นไปยัง t extension เพื่อ run app ที่กำหนดไว้ต่อไป (เช่นระบบ IVR)
 
 exten => t,1,App2()
 
 extension wildcards
 [1236-9]     หมายถึง 1 หรือ 2 หรือ 3 หรือ 6 หรือ 7 หรือ 8 หรือ 9   ตัวใดตัวหนึ่งเพียงตัวเดียวเท่านั้น
 X                หมายถึง 0 ถึง 9   ตัวใดตัวหนึ่งเพียงตัวเดียวเท่านั้น
 Z                หมายถึง 1 ถึง 9   ตัวใดตัวหนึ่งเพียงตัวเดียวเท่านั้น
 N                หมายถึง 2 ถึง 9   ตัวใดตัวหนึ่งเพียงตัวเดียวเท่านั้น
 .                 หมายถึง   ตัวเลขอะไรก็ได้หนึ่งตัวหรือมากกว่าหนึ่งตัวก็ได้
 
 exten => 20XX,1,Answer()
 
 20XX จะหมายถึง 2000 ถึง 2099   เป็นต้น
 
 4. Priority
 แต่ละ extension อาจจะมีหลาย steps     priority คือ ลำดับของ steps   ดูตัวอย่าง
 [incoming]
 exten => 2000,1,Answer()
 exten => 2000,2,Playback()
 exten => 2000,3,Hangup()
 
 ระบบจะ process context incoming ตามลำดับ priority คือ 1,2,3
 
 ถ้าเราเรีบงลำดับใหม่
 [incoming]
 exten => 2000,3,Hangup()
 exten => 2000,2,Playback()
 exten => 2000,1,Answer()
 
 ระบบก็จะทำงานเหมือนเดิมตามตัวอย่างข้างบน คือ ดูลำดับ priority แล้วจะไล่ทำ
 Answer(), Playback() และ Hangup()
 
 อย่างไรก็ตามถ้าใน context มีหลายๆ steps แล้วเราต้องการแก้ไขโดยการ
 เพิ่มหรือลด steps เราก็ต้องแก้ไข priority ใหม่ทั้ง context ทำให้ไม่สะดวก
 เราจึงนิยมเขียนแบบ unnumbered priorities คือ
 
 [incoming]
 exten => 2000,1,Answer()
 exten => 2000,n,Playback()
 exten => 2000,n,Hangup()
 
 n = next ระบบจะทำ priority 1 แล้วจะทำบรรทัดถัดไป ดังนั้นเราสามารถเพิ่มหรือลด
 steps ได้โดยไม่ต้องเปลี่ยน priority
 
 5. Applications
 Application คือ โปรแกรมที่ทำงานต่างๆ เช่น Answer() จะเป็น app ที่ตอบรับ call
 ที่เข้ามาที่ channel,   Playback(soundfile) จะเป็น app ที่เล่น soundfile เพื่อให้ผู้ที่
 โทรมารับทราบข้อมูล,   Hangup() เป็น app ที่วางสาย   จะเห็นว่าบาง app จะต้อง
 argument ตัวอย่างเช่น   Playback(soundfile)   argument คือ soundfile (ไม่ต้องมี
 file extension)
 
 6. มาดูตัวอย่าง
 ถ้าคุณต้องการทดลองตามตัวอย่าง คุณจะต้องมีอย่างน้อย 2 extensions และ 1 trunk
 จะดูตามบทความในตอนที่ 2 ก็ได้   sip.conf มี extensions 2000, 2001 และ 1 SIP
 trunk ติดต่อกับ voip.mouthmun.com
 
 ตัวอย่างแรกเป็นการรับ call จาก trunk
 
 [from-mm]                                          ; context สำหรับ incoming จาก Mouthmun
 exten => s,1,Answer()                        ; รับ call
 exten => s,n,Dial(SIP/2000,20)             ; Dial extension 2000 โดยมี timeout = 20 วินาที
 exten => s,n,Hangup()
 
 ตัวอย่างข้างบน ถ้ามี call จาก trunk เข้ามาระบบจะ forward call ไปที่ extension 2000
 เราจะเพิ่ม context [from-sip] สำหรับการโทรภายในและโทรออก
 
 ====================================================
 
 [from-mm]                                          ; context สำหรับ incoming จาก Mouthmun
 exten => s,1,Answer()                        ; รับ call
 exten => s,n,Dial(SIP/2000,20)             ; Dial extension 2000 โดยมี timeout = 20 วินาที
 exten => s,n,Hangup()
 
 [from-sip]                                                         ; context สำหรับโทรภายใน และโทรออก
 exten => 2000,1,Answer()
 exten => 2000,n,Dial(SIP/2000,20)
 exten => 2000,n,Hangup()
 
 exten => 2001,1,Answer(0)
 exten => 2001,n,Dial(SIP/2001,20)
 exten => 2001,n,Hangup()
 
 exten => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
 
 ======================================================
 
 _ (underscore)   บอกให้ระบบทราบว่าที่ตามมาจะเป็น extension wildcards
 _00XXXXXXXX     เป็น extension wildcards สำหรับเลขหมายของ Mouthmun
 คือ ขึ้นต้นด้วย 00 แล้วตามด้วยตัวเลขอีก 8 ตัว
 _668XXXXXXXX   เป็น extension wildcards สำหรับโทรจาก Mouthmun เข้ามือถือ
 ประเทศไทย
 _662XXXXXXX     เป็น extension wildcards สำหรับโทรจาก Mouthmun เข้าโทรศัพท์บ้าน
 ในเขตกรุงเทพฯ และปริมณฑล
 
 SIP/mm/${EXTEN}     หมายถึงโทรออกที่ trunk ชื่อ mm (definded ใน sip.conf)
 ${EXTEN} หมายถึงเลขหมายปลายทางที่ผู้โทรกดเพื่อโทรออก
 
 อ่านบทความอื่นๆ http://www.be2hand.com/scripts/shop.php?user=adventek&do=view_article
 
 adventek:
 เขียน dialplan ขั้นพื้นฐาน (ต่อ)
 
 1. ตัวแปร
 จากตัวอย่างในตอนที่แล้ว เราได้ extensions.conf ดังนี้
 
 ====================================================
 
 [from-mm]                                          ; context สำหรับ incoming จาก Mouthmun
 exten => s,1,Answer()                        ; รับ call
 exten => s,n,Dial(SIP/2000,20)             ; Dial extension 2000 โดยมี timeout = 20 วินาที
 exten => s,n,Hangup()
 
 [from-sip]                                                         ; context สำหรับโทรภายใน และโทรออก
 exten => 2000,1,Answer()
 exten => 2000,n,Dial(SIP/2000,20)
 exten => 2000,n,Hangup()
 
 exten => 2001,1,Answer(0)
 exten => 2001,n,Dial(SIP/2001,20)
 exten => 2001,n,Hangup()
 
 exten => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
 
 ====================================================
 
 จะเห็นว่าใน 3 บรรทัดสุดท้ายมี ${EXTEN}   สักษณะเช่นนี้ คือ ${NAME} เรียกว่าตัวแปร
 ${EXTEN} มีค่าเท่ากับ เลขหมายปลายทางที่ผู้โทรกด
 
 ${EXTEN:1}   มีค่าเท่ากับ   ตัดตัวเลขตัวแรกออกจากเลขหมายปลายทางที่ผู้โทรกด
 ตัวอย่างเช่น
 
 exten => _900XXXXXXXX,Dial(SIP/mm/${EXTEN:1})
 
 ถ้าเรากด 90018067894 ระบบจะตัด 9 ออกแล้ว Dial เฉพาะ 0018067894
 
 2. Application Goto()
 ใน extensions.conf ของเรา เมื่อมีสายเข้ามา ระบบจะ ring ที่ extension 2000
 ถ้าเราต้องการให้มีระบบตอบรับอัตโนมัติเราจะต้องใช้ Application Goto() มาช่วย
 
 Application Goto() จะใช้ในการบังคับให้ระบบข้ามไป process ในบรรทัดที่ต้องการ
 มีรูปแบบ ดังนี้
 
 exten => 123,1,Goto(context,extension,priority)
 หรือ
 exten => 123,1,Goto(extension,priority)   ถ้าอยู่ใน context เดียวกัน
 
 มาดูตัวอย่างกันเลย modify จาก extensions.conf เดิม   ปรับเฉพาะ context ขาเข้า
 context โทรภายในและโทรออกคงไว้เช่นเดิม
 
 ====================================================
 
 [from-mm]                                          ; context สำหรับ incoming จาก Mouthmun
 exten => s,1,Answer()                        ; รับ call
 exten => s,2,Background(th-mainmenu)     ; ข้อความต้อนรับ บอกให้ผู้โทรกดเลขหมายต่างๆ
 exten => s,3,WaitExten()                       ; รอรับตัวเลขที่ผู้โทรกด
 
 exten => t,1,Goto(s,2)                         ; ถ้าผู้โทรไม่กดนานกว่า timeout (10s) ให้กลับไปที่
 ; mainmenu
 
 exten => i,1,Playback(th-invalid)        ; ถ้าผู้โทรกดเลขหมายนอกเหนือจากที่กำหนดให้ระบบ
 ; play soundfile เพื่อบอกผู้โทร
 exten => i,2,Goto(s,2)                         ; แล้วกลับไปที่ mainmenu
 
 exten => 2000,1,Dial(SIP/2000,20)        ; ถ้าผู้โทรกด 2000 ให้ระบบ ring extension 2000
 exten => 2001,1,Dial(SIP/2001,20)        ; ถ้าผู้โทรกด 2001 ให้ระบบ ring extension 2001
 
 [from-sip]                                                         ; context สำหรับโทรภายใน และโทรออก
 exten => 2000,1,Answer()
 exten => 2000,n,Dial(SIP/2000,20)
 exten => 2000,n,Hangup()
 
 exten => 2001,1,Answer(0)
 exten => 2001,n,Dial(SIP/2001,20)
 exten => 2001,n,Hangup()
 
 exten => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
 
 ====================================================
 
 3. Branching with Application GotoIf()
 entensions.conf ในข้อ 2 สามารถทำงานได้   แต่อาจจะเกิด loop ไม่รู้จบได้   สมมติว่ามีผูโทรเข้ามา
 แล้วไม่กดอะไรเลย   ระบบจะรอจน timeout (default = 10s) แล้ว play mainmenu   และจะวน
 loop อย่างนี้ไปเรื่อยๆ   ระบบจะเสีย incoming trunk ไปโดยเปล่าประโยชน์   จะต้องมีการกำหนดให้นับ
 จำนวน loop ถ้าครบก็ให้ Hangup()
 
 GotoIf() จะมีการใช้งาน ดังนี้
 
 exten => 123,1,GotoIf(Expression?destination1:destination2)
 
 โดยที่ destination1, destination2 คือ
 
 - priority label หรือ
 - extention,priority label หรือ
 - contect,extension,priority label
 
 ดูตัวอย่าง โดยการ modify extensions.conf ในข้อ 2 เพื่อไม่ให้
 
 ======================================================
 
 [from-mm]
 
 exten => s,1,Answer()
 exten => s,2,Set(COUNT=0)                                         ; Set counter = 0
 exten => s,3,Background(th-mainmenu)
 exten => s,4,Set(COUNT=$[${COUNT} + 1])                  ; เพิ่ม counter
 exten => s,5,GotoIf($[${COUNT} = 3]?stopping:goingon) ; เช็ค counter = 3 หรือไม่ (กำหนด maximum loop ที่นี่)
 exten => s,6(stopping),Hangup()                                    ; counter = 3 ให้ Hangup()
 exten => s,7(goingon),WaitExten()                                 ; counter < 3 ให้ทำงานต่อ
 
 
 exten => t,1,Goto(s,3)
 exten => i,1,Playback(th-invalid)
 exten => i,2,Goto(s,3)
 
 
 exten => 2000,1,Dial(SIP/2000,20)
 exten => 2001,1,Dial(SIP/2001,20)
 
 [from-sip]
 
 exten => 2000,1,Answer()
 exten => 2000,n,Dial(SIP/2000,20)
 exten => 2000,n,Hangup()
 
 exten => 2001,1,Answer()
 exten => 2001,n,Dial(SIP/2001,20)
 exten => 2001,n,Hangup()
 
 exten => _00XXXXXXXX,1,Dial(SIP/mm/${EXTEN})าย
 exten => _668XXXXXXXX,1,Dial(SIP/mm/${EXTEN})
 exten => _662XXXXXXX,1,Dial(SIP/mm/${EXTEN})
 
 
 
- 
				http://www.voip4share.com/elastix-unified-communications-software-f28/topic237.html
			
- 
				http://www.freebsd.sru.ac.th/
 การติดตั้ง FreeBSD 7.0 ตอนที่ 1
 http://www.freebsd.sru.ac.th/index.php/freebsd-70-installation/45-freebsd-70-installation-1
 การติดตั้ง FreeBSD 7.0 ตอนที่ 2
 http://www.freebsd.sru.ac.th/index.php/freebsd-70-installation/46-freebsd-installation-2
 ขั้นตอน การติดตั้งฐานข้อมูล MySQL 5.1
 http://www.freebsd.sru.ac.th/index.php/mysql-v-51/65-mysql51