Giới Thiệu DialPlan

Một phần của tài liệu xây dựng và thiết kế một hệ thống thoại đáp ứng trong thực tế cho các doanh nghiệp nhỏ (Trang 70)

Dialplan là trái tim của hệ thống asterisk. Dialplan cho biết các cuộc gọi sẽ được xử lý như thế nào qua hệ thống asterisk. Dialplan bao gồm tập hợp các dòng lệnh hay các ứng dụng theo một trình tự nào đó mà hệ thống phải thực hiện để đáp ứng nhu cầu chuyển mạch cuộc gọi. Để hiểu rõ và cấu hình thành công hệ thống asterisk thì điều kiện tiên quyết là phải biết như thế nào dialplan hoạt động.

Dialplan là công việc thiết lập cho hoạt động của hệ thống như định hướng các cuộc gọi vào và ra hệ thống, đó là một danh sách các bước hay các lệnh liên tục nhau để thực hiện một tác vụ nào đó mà hệ thống phải thực hiện theo. Khác biệt với các hệ thống điện thoại truyền thống tất cả các công việc cấu hình hệ thống đều là từ phía người sử dụng.

Hệ thống chúng ta có hoàn chỉnh tốt hay không phụ thuộc rất nhiều vào việc chúng ta hiểu rõ vào dialplan hay không?.

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 71 -

Trong phần này sẽ tập trung đi vào thực hiện diaplan ở mức nền tảng thực hiện cuộc gọi trước khi đi sâu tìm hiểu kỹ phần sau.

Dialplan được cấu hình qua tập tin extension.conf, liên quan đến việc cấu hình dialplan có những khái niệm cần nắm đó là:

+ Extentions: Điện thoại nội bộ + Priorities: Thứ tự thực hiện + Applications: Các ứng dụng + Contexts: Các ngữ cảnh 4.6.1 Extentions

Dialplan là một tập gồm nhiều extention, khi một cuộc gọi tương ứng với extention nào thì ứng dụng cho cuộc gọi đó sẽ được thực hiện. Extention có thể đơn giản với một đích danh cụ thể như 8051, thanhhieu hay là một pattern được thực hiện như _9xxx. Ví dụ: /etc/asterisk/extention.conf exten=>8051,1,dial(sip/8051,20) exten=>8051,2,hangup()

“exten=>” giống nhau cho mỗi dòng thực hiện trong dialplan, 8051 là số điện thoại mà thuê bao quay hay là extention, còn các con số 1 và 2 là các priorites tức là thứ tự thực hiện các lệnh. Khi thuê bao quay số 8051 thì đỗ chuông máy ip sip 8051 nếu trong vòng 20 giây mà thuê bao không nhấc máy thì kết thúc cuộc gọi.

Extension là thành phần mà asterisk thực hiện theo, được kích hoạt khi có cuộc gọi vào extension chính là con số mà thuê bao đó cần gọi. Trong mỗi ngữ cảnh sẽ có thể có nhiều extension. Extenstion chính là hạt nhân để hệ thống xác định cuộc gọi cần thực hiện. Extenstion hoàn chỉnh gồm có các phần : exten => Name,priority,application( )

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 72 -

- Name (Tên ký tự hoặc con số) của extension

- Priority (Mỗi extension có thể bao gồm nhiều bước mỗi bước được gọi là “priority”)

- Application (or command) Thực hiện một ứng dụng cụ thể nào đó cho cuộc gọi.

Một ví dụ cụ thể như sau:

/etc/asterisk/extention.conf

exten => 7325010,1,Dial(Zap/1,20)

exten => 7325010,2,Voicemail(u7325010)

exten => Tương ứng với mỗi ứng dụng thực hiện

7325010 Con số nhận được khi thuê bao chủ gọi quay số. 1, 2 là các “priority” thứ tự được thực hiện 1 rồi tới 2…

Trong ví dụ của chúng ta con số 7325010 sẽ được gửi đến kênh zap/1 rung chuông tối đa 20 giây. Nếu sau 20 giây không trả lời thì cuộc gọi sẽ được định hướng đến hộp thư thoại u7325010 chữ u ở đây có nghĩa là “ 'u'navailable

