About Me

header ads

Tìm hiểu tổng đài Asterisk qua admin guide (3)

Tổng quan về DialPlan


Dialplan là trái tim của hệ thống Asterisk, mọi thứ từ cuộc đến và đi cho đến IVR, v,v, đều được xử lý ở đây :D

Contexts, Extensions và Priorities

Dialplan được tổ chức trong các section khác nhau gọi là context. Context là đơn vị tổ chức cơ bản trong dialplan, vì vậy chúng giữ các sections độc lập với nhau trong dialplan. Chúng ta sẽ sử dụng context để tạo nên các vùng khác nhau trong dialplan ( cho yêu cầu an ninh) cũng như cung cấp các lớp dịch vụ khác nhau đến các nhóm người dùng.
Cú pháp cho context cũng giống như các section heading khác trong file cấu hình, như đã được giải thích trong phần trước, mục: Section và setting. Context được đặt trong dấu ngoặc vuông, Ví dụ đây là một context mà chúng ta đã định nghĩa trong phần trước:
[users]
Trong mỗi context chúng ta có thể định nghĩa một hoặc nhiều extension> Như chúng ta đã biết, extension là tập hợp của một hoặc nhiều các hành động (action). Asterisk sẽ thực hiện lần lượt, từng cái một theo thứ tự, khi đó số của extension đó sẽ được quay, cú pháp của extension đó là:

Lấy một ví dụ:
trong ví dụ này: số của extension là 6001, số thứ tự ưu tiên là 1, ứng dụng được sử dụng là dial(), và 2 tham số được sử dụng cho ứng dụng này đó là SIP/demo-alice và 20
Trong mỗi extension, bao giờ cũng phải có 1 số gọi là số thứ tự ưu tiên hay độ ưu tiên ( priority), cái này đơn giản chỉ là mỗi dãy các số tăng liên tục, số ưu tiên đầu tiên được chạy, sau đó số thứ 2 được chạy, sau đó tiếp theo đến thứ 3,
Lưu ý: 
Trong hình trên, số ưu tiên đầu tiên = 1 sẽ được chạy trước, sau đó đến cái thứ 2, tiếp theo asterisk sẽ tìm cái thứ 3 nhưng k có nên nó sẽ ngắt cuộc gọi luôn mà k cần quan tâm đến cái số 4
---> các số ưu tiên phải được tăng lên một cách tuần tự đều đặn

Số ưu tiên có thể sử dụng bằng cách thêm chữ n thay cho việc đánh số
Bạn cũng có thể gán một label (biệt danh, nhãn) cho 1 đô ưu tiên bằng cách thêm 1 cái tên nào đó trong dấu ngoặc đơn ngay sau số ưu tiên, điều này có lợi là làm cho việc viết lệnh quay lại một extension có độ ưu tiên nào đó được dễ dàng hơn.
Như trên chúng ta đã gán nhãn Repeat cho dòng có độ ưu tiên = 2, các lệnh viết sau nếu cần nhảy lại dòng này thì chỉ cần gọi nhãn repeat là được
Ngoài ra, chúng ta còn có thể sử dụng SAME để thay cho việc gõ lại những exten => number như nhau

Ứng dụng (Applications)

Mỗi một số ưu tiên trong dialplan có thể gọi 1 ứng dụng chạy. Mỗi một ứng dụng được gọi lên có thể làm gì đó trên 1 channel, như là trả lời một cuộc gọi, chạy một file âm thanh, Điều đó làm nên tính đa dạng của dialplan cho các mục đích sử dụng của bạn ( vấn đề có đủ trình viết ra dialplan ko :)) )
Để có 1 danh sách đầy đủ các ứng dụng dialplan trên hệ thống, ta có thể vào Asterisk CLI  và gõ lệnh: core show applications
Phần lớn các ứng dụng sử dụng các tham số để làm việc, các tham số cung cấp các thông tin cho ứng dụng hoặc thay đổi cả hành vi của ứng dụng đó, các tham số được ngăn cách nhau bằng dấu phẩy
Cú pháp đối với tham số: Bạn có thể tìm đâu đó trên mạng một ví dụ của code Asterisk dialplan sử dụng dấu | để ngăn cách các tham số của 1 ứng dụng như ví dụ sau:
đó là một cú pháp không được chuẩn cho lắm vì nó có thể không hoạt động đối với các phiên bản mới hơn của asterisk, chỉ cần thay dấu | bằng dấy phẩy như sau:
điều này sẽ tốt hơn cho dialplan của bạn, tất nhiên dùng cái gì thì tùy thích, cơ bản thì code chạy được là được rồi, còn lại thì kệ mẹ nó :D

Các ứng dụng Answer, Playback, hangup

Theo đúng như tên gọi, Answer() được sử dụng để trả lời cuộc gọi đến , Answer sử dụng tham số đầu tiên để delay cuộc gọi đến vài mili giây, điều này giúp cho các ứng dụng từ xa trên các điểm cuối (điện thoại phía người dùng chẳng hạn) có thời gian bật các tiến trình xử lý âm thanh hay tín hiệu.

Tìm hiểu quá trình trả lời một cuộc gọi
Khi bắt đầu tìm hiểu về dialplan của asterisk, bạn có thể gặp 1 số điều khó hiểu về "khi nào thì sử dụng ứng dụng answer() , khi nào thì k dùng"
Thường thì nếu không  có answer() thì mặc định khi có cuộc gọi đến, chuông reo luôn, vì vậy Answer sinh ra để delay cái đó, cuộc gọi đến sẽ được delay lại để làm 1 cái gì đó  như phát 1 bản nhạc chờ, đọc thông tin trả lời tự động (IVR)

Ứng dụng Playback()  được sử dụng để chạy 1 file âm thanh trên ổ cứng và phát lại âm thanh đó cho người gọi đến, lờ đi bất kỳ thao tác bấm phím nào từ người gọi. Tham số đầu tiên của là tên file âm thanh mà mình muốn chạy (không có phần mở rộng của file). Nếu 1 kênh không được trả lời cuộc gọi, thì Playback() sẽ trả lời cuộc gọi trước khi file âm thanh được chạy, trừ khi bạn sử dụng tham số noanswer() ở tham số thứ 2.
Để tránh 1 vài mi li giây đầu tiên của playback bị ngắt đoạn thì nên sử dụng 1 file âm thanh rỗng (file âm thanh k có tiếng) chạy trước, sau đó nối với đoạn âm thanh mà ta cần theo sau.
Ví dụ đối với extension playback sau:

ta có thể sử dụng 1 file không có tiếng là silence, chạy trước 1s sau đó mới đến hello-world chạy
Dấu /1 đứng sau silence tức là nó sẽ chạy 1s rồi kết thúc,
mặt khác, bạn có thể nối 2 câu lệnh trên thành 1 câu lệnh, cho gọn

Early Media và Progress Application

Early media (truyền thông sớm) là việc trao đổi các gói tin media (âm thanh hình ảnh) trước cả khi phiên kết nối được khởi tạo giữa người gọi và người nghe. Nó được thiết lập ngay từ khi bản tin INVITE đầu tiên của giao thức SIP được gửi đi.
Nhiều ứng dụng Dialplan bên trong Asterisk hỗ trợ các tính năng VOICEIP thông thường, Early media thường được sử dụng với SIP, nhưng thi thoảng nó cũng được sử dụng cùng với những kênh khác như H.323.


Tìm hiểu về SoundPromt

Asterisk có nhiều soundpromt khác nhau. Khi cài đặt asterisk, có thể lựa chọn cài đặt cả 2 gói sound core và extra với các định dạng file khác nhau. Promt cũng có nhiều ngôn ngữ khác nhau, để tìm các tập tin sound trên máy của bạn, có thể truy cập /var/lib/asterisk/sounds và tìm file mình cần. bạn cũng có thể tìm các promt hữu ích với mình như ( "Please enter the extension of the person you are looking for...")

Sound Promt: là các định dạng file như là .wav hay .ulaw. khi được hỏi chạy 1 file âm thanh từ đĩa, asterisk chạy file âm thành đó bằng cách convert file đó sang CODEC của cuộc gọi hiện tại. Ví dụ  nếu cuộc gọi đến  sử dụng CODEC alaw và soundpromt được lưu trữ dưới dạng .gsm và ulaw , asterisk sẽ chạy định dạng .ulaw vì file này chuyển sang codec alaw đỡ tốn tài nguyên CPU hơn.
Có thể sử dụng core show translation trên asterisk CLI để xem thời gian chuyển đổi đối với các CODEC khác nhau. Thời gian được báo cáo là một số tính đến mi li giây.

Asterisk tìm kiếm sound prompt dựa trên ngôn ngữ kênh
Mỗi kênh trong asterisk có thể được gán một ngôn ngữ thông qua channel driver. Mã ngôn ngữ của channel được chia ra từng cái một và phân cách nhau bằng dấu gạch dưới, và được sử dụng để build đường dẫn để tìm kiếm sound prompt, asterisk sẽ sử dụng file đầu tiên tìm thấy
Điều này có nghĩa là nếu chúng ta set ngôn ngữ thành en_GB_female_BT, Asterisk sẽ tìm kiếm file trong các chỉ mục:
.../sounds/en/GB/female/BT
.../sounds/en/GB/female
.../sounds/en/GB
.../sounds/en
.../sounds
Sắp xếp như thế này giúp cho việc thêm sound prompt vào các biểu thức khác nhau.
Ứng dụng Hangup() có chức năng ngắt cuộc gọi hiện tại, để hạn chế việc cuộc gọi tự động thất bại , khuyến cáo nên thêm hangup() vào độ ưu tiên ( priority)  cuối cùng trong bất kỳ extension nào
Bây giờ hãy đặt Answer(), Playback(), Hangup() cùng nhau để chạy một một file âm thanh ví dụ nào đó, đặt code dưới đây trong context [docs:users]

Ứng dụng Dial

Dial() có tác dụng đánh tín hiệu rung chuông đến thiết bị bên ngoài, và nếu cuộc gọi được trả lời nó sẽ bắc cầu cho 2 kênh kết nối, chạy bất kì giao thức hay CODEC cần thiết nào. Nó cũng điều khiển luôn các tiến tình hồi đáp như busy, no-answer, ringing.
      Chú ý: Chú ý rằng nếu ứng dụng Dial()  bắc cầu thành công cho 2 kênh thì cuộc gọi không được tiến hành trong dialplan, cuộc gọi chỉ tiếp tục tiến đến priority tiếp theo  nếu dial() không thể kênh đang gọi với thiết bị được gọi.

Dial() có 4 tham số:
- Device:
   + Một danh sách cách thiết bị mà bạn muốn gọi. Thiết bị ở đây là một công nghệ, channel driver, một đầu mối chuyển tiếp, một thiết bị phần cứng hay chỉ đơn giản là 1 account name. Ví dụ: SIP/demo-alice sẽ sử dụng  channel driver SIP để gọi thiết bị  được định nghĩa trong demo-alice  (chính là section demo-alice trong sip.conf). thiết bị sử dụng IAX2 channel driver sử dụng mẫu có dạng IAX2/demo-george, and DAHDI channel có dạng DAHDI/1
   + Khi cuộc gọi thông qua 1 thiết bị (như là gateway) hoặc nhà cung cấp dịch vụ để đi đến một số khác, cú pháp là TECHNOLOGY/DEVICE/NUMBER ví dụ: SIP/my_provider/5551212 hoặc DAHDI/4/5551212
   +Để quay số đến nhiều thiết bị trong 1 lần, đơn giản chỉ cần ghép các thiết bị liền lại với nhau bằng ký tự &. Thiết bị đầu tiên được trả lời sẽ kết nối với người gọi, và tất cả các endpoint khác sẽ dừng rung chuông.
- Time out: thời gian cho phép device ngừng chuông và chuyển sang priority tiếp theo trong extension
- Options: Có một số tùy chọn bạn có thể sử dụng để áp dụng cho các cuộc gọi từ bên ngoài, bao gồm cả . vào CLI console gõ lênh core show application dial để có danh sách đầy đủ các option
- URL: tham số cuối cùng là URL, 1 đường dẫn được gửi đến cho endpoitn, nhưng 1 số softphone hay device không làm gì đối với URL

Thêm một hộp thư thoại vào extension
--> Chương này sẽ đề cập sau vì ở VN thấy ít khi dùng đến.

--> Còn tiếp

Đăng nhận xét

0 Nhận xét