Tải bản đầy đủ (.ppt) (68 trang)

LẬP TRÌNH ỨNG DỤNG TỔNG ĐÀI IP ASTERISK

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (822.3 KB, 68 trang )

CÔNG NGHỆ THOẠI IP
BÀI 8
LẬP TRÌNH ỨNG DỤNG TỔNG
ĐÀI IP ASTERISK


Cấu hình tổng đài với CLI
• CLI - Command Line Interface
• Lệnh “ # asterisk –r” để kết nối vào Asterisk Console.


Các lệnh cấu hình CLI
• Lệnh “# CLI> ?” và Lệnh “# CLI> help” giúp đỡ
xem thông tin các lệnh CLI
Ví dụ một số lệnh CLI
• Lệnh “# CLI> sip” xem và cấu hình có liên quan
đến giao thức SIP như extension và channel
• Lệnh “# CLI> sip show users” xem các users SIP
trong Asterisk
• Lệnh “# CLI> dialplan” cấu hình Dialplan
• Lệnh “# CLI> dialplan add extension ” tạo các
extension mới


Lập trình trong Asterisk
• Asterisk cho phép lập trình trong Diaplan để người dùng có
thể thực hiện các yêu cầu của mình một cách nhanh chóng.
• Biểu thức trong lập trình là sự kết hợp của các biến, các
toán tử và các hằng để tạo ra một kết quả.
• Biểu thức có thể dùng để kiểm tra biến, thực hiện các tính
toán toán học, thay đổi string….


• Trong lập trình Asterisk, biểu thức luôn bắt đầu bằng ‘$’,
biểu thức sau đó được đặt giữa 2 dấu ngoặc vuông.
$[expression]
• Ví dụ:
$[${COUNT} + 1]
$[${COUNT} / 2]
4


Ví dụ lập trình trong Asterisk


Biến trong Asterisk
Asterisk sử dụng biến trong các đối số của application,
cú pháp được sử dụng như sau: ${TenBien}
TenBien chứa chuỗi ký tự alphanumeric do người
dùng đặt không phân biệt chữ hoa chữ thường
Ví dụ : ${TenBien} và ${TENBIEN} là như nhau,
nhưng với các biến có sẵn trong Asterisk phải gọi đúng
tên biến vì có phân biệt chữ hoa chữ thường.
Ví dụ : ${EXTEN} là biến sẵn có trong Asterisk nên
không thể gọi ${exten}.


Biến trong Asterisk
Có 3 kiểu biến trong hệ thống Asterisk:
• Biến toàn cục (global variables) : được định nghĩa tại ngữ cảnh
[globals] hoặc được khai báo bằng lệnh SetGlobalVar Một khi được
định nghĩa, biến có thể được sử dụng bởi bất kỳ kênh nào tại bất kỳ
thời điểm nào

• Biến kênh (channel variables) : được khai báo bằng lệnh Set, biến
kênh chỉ có hiệu lực bên trong kênh khai báo chúng. Một khi kết thúc
cuộc gọi biến kênh cũng sẽ không còn tồn tại nữa
• Biến môi trường (environment variables) : là biến mà Asterisk có
thể truy cập biến môi trường của hệ điều hành linux. Để truy cập biến
môi trường chúng ta dùng cú pháp : ${ENV(foo)}
Trong quá trình khai báo biến cần chú ý là: nếu khai báo biến toàn
cục và biến kênh cùng tên nhau thì giá trị của biến là biến kênh nhưng
tại kênh khác nếu gọi tên biến toàn cục thì giá trị biến toàn cục có
hiệu lực vì biến kênh chỉ có hiệu lực tại kênh đó.


Lệnh trong Asterisk
Lệnh hoàn chỉnh trong Dialplan có dạng sau:

• Name (tên ký tự hoặc con số) của số nội bộ
• Priority (số thứ tự) : mỗi số nội bộ có thể bao gồm
nhiều thứ tự thực hiện, mỗi thứ tự 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 exten => tương
ứng với mỗi ứng dụng thực hiện. exten=> giống
nhau cho mỗi dòng thực hiện trong Dialplan.


Hàm trong Asterisk