message”.

4.6.2 Priorities – Thứ tự thực hiện

Priorities là thứ tự thực hiện các ứng dụng trong dialplan, khi thứ tự “1” được thực hiện thì kế tiếp là ứng dụng tại thứ tự số “2” được thực hiện, kể từ vertion 1.2 của Asterisk thay vì sử dụng gán một con số cụ thể cho thứ tự thực hiện như trên thì ở đây có thể gán ký tự “n” cho mọi dòng “exten=>” điều này sẽ nói với asterisk là ứng dụng với thứ tự tiếp theo sẽ thực hiện.

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 73 -

Ví dụ:

/etc/asterisk/extention.conf

exten=>8051,2,hangup()

exten=>8051,1,dial(sip/8051,20)

Ở ví dụ trên dòng có thứ tự “2” đứng trước dòng có thứ tự “1”, nhưng khi thực hiện diaplan thì dòng có thứ tự Priorities “1” ưu tiên thực hiện trước bất kể thứ tự sắp xếp như thế nào.

Ví dụ :

/etc/asterisk/extention.conf

exten=>8051,n,dial(sip/8051,20) exten=>8051,n,hangup()

Thứ tự thực hiện từng dòng 1 từ trên xuống dưới.

4.6.3 Aplications – Các hàm ứng dụng

Đây là phần quan trọng trong diaplan tức là ứng dụng nào sẽ được thực hiện trên mỗi dòng, các ứng dụng như thực hiện quay số, trả lời cuộc gọi hay đơn giản là nhấc gác máy để biết thêm thông tin về các ứng dụng cũng như các thông số kèm theo thì hãy dùng lệnh show Aplications trên giao tiếp dòng lệnh của asterisk:

CLI> show Aplications.

Dưới đây là một số hàm ứng dụng cơ bản:

4.6.3.1 Ứng dụng Playback() và Goto()

Ứng dụng Playback() là ứng dụng để phát các âm thanh đã được ghi âm. Khi người gọi nhấn phím trên bàn phím điện thoại, nó sẽ ngắt việc phát âm thanh và di chuyển đến extension mà tương ứng với phím bấm. Ứng dụng này thường được sử

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 74 -

dụng để xây dựng để tạo ra các lựa chọn trong hệ thống trả lời tự động.. Cấu trúc của nó như sau:

exten => 123,1,Background(hello-world)

Ứng dụng goto() được sử dụng để gởi cuộc gọi đến ngữ cảnh (context), extension, và thứ tự của extension (priority) khác. Ứng dụng goto được sử dụng làm cho việc lập trình di chuyển các cuộc gọi giữa các phần của dialplan một cách dễ dàng. Cấu trúc của ứng dụng Goto() cho phép chúng ta chuyển đến các ngữ cảnh, extension và priority đích như mong muốn, ví dụ như:

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

Trong ví dụ này, chúng ta sẽ sử dụng ứng dụng Background() và Goto() để tạo ra một dialplan, cho phép người gọi tương tác với hệ thống bằng cách nhấn phím trên bàn phím điện thoại. Bắt đầu với việc sử dụng Background() để chấp nhận việc nhấn phím từ người gọi:

[incoming]

exten => s,1,Answer( )

exten => s,2,Background(enter-ext-of-person)

Trong hai câu lệnh trên, khi có số gọi đến hệ thống sẽ trả lời và chúng ta sẽ phát file âm thanh enter-ext-of-person.gsm. Chúng ta sẽ thêm vào hai extensions để thực hiện tương tác khi người gọi ấn phím 1 hoặc 2.

[incoming]

exten => s,1,Answer( )

exten => s,2,Background(enter-ext-of-person)

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

Trong các câu lệnh trên, khi có người gọi đến, người gọi sẽ nghe lời chào: “Please enter the number you wish to call”. Nếu người gọi nhấn một, họ sẽ nghe đọc số 1, nếu nhấn 2, người gọi sẽ nghe số 2. Tiếp đến chúng ta sẽ sử dụng ứng dụng goto() để lặp lại lời chào sau khi đã phát âm thanh đọc số:

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 75 -

