34
ระบบโทรศัพท์สาหรับองค์กรยุคใหม่ COE SUMMER CAMP 2011 Document V 1.2

ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

ระบบโทรศพทส าหรบองคกรยคใหม

COE SUMMER CAMP2011

Document V 1.2

Page 2: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

1 IP Telephony Overview ...................................................................................................................... 1

1.1 เครอขายทใชในการทดลอง.............................................................................................................. 1

1.2 การตดตง X-Lite ............................................................................................................................. 2

1.2.1 ทดลองการตดตงและปรบแตงคาของโปรแกรม X-Lite ............................................................... 2

1.2.2 การทดลองใชงาน X-Lite .......................................................................................................... 3

2 Asterisk Installation & Dial Plan Basics .............................................................................................. 4

2.1 SIP Configuration .......................................................................................................................... 4

2.1.1 การทดลองปรบแตงคา sip.conf .......................................................................................... 5

2.2 Dial plan Syntax ............................................................................................................................ 5

2.2.1 Context ................................................................................................................................. 5

2.2.2 Extension .............................................................................................................................. 7

2.2.3 Priority .................................................................................................................................. 7

2.2.4 Application ............................................................................................................................ 8

2.3 A Simple Dial plan ......................................................................................................................... 8

2.3.1 The s extension ..................................................................................................................... 8

2.3.2 The Answer() , Playback() , Hangup() Application ................................................................ 9

2.4 Our first Dial plan ......................................................................................................................... 9

3 Dialplan Concepts ............................................................................................................................ 10

3.1 การใชงานค าสง Background() ................................................................................................. 10

3.1.1 การทดลองใชค าสง Background()..................................................................................... 10

3.2 การใชงานค าสง Goto() .............................................................................................................. 12

สารบญ

Page 3: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

3.2.1 การทดลองน าค าสง Goto() มาใชรวมกบค าสง Background() .......................................... 13

3.3 การจดการ Invalid Entries and Timeouts ..................................................................................... 14

3.3.1 การทดลองใชงาน Invalid Entries และ Timeouts................................................................... 14

3.4 การใชงาน Variable ...................................................................................................................... 15

3.4.1 การทดลองใชงาน Variable รวมกบ Dial plan ......................................................................... 16

3.5 การใชงาน Pattern Matching ....................................................................................................... 17

3.5.1 การใชงาน ${EXTEN}............................................................................................................. 17

3.5.2 การทดลองใชงาน Pattern Matching .................................................................................... 18

4 More Dialplan Concepts .................................................................................................................. 19

4.1 Basic Expression ......................................................................................................................... 19

4.1.1 การทดลองใชงาน Expression และ Operation ....................................................................... 19

4.2 Dial plan Functions ..................................................................................................................... 20

4.2.1 ทดลองใช Dial plan Function ............................................................................................... 20

4.3 Condition Branching ................................................................................................................... 21

4.3.1 การทดลองใชงาน GotoIf() .................................................................................................... 21

5 Asterisk Gateway Interface with RAGI ............................................................................................ 23

5.1 รจก Ruby Asterisk Gateway Interface (RAGI) ............................................................................. 23

5.1.1 เรยกใช AGI จาก Asterisk ..................................................................................................... 23

5.1.2 เรมตนพฒนาโปรแกรม RoR ................................................................................................... 24

5.1.3 ทดสอบผลการท างาน ............................................................................................................ 25

5.2 เตรยมพรอมขอมล ........................................................................................................................ 26

5.2.1 สรางโมเดลและเวบเพจทใชจดการขอมลดวย Rails ................................................................. 26

5.2.2 เพมขอมลเพอทดสอบ ........................................................................................................... 26

5.3 ตรวจสอบยอดเงน ......................................................................................................................... 28

5.3.1 เตรยมเสยงตอบรบ และแนะน า .............................................................................................. 28

Page 4: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

5.3.2 เขยนโปรแกรมในฝง Asterisk ................................................................................................. 28

5.3.3 เขยนโปรแกรมในฝงโปรแกรมประยกต .................................................................................... 29

5.3.4 ทดสอบใชงาน ....................................................................................................................... 29

Page 5: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

เอกสารฉบบนถกดดแปลงจากเอกสารอบรมการพฒนาระบบโทรศพทยคใหมโดยใช Asterisk ซงจดท าโดย ศนยวจยเทคโนโลยเครอขาย (Centre for Network Research) ภาควชาวศวกรรมคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยสงขลานครนทร เพอสงเสรมใหบคคล หนวยงาน หรอองคกร มความรความเขาใจในการใชงาน IP

Telephony ดวยโปรโตคอล SIP โดยเนนการใชงานผาน Asterisk ซงเปนซอฟตแวรประเภท Open-Source ทมฟงกชนการท างานหลากหลาย และยดหยนในการใชงาน

การปรบปรงครงน ท าเพอน าไปใชใน CoE Summer Camp 2011 ภายใตการด าเนนการของภาควชาวศวกรรมคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยสงขลานครนทร โดย Workshop นมจดมงเนนใหผ เขาอบรมเขาใจแนวทางในการพฒนาซอฟตแวร โดยมลกษณะคลายคลงกบ Call Center ทงนเอกสารไมควรถกน าไปอางองในการพฒนาจรง เนองจากเนอหาบางสวนถกดดแปลงเพอใหเหมาะสมกบระยะเวลาของการอบรม

หากพบขอผดพลาด หรอตองการน าเอกสารนไปใชงาน โปรดแจงผ จดท า เพอจะไดท าการปรบปรงเนอหาใหถกตอง และเหมาะสมยงขน

ผจดท า

บทน า

Page 6: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 1

Ch1 บรการโทรศพทผานระบบ Internet ซงรจกในชอ IP Telephony เปนเทคโนโลยทรวมการสงสญญาณเสยงกบ

ขอมลไวดวยกน เพอใหการสงสญญาณทงสองไปบนระบบเครอขายดวย Protocol ทใชกนอยางแพรหลายอยาง Internet Protocol ได ระบบ IP Telephony ในปจจบนสามารถใชไดกบหลาย Protocol แต SIP (Session initiation

protocol) ถอเปน Protocol ทมการใชงานแพรหลายทสดในปจจบน และมการพฒนามาอยางตอเนอง ซงการพฒนาภายใตมารตฐานทยอมรบกนทวโลก จะชวยท าใหมนใจไดวาระบบทสรางขน สามารถท างานรวมกบผลตภณฑจากบรษทตางๆ ไดอยางไมมปญหา

ในบทนผ เรยนจะไดเหนระบบ IP Telephony ทไดจ าลองขนมา รวมถงไดรจก SIP Soft-phone และการตดตงเพอใชโทรศพทหากนผานทาง Asterisk server

1.1 เครอขายทใชในการทดลอง

รปท 1 Architecture ทใชในการทดลอง

จาก รปท 1 จะแสดงใหเหนวาการท างานของ Asterisk นนสามารถใชงานรวมกบอปกรณทใชในการเชอมตอเกยวกบทางโทรศพทได โดยจากรป Asterisk จะเปนตวกลางในการท าการเชอมตอระหวาง Asterisk กบ Asterisk หรอ Asterisk กบ โทรศพททเปน Analog phone หรอ WiFi phone โดยผาน SIP โปรโตคอล

1 IP TELEPHONY OVERVIEW

Page 7: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 2

1.2 การตดตง X-Lite

โปรแกรม X-Lite นนเปนโปรแกรมประเภท SIP Soft-phone หมายถงโปรแกรมทมความสามารถในการรบ, สง และประมวลผลสญญาณ SIP พนฐาน ซงในการทดลองนจะเลอกใชโปรแกรม X-Lite เนองจากโปรแกรมดงกลาวงายตอการใช และยงสามารถหาใชไดในหลายระบบปฏบตการอกทงในโปรแกรม X-Lite นนยงคงเปน Freeware จงสะดวกแกการใชงาน

1.2.1 ทดลองการตดตงและปรบแตงคาของโปรแกรม X-Lite

1. ในการทดลองนจะใช X-Lite ทท างานบนระบบปฏบตการ Windows

2. Download ไฟลตดตง X-Lite จากนนท าการตดตงโปรแกรมเหมอนตดตงโปรแกรมธรรมดาทวไปจะไดตว

โปรแกรมดงรปท 2

รปท 2 โปรแกรม X-Lite

3. ปรบปรงคาการท างานของโปรแกรม X-Lite โดยใชเมน Softphone -> Account Settings

4. ในหนาตางก าหนดคา ใหกบก าหนดคา User ID, Domain และ Password อยางเหมาะสม แลวกดป ม OK

5. เรยกป มกดตวเลขจาก ไอคอนป มโทรศพทดานซายมอบนของโปรแกรม ท าการกดป มตวเลข แลวกดป ม Call

Page 8: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 3

1.2.2 การทดลองใชงาน X-Lite

ใหผท าการทดลองใชโปรแกรม X-Lite เพอท างานดงตอไปน

ตงคา X-Lite ใหลงทะเบยนไปยงเครอง SIP server (ทก าหนดในชอง Domain ของ X-Lite) ทไดเตรยมไวใหระหวางการทดลองโดยใช username เปน coeXX และ password เปน coeXX โดย XX คอคาตงแต 01-60

ซงจะก าหนดใหในหอง

ทดสอบการเชอมตอของโปรแกรม X-Lite โดยใหผทดลองท าการโทรไปยงเครองปลายทางเครองอนๆโดยผานทาง SIP URL ทไดมอบใหแกผ ใชระหวางการทดลอง (เครองปลายทางทจะท าการโทรตดตอไปนนจะตองเปนเครองทสามารถลงทะเบยนกบ SIP server ไดแลวเทานน)

ทดสอบการเรยกสายผานหมายเลขโทรศพทแทนการใช SIP URL โดยผ ใช coeXX จะมหมายเลขโทรศพทเปน 20XX

Page 9: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 4

Ch2 2.1 SIP Configuration

การนยาม Sip Protocol ใน Asterisk รวมไปถงผ โทรและผ ใหบรการจะก าหนดไวในไฟล sip.conf ซงเปนไฟลทเกบคณสมบตตางๆของผใช

ตวอยางไฟล sip.conf

01 [John]

02 type = friend

03 secret = welcome

04 host = dynamic

05 context = incoming

บรรทดท 1 เปนการ ตงชอ account หรอ username โดยชอของ account จะอยภายใตของวงเลบ [] จากตวอยาง account มชอวา John

บรรทดท 2 เปนการก าหนด type สามารถก าหนดได 3 แบบ คอ user, peer, friend

user หมายความวา account น สามารถรบสายไดเพยงอยางเดยว

peer หมายความวา account น สามารถเรยกสายไดเพยงอยางเดยว

friend หมายความวา account น สามารถรบรบสายและเรยกสายได

บรรทดท 3 เปนการก าหนดรหสผานในการ Log-in การใชโทรศพทใหกบ account นนๆ

บรรทดท4 ถาก าหนดคาเปน dynamic หมายความวา จะตองท าการ ลงทะเบยน ผใชกอนถงจะสามารถใชงานได โดยสามารถลงทะเบยนจากเครองทม IP Address ใดกได แตหากก าหนดเปนชนด static เครองทใชงานไมจ าเปนตองลงทะเบยน โดยจะตองมการก าหนด IP address เพมเตมในไฟล sip.conf และเครองทจะใชงาน account นจะตองเปนเครองทม IP Address ตามทระบไวเทานน

บรรทดท 5 context ในไฟลน จะเปนการก าหนดวา เมอผ ใชเรยกสายเขามา จะไปใชขอก าหนดหมายเลขสวนใดในไฟล extensions.conf

2 ASTERISK INSTALLATION & DIAL PLAN BASICS

Page 10: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 5

2.1.1 การทดลองปรบแตงคา sip.conf

1. เปดไฟล sip.conf ในไดเรกทอร /etc/asterisk/

2. เพม account จ านวน 2 account โดยใสขอมลดงตวอยาง

[user1] type = friend

secret = xxx

host = dynamic

context = incoming

[user2] type = friend

secret = xxx

host = dynamic

context = incoming

3. save ไฟล sip.conf

4. reload Asterisk โดยใชค าสง

>>/etc/init.d/asterisk reload

5. ทดสอบใช X-Lite ท าการ register ไปยง Asterisk โดยใช username และ password ทไดก าหนดไวใน sip.conf

2.2 Dial plan Syntax

Dial plan คอการก าหนดหมายเลขเบอรโทรศพทจะใชเรยกสายผานทาง Asterisk โดยจะท าการก าหนดรายละเอยดในไฟล extensions.conf .ทงนไฟลจะม 4 สวนหลก คอ Context Extension Priority และ Application

2.2.1 Context

Dial plan สามารถทจะแยกกนเปนสดสวนชดเจนดวย context ซงชอของ context ทตงขนมาเสมอนเปนชอของกลมของหมายเลขทสามารถใชอางองไดในการก าหนด Dial plan ในการตงชอ context นนท าโดยการใสชอไปในเครองหมาย bracket [] ใน Dial plan จะม context พเศษ 2 ตว คอ [general] และ [globals] ซง context ทง 2 น จะชวยใหระบบมความยดหยนในการใชงานมากขน

Page 11: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 6

[general] เปนสวนทมไวส าหรบก าหนดคาทวไปใหกบ Dial plan ทงหมด ซงจะม Option ใหก าหนดได 3 คา

ดงน

o static = yes | no ถาก าหนดเปน no จะไมมผลตอะระบบ แตถาก าหนดเปน yes และก าหนด

Option writeprotect = no จะท าใหสามารถบนทก Dial plan ผานทาง CLI ได โดยใชค าสง save

Dial plan

o writeprotect = yes | no เปน Option ทก าหนดเพอบนทก Dial plan ผานทาง CLI ได

o autofallthrough = yes | no ถาก าหนดเปน yes จะท าให Asterisk วางสายใหทนททจบการ

ท างาน แตถาก าหนดเปน no จะท าให Asterisk รอการกดหมายเลขเพอโทรตอ ซงจาก Option นจง

ควรก าหนดใหวางสายทนททจบการท างาน

[globals] ไวส าหรบ ก าหนดคาตวแปรแบบ Global Variables ซงสามารถทจะก าหนดคาของตวแปรไวใน

[globals] นแลวสามารถน าชอตวแปรทไดตงไวไปใชงานตอไปใน context อนได

ตวอยาง

01 [general]

02 static = yes

03 writeprotect =no

04 autofallthrough=yes

05

06 [globals]

07 DAVID=SIP/david

08

09 [incoming]

10 exten => 332,1,Dial(SIP/peter)

11 exten => 333,1,Dial(${DAVID})

จากตวอยาง จะเหนวาม 3 Context ประกอบดวย [general] , [globals] , [incoming] ใน [general]

มการก าหนด Option static=yes และ writeprotect = no เพอใหสามารถบนทก Dial plan จาก CLI ได และ Option autofallthrough = yes เพอสง Asterisk ใหวางสายทนททจบการท างาน สวน [globals] จะมการประกาศตวแปร DAVID ซงเกบคา SIP/david ไว เวลาใชงานตวแปรสามารถท าโดยใชเครองหมาย $ และใสตวแปรทแปรกาศไวในเครองหมาย {} ดงบรรทดท 11 ในตวอยาง ซงถาหากไมมการประกาศตวแปรไวกตองท าดงบรรทดท 10

Page 12: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 7

2.2.2 Extension

Extension หรอหมายเลขโทรศพทนนสามารถทจะก าหนดในแตละ context ไดหลายหมายเลขตามทตองการ โดยการท างานของ Asterisk นนจะท าตาม Dial plan ทก าหนดไวแตละขนของแตละ extension การก าหนด extension นนจะใชค าวา “exten”แลวตามดวยลกศร ดง Syntax ตวอยางตอไปน

exten =>

ในการก าหนด extension จาก Syntax ตวอยางสามารถตามดวยหมายเลขโทรศพท หรอจะก าหนดเปนตวอกษรกไดตามตองการ ซง context ทสมบรณและใชงานไดนนตองประกอบไปดวย 3 สวนหลกคอ

exten => name,priority,application()

name ซงอาจเปนตวอกษรหรอหมายเลขทจะก าหนดใหเปน extension

priority ส าหรบก าหนดขนตอนการท างานใหเปนไปตามล าดบ ในกรณทมการท างานหลายขนตอน ซงล าดบการท างานในแตละขนเรยกวา priority

application เปนตวส าหรบก าหนด action ใหกบ Asterisk วาจะท าอะไรเมอมสายโทรเขายง extension

นน

ตวอยาง Extension

exten => 123,1,Answer()

จากตวอยาง name ของ extension คอ 123 ม priority เปน 1และ ม applicationชอ Answer

2.2.3 Priority

ใน Dial plan จะมการก าหนดการท างานของแตละ extension อย ซงแตละ extension สามารถมการท างานหลายขนตอน ในการก าหนดขนตอนการท างานใหตามล าดบนนจะก าหนด priority เปนหมายเลขไว เพอให Asterisk

ท างานตามทก าหนด

ตวอยางการใช priority

exten => 123,1,Answer()

exten => 123,2,Hangup()

จากตวอยางการใช Priority จะเหนวาเมอโทรไปยงหมายเลข 123 ในล าดบแรกจะท าการรบสาย หลงจากนนในล าดบทสองกจะวางสาย

ในกรณทไมตองการระบหมายเลขในล าดบตอไปนนสามารถใชตวอกษร “n” แทนการระบล าดบถดไปได

Page 13: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 8

exten => 123,1,Answer()

exten => 123,n,do something

exten => 123,n,do something else

exten => 123,n,do one last thing

exten => 123,n,Hangup()

จากตวอยางจะเหนวาในล าดบแรกจะท าการรบสาย ในล าดบตอไปแทนทจะก าหนดเปนหมายเลข 2 ใชตวอกษร “n” แทนได

2.2.4 Application

Application จะเปนสงทก าหนดถงการกระท าทจะใหเกดขนกบผทโทรเขาไปยงหมายเลขนน เชน การเลนเสยงรอสาย การรบสายอตโนมต การวางสาย ซงจากตวอยางทไดผานมาแลวนนกจะไดเหน application Answer() และ

application Hangup() เพอสงใหรบสาย และวางสายตามล าดบ

2.3 A Simple Dial plan

ในหวขอนจะอธบายการสราง Dial plan ดวยการใช s extension และการใช Application 3 ตว คอ Answer() Playback() และ Hangup()

2.3.1 The s extension

s extension เปน extension พเศษ อกษร s ยอมาจาก start ซงมกน าไปใชเปน extension ในกรณตอนทเขาไปส context ใหมโดยไมมการกดหมายเลข จงมการน า s ไปใสแทน เชน ในกรณโทรศพทจาก PSTN ขางนอกบรษทเขามาสพอรตทเปน FXO ของบรษทเพอเขาสระบบ IVR เปนตน

ตวอยาง

[incoming]

exten => s,1,Answer()

exten => s,n,Playback(hello-world)

exten => s,n,Hangup()

จากตวอยาง เมอโทรเขามาทาง PSTN แลว Asterisk กจะท าการรบสาย และเลนเสยงจากไฟล hello-world

หลงจากนนกวางสาย ซงจะเหนวา extension ทใช คอ s ซงใชเพอเรมเขาส context incoming

Page 14: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 9

2.3.2 The Answer() , Playback() , Hangup() Application

ในระบบตอบรบอตโนมตในการสงงานให Asterisk รบสาย เลนเสยง และวางสาย จะประกอบดวย application 3

ตว คอ

Answer() ส าหรบรบสายทโทรเขามา

Playback() ส าหรบเลนเสยงจนจบไฟลกอนทจะท าใน priority ถดไป ซงชอของไฟลเสยงนนจะก าหนดไวในเครองหมายวงเลบ

Hangup() ส าหรบวางสาย

2.4 Our first Dial plan

Dial planทจะสรางขนนจะท าการรบสายเมอมการโทรเขาไปทหมายเลข 1111 แลวท าการเลนเสยง HelloWorld

หลงจากนนกจะวางสาย ซงท าไดตามการทดลองดงน

1. เปดไฟล extensions.conf ในไดเรกทอร /etc/asterisk/

2. ก าหนดคาใน context [incoming] ตามตวอยางดงน

[incoming]

exten => 1111,1,Answer()

exten => 1111,n,Playback(hello-world)

exten => 1111,n,Hangup()

3. Save ไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

4. ทดสอบผลโดยใช X-Lite โทรไปยงหมายเลข 1111

Page 15: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 10

Ch3 หลงจากไดเขาใจพนฐานทส าคญในการก าหนด Dial plan แลว ในบทนกจะอธบายในการใชงาน Dial plan ทม

ความซบซอนมากขน การพฒนาเปนระบบตอบรบอตโนมต การก าหนดหมายเลขเพอทจะโทรไปหา user คนอนๆ นอกจากนยงไดเขาใจการใช extension พเศษในการจดการกบหมายเลขและเวลา timeout การใชตวแปรในไฟล extensions.conf และการก าหนด Regular Expression ใหกบ Dial plan

3.1 การใชงานค าสง Background()

ค าสง Background() เปนค าสงทท าหนาทเชนเดยวกนกบค าสง Playback() ทไดทดลองไปในบทเรยนกอนหนา นนคอสามารถใชเลนไฟลเสยงทเกบบนทกไวเชนกน แตสงทแตกตางจากค าสง Playback() คอเมอผ ใชกดป มใดๆบนโทรศพทจะสงผลใหหยดการเลนไฟลเสยงดงกลาวแลวเ รมท างานอนๆตอไป ตวอยางการน าค าสง Background() ไปประยกตใชคอการสราง Voice Menu

exten => 123,1,Background(/tmp/my-sound)

3.1.1 การทดลองใชค าสง Background()

1. ผท าการทดลองใชโปรแกรม Audacity อดเสยงพด โดยท าตามวธตอไปน

a. เรยกโปรแกรม Audacity จะปรากฎโปรแกรมดงรปท 3

รปท 3 โปรแกรม Audacity

3 DIALPLAN CONCEPTS

Page 16: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 11

b. ปรบระดบเสยงของไมโครโฟน (สงเกตรปไมโครโฟนดานขวามอ) ใหเปนระดบสงสด

c. กดป มทเปนรปวงกลมสแดงเพอเรมการอดเสยง และกดป มสเหลยมเมอตองการหยดอดเสยง ซง

เสยงพดคอ

กรณากดหมายเลขหนงหรอสองเพอฟงเสยง และกดหมายเลขสาม เมอตองการสนสด

d. ในการจดเกบขอมลเสยงเลอก File > Export ดงรปท 4 โดยใหจดเกบไฟลเสยงชอ my-sound.wav ใน

ฟอรแมต WAV(Microsoft) signed 16 bit PCM ไวท /tmp

รปท 4 การจดเกบไฟลเสยง

2. เปลยนไฟลเสยงใหอยในรปแบบทโปรแกรม Asterisk สามารถเขาใจไดโดยใชค าสง

sox /tmp/my-sound.wav –r 8000 –c1 /tmp/my-sound.gsm rate -ql

3. ลบไฟล /tmp/my-sound.wav ทง เหลอไวเพยงไฟล /tmp/my-sound.gsm ซงเปนผลลพธของโปรแกรม sox

Page 17: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 12

4. เปดไฟล extensions.conf แลวเพมบรรทดตอไปนลงไป

[incoming] exten => 300, 1, Answer() exten => 300, 2, Background(/tmp/my-sound) include => internal

[internal] exten => 1, 1, Playback(digits/1) exten => 2, 1, Playback(digits/2) exten => 3, 1, Hangup()

5. สง reload Asterisk

>> /etc/init.d/asterisk reload

6. ทดสอบผลการใชงานค าสง Background() โดยใหผท าการทดลองใชโปรแกรม X-Lite โทรไปยงเครอง Asterisk ท

เบอร 300 ผลการท างานของโปรแกรมนนคอ ผท าการทดลองควรไดยนเสยงตามทไดบนทกไวในไฟล my-

sound.wav และเมอผใชกดป ม 1 จะสงผลใหโปรแกรมอานค าวา one และเมอผ ใชกดเลข 2 โปรแกรมจะอานค า

วา two ออกมา

3.2 การใชงานค าสง Goto()

ค าสง Goto() มหนาทในการ forward การท างานของ Dial plan ไปยงต าแหนงอนๆทตองการได

exten => 123, 1, Goto(context,extension,priority)

Page 18: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 13

3.2.1 การทดลองน าค าสง Goto() มาใชรวมกบค าสง Background()

1. เปดไฟล extensions.conf แลวเปลยนแปลงไฟลใหมคาตอไปน

[incoming] exten => 300, 1, Answer() exten => 300, 2, Background(/tmp/my-sound) include => internal

[internal] exten => 1, 1, Playback(digits/1) exten => 1, 2, Goto(incoming,300,1) exten => 2, 1, Playback(digits/2) exten => 2, 2, Goto(incoming,300,1) exten => 3, 1, Hangup()

2. ท าการ reload Asterisk

>> /etc/init.d/asterisk reload