Đâ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 máy, 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 dùng lệnh show
Aplications trên giao tiếp dòng lệnh của Asterisk.
Background() : Ứng dụng này thực hiện phát một file âm thanh
và chờ nhận con số từ phím nhấn của máy điện thoại, sau khi
nhận con số từ phím nhấn máy điện thoại, Asterisk sẽ ngắt phát
thông điệp và xử lý chuyển đến số thứ tự priority tương ứng với
con số nhận được


Hàm trong Asterisk
- Hàm dùng để thực hiện các công việc giống nhau. Sử dụng hàm giúp
tiết kiệm thời gian và công sức. Hàm trong Asterisk cho phép tính toán
độ dài string, ngày và giờ, check MD5,…
- Cú pháp của hàm như sau:
TÊN_HÀM(đối số)
- Cũng giống như biến, để tham chiếu đến giá trị của hàm thì cần đặt
tên của hàm đó trong dấu ngoặc nhọn {} và dấu $ ở trước.
${TÊN_HÀM(đối số)}
- Hàm trong Asterisk cũng có thể đặt làm đối số trong hàm khác (phải
đặt tên của hàm trong dấu ngoặc kép {}, phía trước là dấu $ ).
${TÊN_HÀM(${TÊN_HÀM(đối số)})}


Hàm trong Asterisk
Goto() : Là ứng dụng thực hiện nhảy từ context, extention,
priority hiện hành đến context, extention, priority được chỉ định trong

ứng dụng goto().


Hàm trong Asterisk
GotoIf () : giống như Goto() nhưng có xem xét điều kiện


Ví dụ hàm trong Asterisk
Read() : tiếp nhận dữ liệu nhập vào từ thuê bao.


Biểu thức
- Biểu thức là sự kết hợp của các biến, phép toán và giá trị để
có được một kết quả.
- Trong Asterisk, biểu thức luôn bắt đầu bằng dấu $ và được
đặt trong cặp ngoặc [].
Ví dụ:
COUNT = 5
$[${COUNT} + 1]
$[${COUNT} / 2]
- Khi Asterisk gặp một biểu thức trong một dialplan, nó sẽ thay
thế các biến bằng giá trị, rồi thay thế các biểu thức bằng giá
trị của các biểu thức đó.
Ví dụ: exten => 321,1,Set(COUNT=3)
exten => 321,2,Set(NEWCOUNT=$[${COUNT} + 1])
exten => 321,3,SayNumber(${NEWCOUNT})


Toán tử
Asterisk được viết trên C nên các toán tử trong nó cũng khá quen

thuộc, gồm có :
a. Toán tử logic:
biểu thức1 | biểu thức2: toán tử or
biểu thức1 & biểu thức2: toán tử and
biểu thức1 {=, >, >=, <, <=, !=} biểu thức2: toán tử quan hệ, so sánh.
b. Toán tử toán học:
‘+’, ‘-’, ‘*’, ‘/’, ‘%’
- Lưu ý là trong Asterisk chỉ tính toán trên các giá trị nguyên.
- Chúng ta cũng có thể dùng biểu thức chính quy (regular
expression) trong Asterisk.


Ví dụ toán tử
- Cú pháp Asterisk yêu cầu phải đặt ít nhất một khoảng trắng
giữa toán tử và giá trị.
Ví dụ:
exten => 123,1,Set(TEST=$[2+1])
- Câu lệnh trên sẽ đặt giá trị của biến TEST là chuỗi "2+1", thay
vì giá trị là 3.
Để câu lệnh thực hiện chính xác, phải có khoảng trắng giữa các
toán tử và giá trị:
exten => 123,1,Set(TEST=$[2 + 1])
- Để nối văn bản vào đầu hoặc cuối của một biến, chỉ cần đặt
chúng trong cùng một biểu thức như sau:
exten => 234,1,Set(NEWTEST=$[blah${TEST}])


Hàm điều kiện
• Nhằm mục đích chính là đưa ra quyết định cho mỗi
giá trị của biểu thức và hàm trong Asterisk.

GotoIf
GotoIfTime
1.GotoIf
• Ứng dụng GotoIf() tính toán giá trị của biểu thức,
hàm và đưa caller tới một đích có địa chỉ nào đó
(chuyển sang extension?, priority?...) dựa trên giá trị
nhận được là true hay false.
17


