Asterisk Advance Config


Sử dụng biến trong Dialplan

có ba loại biến được sử dụng: Global, channel, enviroment.

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

Biến Global thường được khai báo trong phấn context [globals] ở phần đầu của file extensions.conf hoặc thông qua hàm GLOBAL().

Biến channel chỉ sử dụng trong một cuộc gọi cụ thể nào đó, cho một kênh cụ thể nào đó trong khi thực hiện một cuộc gọi. Biến channel được đặt thông qua application Set()

exten => 125,1,Set(MAGICNUMBER=42) Biến Enviroment là một cách thức truy nhập môi trường Linux của Asterisk. Bạn tham chiếu biến của môi trường Linux thông qua cú pháp ${ENV(var)} với var là tên biến mà bạn muốn tham chiếu.

ví dụ sử dụng biến

[globals]

JOHN=Zap/1

JANE=SIP/Jane

[incoming]

exten => 123,1,Answer()

exten => 123,n,Background(enter-ext-of-person)

exten => 123,n,WaitExten()

exten => 1,1,Dial(${JOHN},10)

exten => 1,n,Playback(vm-nobodyavail)

exten => 1,n,Hangup()

exten => 2,1,Dial(${JANE},10)

exten => 2,n,Playback(vm-nobodyavail)

exten => 2,n,Hangup()

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

exten => i,n,Goto(incoming,123,1)

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

exten => t,n,Hangup()

[employees]

exten => 101,1,Dial(${JOHN})

exten => john,1,Dial(${JOHN})

exten => 102,1,Dial(${JANE})

exten => jane,1,Dial(${JANE})

hai biến global JOHN và JANE được sử dụng cho mọi extension trong Dialplan

Pattern Matching

Cho phép bạn tạo một extension dùng cho những trường hợp bạn quay số với những số được gọi khác nhau, dùng cho những trường hợp người sử dụng truy cập ra mạng bên ngoài thông qua hệ thống Asterisk (như thực hiện các cuộc gọi ra mạng PSTN thông qua tổng đài Asterisk nội bộ).

Chuỗi ký tự muốn đối sánh bắt đầu bằng ký tự “_”

Các ký tự sử dụng để đối sánh:

X: tương ứng với một giá trị số từ 0-9

Z: tương ứng với một giá trị số từ 1-9

N: tương ứng với một giá trị số từ 2-9

[A-B]: tương ứng với một giá trị số có giá trị nằm trong phạm vi A-B

.: tương ứng với một hay nhiều ký tự bất kỳ

!: tương ứng với không, một hay nhiều ký tự bất kỳ

ví dụ:

_NXXXX: tương ứng với dãy số trong phạm vi 20000-99999

_ZXNXX: tương ứng với dãy số trong phạm vi 10200-99999

chuỗi ký tự đối sánh thường được sử dụng kết hợp với biến kênh ${EXTEN} để lấy về giá trị số đã được nhấn. Cú pháp có dạng ${EXTEN:x:y}

x: thể hiện vị trí trong chuỗi đối sánh được trích ra đầu tiên (tính từ trái sang phải)

y: số ký tự được trích ra

ví dụ:

application SayDigits(“number”) có chức năng đọc các giá trị số trong dãy “number”

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

đọc chuỗi số mà bạn đã nhấn có giá trị 000-999

exten => _ZZXZXXNN,1,SayDigits(${EXTEN:2:6})

đọc chuỗi số mà bạn đã nhấn trong phạm vi 101002 –999999.

Asterisk cho phép bạn sử dụng lại những extension trong một context khác thông qua từ khoá include theo cú pháp: include => context.

Operators

Cũng giốn như các ngôn ngữ lập trình, Asterisk sử dụng một sô toán hạng như sau:

– expr1 | expr2 hoặc

– expr1 & expr2 và

– expr1 {=, >, >=, <, <=, !=} expr2 so sánh

– expr1{+,-,*,/,%}expr2 tính toán

Expressions

là sự kết hợp các biến, giá trị và các toán hạng để cho ra một giá trị. Nó được dùng để kiểm tra các giá trị, sửa chuỗi ký tự hoặc thực hiện các tính toán toán học.

ví dụ

exten => 321,1,Set(COUNT=3)

exten => 321,n,Set(NEWCOUNT=$[${COUNT} + 1])

exten => 321,n,SayNumber(${NEWCOUNT})

hệ thống sẽ đọc giá trị “4“

Condition Branching

Khi thực hiện một Dialplan nhất là đối với những Dialplan có tổ chức phức tạp, việc rẽ nhánh trong Dialplan (chuyển sang một extension khác, một context khác ) là điều thường gặp. chìa khoá của việc rẽ nhánh trong Dialplan là sử dụng một số application như sau:

Sử dụng application Goto() để nhẩy đến một phần khác của Dialplan

cú pháp sử dụng như sau:

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

ví dụ:

[incoming]

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten(3)

exten => 1,1,Goto(kythuat,s,1)

exten => 2,1,Goto(kinhdoanh,s,1)

[kythuat]

….

[kinhdoanh]

….