exten => s,1,Answer( ) exten => s,2,Background(enter-ext-of-person) exten => 1,1,Playback(digits/1) exten => 1,2,Goto(incoming,s,1) exten => 2,1,Playback(digits/2) exten => 2,2,Goto(incoming,s,1)

Hai câu lệnh in đậm sẽ thực hiện việc gởi điều khiển cuộc gọi trở về extension s sau khi đã phát âm thanh số tương ứng với việc lựa chọn.

4.6.3.2 Ứng dụng GotoIf( )

Việc thực hiện rẽ nhánh được sử dụng bằng ứng dụng GotoIf(). GotoIf() xác định biểu thức (expression) và gởi người gọi đến đích được chỉ định dựa vào việc xác định biểu thức đúng hay sai. Cú pháp của nó như sau:

GotoIf(expression?destination1:destination2)

Nếu biểu thức được xác định là đúng, người gọi sẽ được gởi đến đích 1 (destination1), nếu biểu thức sai, người gọi sẽ được gởi đến đích 2. Vậy thế nào là đúng và thế nào là sai? Một chuỗi trống hoặc số không được xác định là sai, còn lại đều là đúng.

Các đích có thể là :

• Thứ tự (priority) trong cùng một extension, ví dụ như 10.

• Một extension và thứ tự trong cùng một ngữ cảnh, ví dụ như 123,10 • Ngữ cảnh, extension, và thứ tự, ví dụ như incoming,123,10

• Tên của thứ tự trong cùng một ngữ cảnh, ví dụ như passed

Một trong hai đích có thể được bỏ trống, nhưng không thể là cả hai. Nếu một đích được bỏ trống thì asterisk đơn giản đi đến thứ tự tiếp theo trong extension hiện tại.

Ví dụ về Gotoif():

exten => 345,1,Set(TEST=1)

exten => 345,2,GotoIf($[{$TEST} = 1]?10:20) exten => 345,10,Playback(weasels-eaten-phonesys)

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 76 -

exten => 345,20,Playback(office-iguanas)

Bằng cách thay đổi giá trị của TEST ở dòng đầu tiên, chúng ta có thể làm cho asterisk phát lời chào khác nhau.

4.6.4 Contexts - Ngữ cảnh

Đầu tiên hãy hình dung như thế này, khi Cô Giáo và Sinh Viên trao đổi về môn cơ sở tin học viễn thông có nghĩa là ngữ cảnh (context) lúc này chỉ tập trung vào lĩnh vực viễn thông mà thôi. Như vậy ngữ cảnh (context) đã được giới hạn trong một tình huống cụ thể, đối với Asterisk ở đây cũng thế khi nói đến ngữ cảnh (context) thì thường quan tâm đến trường hợp cụ thể nào đó, điều này rõ ràng rằng trong hệ thống sẽ có rất nhiều ngữ cảnh (context) khác nhau.

Ví dụ khi gọi đến tổng đài Asterisk có một thông điệp thông báo như sau “Chào mừng các Bạn gọi đến công ty chúng tôi hãy nhấn phím 1 để gặp phòng kinh doanh phím 2 gặp phòng kỹ thuật…” khi người gọi chọn phím 1 thì hệ thống sẽ chuyển đến một ngữ cảnh (context) là [PhongKinhDoanh] khi người gọi nhấn phím 2 thì hệ thống sẽ định hướng cuộc gọi qua ngữ cảnh (context) [PhongKyThuat] như vậy ứng với mỗi trường hợp hệ thống sẽ có ngữ cảnh khác nhau, ngữ cảnh được đặt trong dấu [] . /etc/asterisk/extention.conf [PhongKinhDoanh] exten => 7325010,1,Dial(SIP/${EXTEN}),20) exten => 7325010,2,Voicemail(u${EXTEN}) [PhongKyThuat] exten => _9.,1,Dial(SIP/${EXTEN})

Ngoài ta đối với việc cấu hình cho các kênh thoại thì ngữ cảnh ở đây là việc xử lý các cuộc gọi tương ứng với kênh đó qua kế hoạch diaplan.

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 77 -