GotoIf()
• Cú pháp của GotoIf() như sau:
GotoIf(expression?destination1:destination2)
• Cấu trúc lựa chọn này, có lẽ lấy ra từ C nên cũng
không quá khó hiểu. Giá trị được cho là false khi nó
là một chuỗi trống hay là giá trị 0, ngược lại là giá
trị được cho là true. Đích đến của nó có thể là một
trong các điểm sau:
+ Priority trong cùng một extension
+ Extension và priority trong cùng một context.
+ Context, extension, priority
18


GotoIf()
• Ví dụ : minh họa cho hàm ứng dụng rẽ nhánh, kết
hợp với hàm ứng dụng Goto() để đếm xuống 10 giá
trị sau đó gác máy.
exten => 123,1,Set(COUNT=10)
exten => 123,2,GotoIf($[${COUNT} > 0]?:10)

exten => 123,3,SayNumber(${COUNT})
exten => 123,4,Set(COUNT=$[${COUNT} - 1])
exten => 123,5,Goto(2)
exten => 123, 10,hangup()
19


GotoIfTime()
Nếu như GotoIf() là ứng dụng quyết định dựa trên giá trị
của biểu thức nhận được thì GotoIfTime() lại đưa ra quyết
định dựa trên ngày,giờ... của hệ thống (để chia ra giờ làm
việc, thời gian rảnh, ngày nghỉ … ). Cú pháp như sau:
GotoIfTime(times,days_of_week,days_of_month,months?label)

Ví dụ:
exten => s,1,GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)
exten => s,1,GotoIfTime(*,*,4,jul?open,s,1)
exten => s,2,GotoIfTime(09:00-17:59|mon-fri|*|*?open,s,1)
exten => s,3,GotoIfTime(09:00-11:59|sat|*|*?open,s,1)
exten => s,4,Goto(closed,s,1)

20


Macros
• Macro là cấu trúc rất hữu dụng được thiết kế để
tránh sự lặp lại trong Dialplan, thay đổi Dialplan.
• Macro giải quyết được vấn đề xảy ra khi có quá
nhiều mailbox, các option gần gần giống nhau, ta
phải “copy and paste” rất nhiều, làm thủ công nên

không tránh khỏi sai sót trong đó. Thay vào đó, ta có
thể định nghĩ một Macro chức các bước thực hiện
(giống nhau cho nhiều extension).

21


Sử dụng Macro
Macro là cấu trúc hữu dụng để tránh sự lặp lại trong
dialplan, đồng thời giúp thay đổi dialplan.
- Được bắt đầu với cụm từ macroVí dụ: [macro-voicemail]
- Khác biệt duy nhất là macros chỉ sử dụng phần mở rộng s
[macro-voicemail]
exten => s,1,Dial(${JOHN},10,r)
exten => s,2,VoiceMail(u101@default)
exten => s,102,VoiceMail(b101@default)


Định nghĩa một Macro
Định nghĩ một macro cũng gần giống như định nghĩa
một context khác ở chỗ là thêm từ “macro-“ trước tên
của macro đó (để phân biệt với extension).
[macro-name]
Ví dụ:
[macro-voicemail]
exten => s,1,Dial(${JOHN},10,r)
exten =>s,2,VoiceMail(u101@default)
exten => s,102,VoiceMail(b101@default)
23



Sử dụng Macro trong Dialplan
Dùng ứng dụng Macro(), ứng dụng này sẽ gọi một
macro cụ thể nào nó. Ví dụ như để gọi một voicemail
macro, có thể làm như sau:
exten => 101,1,Macro(voicemail)
•Ứng dụng Macro cũng định nghĩa một số các biến
để sử dụng như sau:
${MACRO_CONTEXT}: Ngữ cảnh context mà macro được gọi
${MACRO_EXTEN}: Extention mà macro được gọi
${MACRO_PRIORITY}: Thứ tự (Priority) mà macro được gọi
${ARG n}: là thứ tự của đối số truyền vào
24


Ví dụ Macro
[macro-voicemail]
exten => s,1,Dial(${ARG1},10,r)
exten => s,2,VoiceMail(u${MACRO_EXTEN}@default)
exten => s,102,VoiceMail(b${MACRO_EXTEN}@default)

Bằng cách sử dụng Argument để thay thế các thông số, ta
có thể sử dụng nó tại bất cứ đâu mà chỉ cần thay đổi
argument tương ứng.
exten => 101,1,Macro(voicemail,${JOHN})
exten => 102,1,Macro(voicemail,${JANE})
exten => 103,1,Macro(voicemail,${JACK})
25



×