Khi bạn quay số 123 hệ thống sẽ thực hiện trả lời và chạy một thông báo cho bạn biết có dạng ‘để gặp phòng kỹ thuật mời bạn nhấn phím “1”, để gặp phong kinh doanh mời bạn nhấn “2”’. Khi bạn nhấn phím tương ứng hệ thống sẽ chuyển bạn đến context dành cho phòng mà bạn muốn gọi tới.

Sử dụng application GotoIf() theo cú pháp: GotoIf(expression?destination1:destination2)

điều kiện trong expression là ‘true’, cuộc gọi sẽ được chuyển đến ‘destination1’ ngược lại cuộc gọi sẽ được chuyển đến ‘destination2’.

exten => 123,1,GotoIf($[${CALLERID(num)} = 85551212]?reject:allow)

exten => 123,n(allow),Dial(Zap/4)

exten => 123,n,Hangup()

exten => 123,n(reject),Playback(abandon-all-hope)

exten => 123,n,Hangup()

Giới hạn user có callerid = 85551212 không được phép thực hiện cuộc gọi. Khi extension 123 được thực hiện (quay số 123), nếu callerid của người thực hiện cuộc gọi là 85551212 cuộc gọi sẽ được chuyển đến extension có label là “reject” để đưa ra thông báo không cho phép thực hiện cuộc gọi. Ngược lại cuộc gọi được chuyển đến extension có label là “allow” cho phép thực hiện cuộc gọi thông qua channel Zap/4.

Sử dụng application GotoIfTime() theo cú pháp sau để thực hiện việc rẽ nhánh theo thời gian.

GotoIfTime(times,days_of_week,days_of_month,months?label)

times: khoảng thời gian trong ngày.

days_of_week: thể hiện ngày trong tuần

days_of_month: thể hiện ngày trong tháng

months: thể hiện tháng

label: nhãn của extension chuyển đến.

trong trường hợp bạn muốn chấp nhận mọi giá trị trong trường so sánh bạn dùng ký tự “*”.

Đối label có thể có dạng như sau:

– priority label của cùng extension đó.

– extension và priority của cùng extension đó

– context, extension,priority

exten => 3000,1,GotoIfTime(9:00-17:00|mon-fri|*|*?open,s,1)

extension này sẽ chuyển cuộc gọi đến context “open”, extension s, priority 1 nếu cuộc gọi tới trong khoảng 9:00-17:00 các ngày từ thứ hai đến thứ sáu.

Macro

Macro là một cấu trúc giúp cho bạn tránh phải viết lại những đoạn giống nhau trong “Dialplan” của mình.

Để tạo một macro bạn thực hiện trong “Dialplan” của mình theo cú pháp sau:

[macro-‘name of macro’]

Để gọi macro bạn trong “Dialplan” của mình bạn sử dụng application Macro() theo cú pháp:

Macro(macroname, arg1,arg2…)

ví dụ:

[macro-stdexten]

exten => s,1,Dial(${ARG2},20)

exten => s,2,Goto(s-${DIALSTATUS},1)

exten => s-NOANSWER,1,Voicemail(${ARG1},u)

exten => s-NOANSWER,2,Goto(default,s,1)

exten => s-BUSY,1,Voicemail(${ARG1},b)

exten => s-BUSY,2,Goto(default,s,1)

exten => _s-.,1,Goto(s-NOANSWER,1)

exten => a,1,VoicemailMain(${ARG1})

để gọi macro này

exten => 1234,1,Macro(stdexten,1234,SIP/7960)

ở đây biến ${ARG1} thể hiện extension, ${ARG2} thể hiện thiết bị được gọi tới.

hoạt động của macro này như sau:

thực hiện gọi tới thiết bị, tuỳ thuộc vào trạng thái thiết bị (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) để nhấy đên extension tương ứng.

chương trình Macro() định nghĩa sẵn một số biết đặt biệt để bạn tiện sử dụng trong các macro.

${MACRO_CONTEXT}

thể hiện context mà macro đã gọi

${MACRO_EXTEN}

thể hiện extension mà macro đã gọi

${MACRO_PRIORITY}

thể hiện priority mà macro đã gọi

${ARGn}

thể hiện biến mà bạn truyền vào khi gọi macro.

ví dụ:

[globals]

JOHN=Zap/1

JANE=SIP/Jane

JACK=SIP/Jack

[macro-voicemail]

exten => s,1,Dial(${ARG1},10)

exten => s,n,GotoIf($[“${DIALSTATUS}” = “BUSY”]?busy:unavail)

exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@voicemail,u)

exten => s,n,Hangup()

exten => s,n(busy),Backgound(busy-calllater)

exten => s,n,Hangup()

[internal]

exten => 101,1,Macro(voicemail,${JOHN})

exten => 102,1,Macro(voicemail,${JANE})

exten => 103,1,Macro(voicemail,${JACK})

Ở ví dụ trên macro [macro-voicemail] thực hiện việc quay số, tuỳ thuộc vào trạng thái kết nối nếu máy bận hệ thống sẽ đưa ra thông báo bận để người gọi gọi lại sau, nếu cuộc gọi không thực hiện được hệ thông cho phép người gọi gửi lại lời nhắn vào hộp thư thoại của người được gọi tương ứng.

Advertisements
%d bloggers like this: