Dialplan là một tập hợp các quy tắc và chỉ dẫn để xử lý cuộc gọi trong một hệ thống tổng đài. Các quy tắc này thường được viết trong mã lệnh và có thể bao gồm chuyển cuộc gọi tới các nhân viên, chuyển cuộc gọi tới máy chờ, và tạo ra các thông báo âm thanh.
Một số khái niệm Dialplan cơ bản khác bao gồm:
- Context: Là một tập hợp các quy tắc và chỉ dẫn để xử lý cuộc gọi. Một hệ thống tổng đài có thể có nhiều context khác nhau để xử lý các loại cuộc gọi khác nhau.
- Extension: Là một số điện thoại được liên kết với một quy tắc hoặc hành động cụ thể trong một context.
- Priority: Là mức độ ưu tiên của một quy tắc hoặc hành động trong một context. Các quy tắc với mức độ ưu tiên cao hơn sẽ được xử lý trước.
- Macro: Là một tập hợp các quy tắc và hành động được định nghĩa trong một tập lệnh riêng biệt và có thể được gọi từ nhiều nơi khác
- Application: Là một chương trình hoặc lệnh được sử dụng trong Dialplan để thực hiện một hành động cụ thể, chẳng hạn như chuyển cuộc gọi, phát âm thanh, hoặc lưu dữ liệu.
- Variable: Là một biến được sử dụng trong Dialplan để lưu trữ và truy xuất thông tin về cuộc gọi, chẳng hạn như số điện thoại người gọi, thời gian cuộc gọi, hoặc trạng thái của cuộc gọi.
- Condition: Là một điều kiện được sử dụng trong Dialplan để kiểm tra và xác định xem một quy tắc hoặc hành động nào đó có được thực hiện hay không dựa trên các giá trị của các biến hoặc điều kiện khác.
Tổng quát, Dialplan là một công cụ rất mạnh mẽ và linh hoạt để xử lý cuộc gọi trong một hệ thống tổng đài, cho phép bạn tùy chỉnh cách cuộc gọi được xử lý và tạo ra các trạng thái và hành động tùy chỉnh.
Dialplan có nhiều biểu thức cơ bản được sử dụng để xác định các quy tắc và hành động cụ thể. Một số biểu thức Dialplan cơ bản bao gồm:
- Extension: Là một số điện thoại được liên kết với một quy tắc hoặc hành động cụ thể trong một context. Ví dụ: extension => 101,1,Playback(welcome-message)
- Priority: Là mức độ ưu tiên của một quy tắc hoặc hành động trong một context. Các quy tắc với mức độ ưu tiên cao hơn sẽ được xử lý trước. Ví dụ: priority => 1, Hangup
- Condition: Là một điều kiện được sử dụng trong Dialplan để kiểm tra và xác định xem một quy tắc hoặc hành động nào đó có được thực hiện hay không dựa trên các giá trị của các biến hoặc điều kiện khác. Ví dụ: exten => _X.,1,GotoIf($[${CALLERID(num)} = “1234567890”]?local)
- Application: Là một chương trình hoặc lệnh được sử dụng trong Dialplan để thực hiện một hành động cụ thể, chẳng hạn như chuyển cuộc gọi, phát âm thanh, hoặc lưu dữ liệu. Ví dụ: exten => _X.,1,Answer()
- Goto: Là một lệnh được sử dụng để chuyển đến một quy tắc hoặc hành động khác trong một context. Ví dụ: exten => _X.,1,Goto(context_2,extension_2,priority_2)
- GotoIf: Là một lệnh được sử dụng để chuyển đến một quy tắc hoặc hành động khác trong một context nếu điều kiện được chỉ định đúng. Ví dụ: exten => _X.,1,GotoIf($[${CALLERID(num)} = “1234567890”]?local)
- Set: Là một lệnh được sử dụng để gán giá trị cho một biến. Ví dụ: exten => _X.,1,Set(CALLERID(name)=John Doe)
- Exec: Là một lệnh được sử dụng để thực thi một chương trình hoặc lệnh. Ví dụ: exten => _X.,1,Exec(/usr/local/bin/script.sh)
- Noop: Là một lệnh được sử dụng để in ra một thông báo hoặc ghi nhận thông tin mà không thực hiện bất kỳ hành động nào. Ví dụ: exten => _X.,1,Noop(Caller ID is ${CALLERID(num)})
Những biểu thức Dialplan trên là các biểu thức cơ bản được sử dụng trong Dialplan, tuy nhiên còn rất nhiều biểu thức khác có thể sử dụng để tùy chỉnh và tạo ra các quy tắc và hành động phù hợp với nhu cầu của bạn.
Để show context của dialplan trong Asterisk, bạn có thể sử dụng lệnh sau trong CLI (Command Line Interface):
asterisk -rx "dialplan show <context_name>"
Ví dụ 1:
Để thiết lập kết nối giữa hai extension trong Asterisk, bạn cần tạo một dialplan cho mỗi extension và đảm bảo rằng chúng được đặt trong cùng một context. Sau đây là cách viết dialplan để kết nối từ extension 101 sang extension 102:
Bước 1: Tạo số nội bộ 101 và 102.
File cấu hình cho các extension 101 và 102 được lưu trữ trong các file khác nhau trong hệ thống Asterisk. Thông thường, các file cấu hình cho extension sẽ nằm trong thư mục /etc/asterisk/.
Để cấu hình một extension trong Asterisk, bạn có thể thực hiện các bước sau:
- Mở file cấu hình sip.conf, các file này thường được đặt trong thư mục /etc/asterisk/.
- Thêm cấu hình cho extension bằng cách định nghĩa một section mới với tên là số extension (ví dụ: [101] hoặc [102]) và các thông số cấu hình như sau:
Với giao thức SIP:
[101]
type=friend
username=101
secret=password
host=dynamic
context=internal
[102]
type=friend
username=102
secret=password
host=dynamic
context=internal
Trong các ví dụ trên, chúng ta đã định nghĩa extension 101 và 102 với một số thông số cấu hình như:
- type: loại extension, có thể là “friend” hoặc “endpoint” tùy thuộc vào giao thức bạn đang sử dụng.
- username: tên đăng nhập của extension.
- secret hoặc password: mật khẩu của extension.
- host: địa chỉ IP của extension, nếu nó là “dynamic” thì IP sẽ được xác định động.
- context: context mà extension sẽ được đưa vào, giống như chúng ta đã định nghĩa trong file extensions.conf.
Lưu lại các thay đổi và reload lại Asterisk:
asterisk -rx 'sip reload'
Sau khi thực hiện các bước trên, extension của bạn đã được cấu hình và có thể sử dụng trong hệ thống Asterisk.
asterisk -rx "sip show peers"
Hoặc:
asterisk -rx "pjsip show endpoints"
Tùy thuộc vào giao thức mà bạn sử dụng để cấu hình extension. Lệnh này sẽ hiển thị danh sách các extension được cấu hình trên hệ thống và trạng thái của từng extension (như đang hoạt động hay không hoạt động).
Bước 2: Tạo dialplan.
Trong tập tin “extensions.conf” trong Asterisk. Đây là một trong những file cấu hình quan trọng nhất trong Asterisk, nó được sử dụng để định nghĩa dialplan, tức là quy trình xử lý cuộc gọi của hệ thống. Trong file này, bạn có thể thiết lập các extension, context, và các tùy chọn khác để xác định cách Asterisk xử lý cuộc gọi. File extensions.conf thường được lưu trữ trong thư mục /etc/asterisk/ trên hệ thống.
Vậy bạn hãy vào /etc/asterisk/extensions.conf và thêm mã dialplan sau:
[internal] ; context name
exten => 101,1,Dial(SIP/101,20) ; Dial extension 101 for 20 seconds
same => n,Hangup() ; Hang up the call when done
exten => 102,1,Dial(SIP/102,20) ; Dial extension 102 for 20 seconds
same => n,Hangup() ; Hang up the call when done
Trong ví dụ trên, chúng ta đã tạo một context mới có tên “internal”. Bên trong context này, chúng ta đã định nghĩa hai extension: 101 và 102. Mỗi extension có một cuộc gọi Dial để kết nối đến extension tương ứng. Chúng ta cũng đã sử dụng câu lệnh Hangup() để kết thúc cuộc gọi khi nó kết thúc.
Sau khi thêm code trên vào file extensions.conf, bạn cần reload lại Asterisk để áp dụng thay đổi:
asterisk -rx 'dialplan reload'
Để show context của dialplan trong Asterisk, bạn có thể sử dụng lệnh sau trong CLI (Command Line Interface):
asterisk -rx "dialplan show internal"
Với cấu hình trên, khi bạn gọi từ extension 101, nó sẽ kết nối đến extension 102 và ngược lại khi gọi từ extension 102 sẽ kết nối đến extension 101.
– Ví dụ 2:
Tạo một Dial plan cho hệ thống điện thoại của một công ty với các tính năng chuyển cuộc gọi theo vị trí, điều hướng cuộc gọi theo thời gian và chuyển cuộc gọi đến các số khác.
[internal]
exten => _1XX,1,Macro(location-check)
exten => _2XX,1,Macro(location-check)
exten => _3XX,1,Macro(location-check)
[location-check]
exten => s,1,GotoIfTime(9:00-17:00,mon-fri,office)
exten => s,2,GotoIfTime(9:00-17:00,sat-sun,weekend)
exten => s,3,Goto(after-hours)
[office]
exten => s,1,Goto(ext-local,${EXTEN},1)
[weekend]
exten => s,1,Goto(ext-local,${EXTEN},1)
[after-hours]
exten => s,1,Goto(ext-local,${EXTEN},1)
Trong ví dụ trên, các cuộc gọi đến các số bắt đầu bằng 1, 2 hoặc 3 đều sẽ được chuyển đến macro “location-check”. Macro này sẽ kiểm tra thời gian hiện tại và ngày hiện tại để chuyển cuộc gọi đến các vị trí khác nhau: văn phòng trong giờ hành chính, ngày nghỉ hoặc sau giờ hành chính. Sau đó, cuộc gọi sẽ được chuyển đến số mục tiêu tương ứng.