Ví dụ: /etc/asterisk/extention.conf [8051] Type=friend Context=Tu_SIP ……… [8052] Type=friend Context=noibo ……… /etc/asterisk/extention.conf [noibo] exten=>8051,1,dial(sip/8051,20) exten=>8051,2,hangup() [Tu_SIP] exten=>8052,1,dial(sip/8052,20) exten=>8052,2,hangup()

Khi thuê bao 8052 nhấc máy thì Asterisk chuyển cuộc gọi này đến ngữ cảnh [noibo] và chờ nhận con số quay, nếu thuê bao 8052 quay số 8051 thì số máy 8051 sẽ rung chuông trong vòng 20 giây, nếu qua 20 giây mà thuê bao 8051 không nhấc máy thì cuộc gọi sẽ kết thúc.

Khi thuê bao 8051 nhấc máy thì Asterisk chuyển cuộc gọi này đến ngữ cảnh [Tu_SIP] và chờ nhận con số quay, nếu thuê bao 8051 quay số 8052 thì số máy 8052 sẽ rung chuông trong vòng 20 giây, nếu qua 20 giây mà thuê bao 8052 không nhấc máy thì cuộc gọi sẽ kết thúc.

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 78 -

4.6.5 Chỉ định Pattern

Pattern cho phép chúng ta có thể chỉ tạo ra một extension nhưng có thể được chỉ định gọi được nhiều số. Khi sử dụng chỉ định pattern, chúng ta sử dụng các chữ cái và các ký hiệu khác nhau để tượng trưng cho các số có thể mà ta muốn chỉ định. Pattern luôn được bắt đầu với dấu gạch dưới (_). Điều này chỉ ra cho asterisk biết là chúng ta có chỉ định pattern, và không sử dụng tên gán cho extension. (Điều này có nghĩa là , chúng ta sẽ không được bắt đầu tên của extension với dấu gạch dưới). Nếu chúng ta quên dấu gạch dưới phía trước pattern, Asterisk sẽ nghĩ đó là tên của extension và không chỉ định bất kỳ pattern nào.

Sau dấu gạch dưới, chúng ta có thể sử dụng một hoặc nhiều hơn các ký tự sau:

- X: Chỉ định cho bất kỳ số nào từ 0 đến 9 - Z: Chỉ định cho bất kỳ số nào từ 1 đến 9 - N: Chỉ định cho bất kỳ số nào từ 2 đến 9.

- [15-7]: Chỉ định cho bất kỳ số nào nằm trong dãy số đã được ấn định. Trong trường hợp này, chỉ định 1,5,6, hoặc 7.

-. (period): Chỉ định wildcard; chỉ định một hoặc nhiều hơn các ký tự. Wildcard match; matches one or more characters.

Để sử dụng pattern trong dialplan, đơn giản chỉ là đặt pattern thay thế cho tên của extension (hoặc số):

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

Trong ví dụ này, pattern được chỉ định cho bất kỳ 3 số nào của extension từ 200 đên 999 (N chỉ định cho bất kỳ số nào từ 2 đến 9, và mỗi X chỉ định cho số từ 0 đến 9). Điều này có nghĩa là, nếu người gọi gọi bất kỳ 3 số nào giữa 200 và 999 trong ngữ cảnh này, người gọi sẽ nghe âm thanh của file auth- thankyou.gsmO’Reilly & Associates, Inc. All rights reserved.

Một điều quan trọng trong việc hiểu về chỉ định pattern là nếu asterisk tìm nhiều hơn một pattern mà được chỉ định cho extension được gọi, nó sẽ sử dụng

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 79 -

pattern nào chi tiết nhất. Ví dụ chúng tao có hai pattern được chỉ định như bên dưới, và người gọi gọi số 555-1212:

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

Trong trường hợp này extension thứ hai sẽ được chọn, bởi vì nó chi tiết hơn.

4.6.6 Include

Asterisk cho phép chúng ta dùng ngữ cảnh bên trong một ngữ cảnh khác thông qua sự định hướng của lệnh include. Điều này được dùng để cấp quyền truy cập đến các khu vực khác trong kế hoạch quay số. Chúng ta sẽ dùng chức năng include để cho phép các thuê bao trong ngữ cảnh [internal] có thể tạo cuộc gọi ra bên ngoài. Nhưng đầu tiên chúng ta phải tìm hiểu cấu trúc của nó.