3. ทดสอบการท างานของ Goto() โดยใหผท าการทดลองเปดโปรแกรม X-Lite แลวโทรมายงเบอร 300 ซงผลลพธท

ไดคอ โปรแกรมจะกลบมาเลนไฟลเมนเสยงเมอกดป ม 1 หรอ 2 ไปแลวและจะหยดการท างานเมอเมนเสยงเลน

จนจบ, ผใชวางสาย หรอกดป ม 3

Page 19: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 14

3.3 การจดการ Invalid Entries and Timeouts

Invalid Entries คอผ ใชกดเมนเสยงทไมมอยจรง เชนกดเลข 4 ในการทดลอง Background() และ Goto()โดย

เมอเกดเหตการณดงกลาวขน Asterisk จะกระโดดไปท า i extension

Timeouts คอเหตการณทผใชไมไดกดป มใดๆภายในระยะเวลาทก าหนด (คา default คอ 10 วนาท) ซงจะสงผล

ให Asterisk กระโดดไปท า t extension

3.3.1 การทดลองใชงาน Invalid Entries และ Timeouts

1. เปดไฟล extensions.conf แลวแกไขดงใหมรปแบบดงตอไปน

[incoming]

exten => 300, 1, Answer()

exten => 300, 2, Background(/tmp/my-sound)

include => internal

[internal]

exten => 1, 1, Playback(digits/1)

exten => 1, 2, Goto(incoming,300,1)

exten => 2, 1, Playback(digits/2)

exten => 2, 2, Goto(incoming,300,1)

exten => 3, 1, Hangup()

exten => i, 1, Playback(pbx-invalid)

exten => i, 2, Goto(incoming,300,1)

exten => t, 1, Playback(vm-goodbye)

exten => t, 2, Hangup()

2. บนทกไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

3. ใหผท าการทดลอง โทรเขาไปยงเครอง Asterisk โดยผานทางเบอร 300 ขณะทก าลงฟงเสยงตอบรบ ผท าการ

ทดลองกดป มอนๆนอกจาก 1, 2 และ 3 เพอให Asterisk เลนไฟลเสยง pbx-invalid

Page 20: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 15

3.4 การใชงาน Variable

การใชงานตวแปร (Variable) ใน Asterisk มเพอลดความซบซอนของ Dial plan และท าใหอานไดงายขนโดยชนดของตวแปรจะม 3 ชนดนนคอ

1. Global variables คอตวแปรทสามารถใชงานไดทง Dial plan โดยการประกาศตวแปรดงกลาวสามารถท าได 2

วธดวยกน คอ

a. ประกาศภายใต globals context

[globals]

MY_VAR=0

b. ประกาศโดยใชค าสง Set(GLOBAL())

[internal]

exten => 123, 1, Set(GLOBAL(MY_VAR)=1)

2. Channel variables คอตวแปรทถกประกาศไวเปนมาตรฐานของ Asterisk ซงสามารถน ามาใชงานไดทนท

3. Environment variables คอการเขาถงตวแปร Unix environment variable โดยผานทาง Dial plan ของ

Asterisk ซงการเขาถงสามารถท าไดโดยใชค าสง

${ENV(var)}

var คอชอของ Unix environment variable ทตองการ

Page 21: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 16

3.4.1 การทดลองใชงาน Variable รวมกบ Dial plan

1. ใหผท าการทดลองเปดไฟล extensions.conf แลวปรบปรงใหมลกษณะตอไปน

[globals] MY_VAR=0 [incoming] exten => 500, 1, Answer()

exten => 500, 2, SayDigits(${MY_VAR})

exten => 501, 1, Answer()

exten => 501, 2, Set(GLOBAL(MY_VAR)=1)

exten => 501, 3, Playback(vm-goodbye)

exten => 502, 1, Answer()

exten => 502, 2, Set(GLOBAL(MY_VAR)=2)

exten => 502, 3, Playback(vm-goodbye)

2. Save ไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

3. ทดลองโทรหาเบอร 500, 501, 500, 502 และ 500 ตามล าดบ

Page 22: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 17

3.5 การใชงาน Pattern Matching

Pattern Matching มไวเพอลดจ านวน extension ทจะตองเขยนใน Dial plan โดย Pattern Matching จะใชสญญลกษณ ตางๆ เพอแสดงความหมายถงตวเลขหรอค าศพทอนๆ โดยการเรมเขยน extension ทเปน Pattern

Matching นนตองเรมตนดวย underscore (_) หลงจากเครองหมาย underscore จะตามดวยตวอกษรตอไปน

X ใชแทนตวเลขใดๆ ตงแต 0 ถง 9

Z ใชแทนตวเลขใดๆ ตงแต 1 ถง 9

N ใชแทนตวเลขใดๆ ตงแต 2 ถง 9

[123-5,9] ใชแทนตวเลข 1, 2, 3, 4, 5 หรอ 9

. เรยกวา Wildcard หมายถงแทนตวอกษรอะไรกได

โดยตวอยางการใชงาน Pattern Matching คอ

exten => _NXX, 1, Playback(auth-thankyou)

ซงตวอยางขางตนจะสงผลคอ เมอผท าการทดลองโทรมายงเบอรใดๆตงแต 200 ถง 999 จะเปนการเลนไฟลเสยง auth-thankyou.gsm

3.5.1 การใชงาน ${EXTEN}

${EXTEN} เปน variable พเศษทใชอางองถงตวเลขทผท าการทดลองไดกดไปใน Pattern Matching โดยการใชงานนนจะมรปแบบดงน

exten => _XXX, 1, SayDigits(${EXTEN})

หรอ exten => _XXX, 1, SayDigits(${EXTEN:1})

ตวอยางแรกจะเปนการเลนไฟลเสยงตามตวเลข 3 ตวทผท าการทดลองกดมา และตวอยางทสองจะท าการเลนไฟลเสยงเพยง 2 ตวสดทายนนคอเครองหมาย: 1 จะเปนการตดตวอกษรตวแรกทง

Page 23: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 18

3.5.2 การทดลองใชงาน Pattern Matching

1. เปดไฟล extensions.conf แลวดดแปลงดงตอไปน

[incoming]

exten => _053XXX, 1, Answer()

exten => _053XXX, 2, Goto(${EXTEN:3}, 1)

exten => 500, 1, SayDigits(1)

exten => 500, 2, Hangup()

exten => _6XX, 1, SayDigits(${EXTEN:1})

exten => _6XX, 2, Hangup()