Câu lệnh include đi kèm với ngữ cảnh mà ngữ cảnh này là ngữ cảnh đầu xa mà bạn muốn bao gồm nó trong ngữ cảnh hiện hành.

include => context

Khi chúng ta include các ngữ cảnh khác bên trong ngữ cảnh hiện hành, chúng ta cần phải để ý đến thứ tự mà chúng ta include chúng. Đầu tiên asterisk tính toán phần mở rộng trong ngữ cảnh hiện hành. Nếu thành công nó include ngữ cảnh đầu tiên, và sau đó include các ngữ cảnh khác theo thứ tự mà chúng ta cần include.

Ở đây, kế hoạch quay số của chúng ta có 2 ngữ cảnh cho cuộc gọi ra ngoài, nhưng không có cách nào cho người trong ngữ cảnh [internal] dùng chúng. Chúng ta khắc phục điều này bằng cách include 2 ngữ cảnh gọi bên ngoài vào trong ngữ cảnh [internal], chẳng hạn như: [globals] JOHN=Zap/1 JANE=SIP/jane OUTBOUNDTRUNK=Zap/4 [incoming] exten => s,1,Answer( )

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 80 -

exten => s,2,Background(enter-ext-of-person) exten => 101,1,Dial(${JOHN},10) exten => 101,2,Playback(vm-nobodyavail) exten => 101,3,Hangup( ) exten => 101,102,Playback(tt-allbusy) exten => 101,103,Hangup( ) exten => 102,1,Dial(${JANE},10) exten => 102,2,Playback(vm-nobodyavail) exten => 102,3,Hangup( ) exten => 102,102,Playback(tt-allbusy) exten => 102,103,Hangup( ) exten => i,1,Playback(pbx-invalid) exten => i,2,Goto(incoming,s,1) exten => t,1,Playback(vm-goodbye) exten => t,2,Hangup( ) [internal] include => outbound-local include => outbound-long-distance exten => 101,1,Dial(${JOHN},,r) exten => 102,1,Dial(${JANE},,r) [outbound-local] exten => _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten => _9NXXXXXX,2,Congestion( ) exten => _9NXXXXXX,102,Congestion( ) exten => 911,1,Dial(${OUTBOUNDTRUNK}/911) exten => 9911,1,Dial(${OUTBOUNDTRUNK}/911)

SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 81 -

[outbound-long-distance]

exten => _91NXXNXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten => _91NXXNXXXXXX,2,Congestion( )

exten => _91NXXNXXXXXX,102,Congestion( )

Hai câu lệnh include làm cho người gọi trong ngữ cảnh [internal] có thể tạo cuộc gọi ra bên ngoài. Chúng ta cần chú ý rằng vì mục đích bảo mật bạn nên chắc chắn rằng ngữ cảnh [inbound] của bạn không bao giờ cho phép cuộc gọi ra bên ngoài (nếu có sự thay đổi được thực hiện, một người có thể gọi vào hệ thống của bạn và sau đó tạo cuộc gọi ra bên ngoài và bạn phải chịu cước phí cho cuộc gọi đó).

4.6.7 Sử dụng Database Asterisk

Asterisk cung cấp một cơ chế mạnh mẽ cho việc lưu trữ các giá trị, gọi là asterisk database (AstDB). AstDB cung ứng một cách đơn giản cho việc lưu trữ dữ liệu dùng trong kế hoạch quay số.

Cơ sở dữ liệu Asterisk lưu trữ dữ liệu trong nhóm (grouping) gọi là family, giá trị định danh được xác định bằng key, với mỗi family chỉ được dùng một key duy nhất DB(family/key). Ví dụ ta có một familytest, với keycount. Việc lưu trữ dữ liệu phải liên kết với familytest.

Để lưu trữ dữ liệu, ta dùng ứng dụng Set( ) gán keycount trong family

test giá trị là 1:

Một phần của tài liệu xây dựng và thiết kế một hệ thống thoại đáp ứng trong thực tế cho các doanh nghiệp nhỏ (Trang 70)