2. Save ไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

3. ใหผท าการทดลองทงสองใชโปรแกรม X-Lite โทรมายงเบอร 053500, 053600 และ 053648

4. การทดลองน ผท าการทดลองจะเหนวาเมอกดเบอร 053500 และ 500 นนผลลพธทไดจะตรงกน นนคอผท าการ

ทดลองสามารถน า Pattern Matching มาชวยในการออกแบบ Dial plan ใหมความสามารถในการใสหมายเลข

รหสพนทใหบรการได

Page 24: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 19

Ch4 ในบทนจะกลาวถง Dial plan ซงจะมลกษณะเปน Programming มากขน ซงจะมการใชงานตวแปร มการ

ตรวจสอบเงอนไข การวนลป และการเรยกใชฟงกชน ท าใหการก าหนด Dial plan ของ Asterisk ท าไดสะดวกมากขน

4.1 Basic Expression

ในการทดลองนจะกลาวถงการใชงาน Basic Expression ซงหมายถงการกระท า operation ระหวางคาตวแปรหรอตวเลข ภายใน Dial plan การใชงาน expression สามารถท าไดโดยใช

$[expression]

เชน

$[${NUMBER} + 1] ;หมายถงการน าตวแปรชอ NUMBER มาบวกดวย 1

จากตวอยางขางตนการท า operation กนนนจะตองมการใสเครองหมายเวนวรรค “ “ คนไวระหวาง operator

เสมอ นนคอระหวางเครองหมายบวก (+) และตวเลขทงสองจะตองมการเวนวรรค มฉะนน Asterisk จะถอวาเปนตวอกษรธรรมดา เชน

$[1+2] ;เปนวธทผดซงผลลพธทไดจะเปนตวอกษร “1+2” $[1 + 2] ;เปนวธทถกตองใหผลลพธเปน “3”

4.1.1 การทดลองใชงาน Expression และ Operation

1. เปดไฟล extensions.conf แลวเพมเตมบรรทดตอไปน

[incoming]

exten => 700, 1, Answer()

exten => 700, 2, Set(NUMBER=1)

exten => 700, 3, SayNumber(${NUMBER})

exten => 700, 4, Set(NEWNUMBER=$[${NUMBER} + 2])

exten => 700, 5, SayNumber(${NEWNUMBER})

exten => 700, 6, Hangup()

4 MORE DIALPLAN CONCEPTS

Page 25: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 20

2. บนทกไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

3. ท าการโทรไปยงหมายเลข 700 จะสงผลให Asterisk ตอบกลบมาเปนตวเลข 1 (one) และ 3 (three) เนองจากใน

context priority ท 2 เปนการตงคาตวแปร NUMBER ใหมคาเทากบ 1 และใหพดตวเลขดงกลาวออกมาใน

priority ท 3 หลงจากนนใน priority ท 4 ท าการเพมคา NUMBER ดวยการบวกสอง แลวเกบคาทเพมนนไวในตว

แปร NEWNUMBER และพดออกมาทาง priority ท 5

4. การท า operation กนของตวแปรหรอตวเลขใน Asterisk นนสามารถมไดมากกวาการบวก (+) ซงผท าการ

ทดลองสามารถเปลยนเครองหมาย (+) เปนเครองหมาย ลบ (-), คณ (*) หรอหาร (/) ได เชน

exten => 700, 4, Set(NEWNUMBER=$[${NUMBER} * 2])

4.2 Dial plan Functions

เชนเดยวกบการเขยนโปรแกรมโดยทวไป Dial plan ของ Asterisk มการสรางฟงกชน (Function) เพอชวยการท างานของ Dial plan ใหมความสามารถมากขน ซงการเรยกใชฟงกชนนนสามารถท าไดเหมอนกบการเรยกใชตวแปรธรรมดา นนคอ

${FUNCTION_NAME(argument)}

4.2.1 ทดลองใช Dial plan Function

1. เปดไฟล extensions.conf แลวแกไขไฟลดงกลาวตอไปน

[incoming]

exten => 800, 1, Answer()

exten => 800, 2, Set(WORD=HelloWorld)

exten => 800, 3, SayNumber(${LEN(${WORD})})

exten => 800, 4, Hangup()

2. Save ไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

Page 26: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 21

3. หลงจากนนผท าการทดลองโทรไปยงเบอร 800 จะไดยนเสยงค าพดวา 10 (ten) เพราะใน extension priority ท

2 นนค าสง Set(WORD=HelloWorld) เปนการประกาศตวแปร WORD ใหมคาเทากบ HelloWorld หลงจากนน

extension priority ท 3 จะเปนการสงให Asterisk พดความยาวของตวแปรดงกลาวโดยผานทางค าสง

SayNumber(${LEN(${WORD})})

4.3 Condition Branching

การท า Condition Branching เปนความสามารถทท าให Dial plan ของ Asterisk สามารถตดสนใจการท างานตางๆ ได โดยในการทดลองนจะใชค าสงหลกคอ GotoIf() ซง syntax ของค าสงดงกลาว คอ

GotoIf(expression?destination1:destination2)

4.3.1 การทดลองใชงาน GotoIf()

1. เปดไฟล extensions.conf แลวแกไขไฟลดงตอไปน

[incoming]

exten => 800, 1, Answer()

exten => 800, 2, Set(NUMBER=1)

exten => 800, 3, GotoIf($[${NUMBER}=1]?4:6)

exten => 800, 4, Playback(afternoon)

exten => 800, 5, Hangup()

exten => 800, 6, Playback(evening)

exten => 800, 7, Hangup()

2. บนทกไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

3. เมอผท าการทดลองโทรไปยงเบอร 800 โปรแกรม Asterisk จะอานไฟลเสยงค าวา afternoon ออกมา

4. ทดลองเปลยน extension priority ท 2 เปน

exten => 800, 2, Set(NUMBER=2)

5. โทรไปยงหมายเลข 800 เชนเดม สงเกตวาโปรแกรม Asterisk จะอานเสยงค าวา evening ออกมา

Page 27: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 22

6. ทดลองใชงาน Goto() และ GotoIf() เพอใชในการเขยน Dial plan ทมความสามารถมากขน โดยใหผท าการ

ทดลองแกไขไฟล extensions.conf ดงตอไปน

[incoming]

exten => 900, 1, Answer()

exten => 900, 2, Set(COUNT=10)

exten => 900, 3(Condition), GotoIf($[${COUNT} > 0]?:goodbye)

exten => 900, 4, SayNumber(${COUNT})

exten => 900, 5, Set(COUNT=$[${COUNT} – 1])

exten => 900, 6, Goto(condition)

exten => 900, 7(goodbye), Playback(goodbye)

exten => 900, 8, Hangup()

7. Save ไฟล แลวท าการ reload Asterisk โดยใชค าสง

>> /etc/init.d/asterisk reload

8. ใหผท าการทดลองโทรไปยงเบอร 900

Page 28: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 23

Ch5

ดวย Asterisk Gateway Interface (AGI) เราสามารถสรางโปรแกรมประยกตแบบสมบรณดวย Asterisk ไมวาจะเปนโปรแกรมประยกตทจ าเปนตองมการค านวนทซบซอน หรอโปรแกรมประยกตทมการเชอมตอกบฐานขอมล สรางความเปนไปไดทไมจ ากด และความยดหยนในการสรางโปรแกรมประยกตผานโทรศพทดวย Asterisk

ในบทน เราจะสรางโปรแกรมประยกตดวย Ruby on Rails เชอมตอกบ Asterisk ผาน Ruby AGI (RAGI) เพอจะท าการตรวจสอบยอดบญชธนาคารผานทางโทรศพท

5.1 รจก Ruby Asterisk Gateway Interface (RAGI)

Ruby Asterisk Gateway Interface (RAGI) เปน framework มารตฐานเปดเพอเชอมโยงระหวางโปรแกรมทพฒนาดวย Ruby on Rails เขากบ Asterisk ทงนเพอใหโปรแกรมประยกตจะสามารถควบคมการโทรเขาหรอโทรออกไดอยางยดหยน

ในปฏบตการตอนน เราจะท าความรจกกบองคประกอบตางๆ ของการพฒนาโปรแกรมประยกตดวย Asterisk

ผานทาง RAGI โดยจะทดลองให Asterisk ท าการเรยกใช AGI มายงตวโปรแกรมประยกตเพอท าการอานหมายเลข 1234 ทนททผใชโทรมายงเบอรโทรศพทหมายเลข 8008

5.1.1 เ รยกใช AGI จาก Asterisk

1. เปดไฟล extensions.conf แลวท าการเพมบรรทดเพอเพมเบอรโทรศพทหมายเลข 8008 ลงไป

[incoming]

exten => 8008, 1, Answer()

exten => 8008, 2, DeadAGI(agi://localhost/account/check_balance)

exten => 8008, 3, Hangup()

Answer เปนค าสงทใชส าหรบการรบสาย

Deadagi เปนค าสงทใชเรยก AGI

Hangup เปนค าสงทใชในการวางสาย

5 ASTERISK GATEWAY INTERFACE WITH RAGI

Page 29: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 24

2. สง reload Asterisk

>> /etc/init.d/asterisk reload

5.1.2 เ รมตนพฒนาโปรแกรม RoR

RoR ไดเตรยมเครองมอไวส าหรบการสรางโครงสรางของไดเรกทอรและไฟล ทจ าเปนเบองตนส าหรบโปรแกรมประยกตโดยอตโนมต การเขยนตวควบคมการโทรเขาและโทรออกผาน RAGI นน จะตองท าการเพมคาตดตง และสรางไดเรกทอรและไฟลเพมเตมตามขอก าหนดของ RAGI

1. เรมตนสรางโครงสรางของไดเรกทอรและไฟล

>> cd /root

>> rails banking

** ในการทดลองน ชอไดเรกทอร และชอไฟลตอจากน หากไมเรมตนจาก / ใหถอวาเรมตนจาก /root

2. ทดลองเขาไปแสดงรายการไดเรกทอรและไฟลทสรางโดยอตโนมต หลงจากนน ท าการสรางไดเรกทอร

app/andlers

>> cd banking

>> ls #for testing only

>> mkdir app/handlers

3. ท าการสรางไฟลใหมชอ app/handlers/account_handler.rb โดยเพมโคดตอไปนลงไปในไฟลดงกลาว โดยมขอสงเกตวา ชอคลาส และชอฟงกชน จะสอดคลองกบ URL ทใชในการเรยกใช AGI ของเบอร 8008 ไดถกก าหนดไวในขนตอน 5.1.1 ใหเรยกใช agi://localhost/account/check_balance จงมชอคลาสเปน AccountHandler และมชอฟงกชนเปน test

require 'ragi/call_handler'

class AccountHandler < RAGI::CallHandler

def check_balance

say_digits('1234')

end

end

say_digits เปนค าสงทใชในการแสดงขอความเสยงตามตวเลขทก าหนด

Page 30: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 25

4. เพมเตมโคขาง”ลางใหกบไฟล config/environment.rb เพอใหท าการสรางสวนเชอมตอ AGI เมอโปรแกรมเรมท างาน

# Simple server that spawns a new thread for the server

require 'webrick'

class SimpleThreadServer < WEBrick::SimpleServer

def SimpleThreadServer.start(&block)

Thread.new do

block.call

end

end

end

require 'ragi/call_server'

RAGI::CallServer.new(

:ServerType => SimpleThreadServer)

5.1.3 ทดสอบผลการท างาน

1. รนโปรแกรม โดยวธการเดยวกบการรนโปรแกรมประยกตทพฒนาดวย RoR

>> ruby script/server

2. ทดลองใช X-Lite โทรไปยงเบอรโทรศพทหมายเลข 8008

3. กด Ctrl + C ทหนาตางทใชรนโปรแกรมในขอ 1 เพอปดโปรแกรมประยกต

Page 31: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 26

5.2 เตรยมพรอมขอมล

ในปฏบตการตอนน จะท าการสรางฐานขอมลทจ าเปนตองใชในการพฒนาโปรแกรมประยกต โดยโปรแกรมประยกตทจะสรางขนมาในบทน คอโปรแกรมตรวจสอบยอดเงนในบญชผานทางโทรศพท ดงนนขอมลทจ าเปนตองปอนผานทางโทรศพท จะประกอบดวย หมายเลขบญช รหสผาน และเมอขอมลทปอนถกตอง ระบบจะท าการแจงยอดเงนในบญช นอกเหนอจากขอมลขางตน ระบบสามารถทจะเกบขอมลทเกยวของ แมวาจะไมน ามาใชในโปรแกรมประยกตผานทางโทรศพทกตาม ไดแก ชอบญช

5.2.1 สรางโมเดลและเวบเพจทใชจดการขอมลดวย Rails

ท าการสรางโมเดลดวย Rails generator ซงเปนเครองมอทจะชวยใหเราสามารถสรางโมเดล และ script ทจะชวยสรางตารางในฐานขอมลทก าหนดไดโดยอตโนมต

1. ใช rails generator ในการสรางโมเดล และเวบเพจสวนการเพม ลบ แกไขขอมลหมายเลขบญช

>> cd /root/banking #only current path is different

>> ruby script/generate scaffold account

account_number:string

password:string

account_name:string

balance:float #DO NOT enter, put space between lines

2. สรางตารางในฐานขอมลดวย rails migration tools โดยในขนตอนนใหสงเกตจากขอความทแสดงออกมาจากค าสงนวา ตารางสรางไดส าเรจหรอไม หากไมส าเรจ ใหตรวจสอบขนตอนกอนหนาอกครง ผลลพธของค าสงน จะไดฐานขอมล sqlite3 ทมโครงสรางตารางตามค าสงขอ 1

>> rake db:migrate

5.2.2 เพมขอมลเพอทดสอบ

ท าการรนโปรแกรมประยกตดวย RoR ทไดสรางไวจากการทดลองกอนหนา แลวท าการเพมขอมล Account เพอท าการทดสอบการตรวจสอบยอดเงนในบญช

1. รนโปรแกรมประยกตทสรางขน โปรแกรมสามารถตดตอจากเครองคอมพวเตอรอนผานทางระบบเครอขาย ในทก IP Address ของเครองทพฒนาโปรแกรม โดยใหระบ IP Address เปน 0.0.0.0

>> ruby script/server –b 0.0.0.0

2. ใช Web Browser และไปยง URL http://virtual_machine_ip:3000/accounts

Page 32: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 27

3. เมอ Browser แสดงผล แลวกดทลงค New Account แลวท าการกรอกขอมลดงน a. Account Number: 1001

b. Password: 1234

c. Account Name: John Doe

d. Balance: 15030

รปท 5 ฟอรมกรอกขอมล Account ใหม

4. ตรวจสอบขอมลกบรปท 6

รปท 6 ขอมล Account เพอท าการทดสอบ

Page 33: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 28

5.3 ตรวจสอบยอดเงน

ในการทดลองตอนน จะเปนขนตอนการเตรยมเสยงส าหรบตอบรบ และแนะน าผ ใชระหวางการใชงานโปรแกรมประยกตผานทางโทรศพท โดยจะเรมตนจากการทระบบใหผ ใชปอนหมายเลขบญช และรหสผาน กอนทจะสงขอมลดงกลาวไปยงโปรแกรมประยกตทเขยนขนดวย RoR เพอท าการตรวจสอบรหสผาน หากรหสผานถกตอง กจะอานยอดเงนในบญชใหผใชไดรบทราบ

5.3.1 เตรยมเสยงตอบรบ และแนะน า

เตรยมเสยงส าหรบแนะน าและแจงผลการท างานของโปรแกรมประยกต ไวใน /tmp/snd/

1. welcome.gsm: “ยนดตอนรบเขาสระบบตรวจสอบยอดเงนในบญชผานทางโทรศพท กรณากดหมายเลขบญช 4 หลก”

2. password.gsm: “กรณาปอนรหสผาน 4 หลก”

3. balance.gsm: “ยอดเงนของทาน คอ”

4. wrong_password.gsm: “หมายเลขบญช หรอรหสผานไมถกตอง”

5. thank_you.gsm: “ขอบคณทใชบรการของเรา”

5.3.2 เขยนโปรแกรมในฝง Asterisk

1. ปรบเปลยนไฟล extensions.conf โดยให หมายเลขโทรศพท 8008 เพอรบคาตวแปร ACCOUNT_NUMBER และ ACCOUNT_PASSWORD เพอเรยกใช check_balance

[incoming]

exten => 8008,1,Answer()

exten => 8008,2,Read(ACCOUNT_NUMBER,/tmp/snd/welcome,4)

exten => 8008,3,Read(ACCOUNT_PASSWORD,/tmp/snd/password,4)

exten => 8008,4,deadagi(agi://localhost/account/check_balance)

*ค าสง Read(var,file,digits) จะท าการเลนเสยง file (ลกษณะเดยวกบ Background) เพอรอรบการกดตวเลข โดยจ านวนตวเลขทรบจะไมเกนจ านวน digits และน าคาตวเลขทไดไปใสไวในตวแปร var

2. ท าการ reload คาการท างานของ asterisk

>> /etc/init.d/asterisk reload

Page 34: ระบบโทรศัพท์ส าหรับองค์กรยุคใหม่fivedots.coe.psu.ac.th/~suthon/asterisk/Asterisk Workshop_2011_1_… · 5.1.2 เริ่มต้น

Dept. of Computer Engineering, PSU หนา 29

5.3.3 เขยนโปรแกรมในฝงโปรแกรมประยกต

เปลยนแปลงเมธอด check_balance ในหวขอ 5.1.2 เพอท าหนาทในการใชหมายเลขบญช และรหสผานทไดรบ มาท าการคนหายอดเงนในบญช และท าการแจงยอดเงนในบญชดงกลาวใหกบผใชผานทางโทรศพท

def check_balance

account = get_variable('ACCOUNT_NUMBER')

password = get_variable('ACCOUNT_PASSWORD')

a = Account.find(:first, :conditions => ["account_number = ? and password = ?", account, password]) if a

say_number(a.balance)

else

stream_file("/tmp/snd/wrong_password", 0, "#") end

stream_file("/tmp/snd/thank_you", 0, "#") end

get_variable เปนค าสง AGI ทใชอานตวแปรจาก Asterisk

Account.find เปนค าสงของ ActiveRecord ซงเปน API ทมาพรอมกบ Ruby on Rails เพอใชในการคนหาขอมล โดย :first เปนการระบใหคนหาขอมลเพยงขอมลเดยวทมเงอนไขตรงกบทระบไวใน :conditions

say_number เปนค าสง AGI ทใชอานตวเลขทก าหนดให

stream_file เปนค าสง AGI ทใชในการอานเสยงจากไฟลทก าหนดให

5.3.4 ทดสอบใชงาน

ทดสอบโดยการใชโทรศพทโทรไปยงหมายเลข 8008 กดหมายเลขบญช 1001 และรหสผาน 1234