Đề tài: Nghiên cứu về hoạt động và cách triển khai tổng đài IP PBX Asterisk
MỤC LỤC
CHƯƠNG I: TỔNG QUAN VỀ TỔNG ĐÀI IP PBX ASTERISK 1
1.1 Giới thiệu Asterisk - Asterisk là gì? 1
1.1.1 Vai trò của Digium đối với Asterisk 1
1.1.2 Dự án Zapata và các mối quan hệ của nó với Asterisk 2
1.2 Vì sao chọn Asterisk? 2
1.2.1 Giảm chi phí một cách mạnh mẽ 2
1.2.2 Môi trường phát triển nhanh chóng và dễ dàng 2
1.2.3 Giàu tính năng 3
1.2.4 Nội dung động trên điện thoại 3
1.2.5 Kiểu quay số linh hoạt và mạnh 3
1.2.6 Mã nguồn mở chạy trên nền Linux 3
1.2.7 Các giới hạn trong kiến trúc của Asterisk 3
1.3 Kiến trúc của Asterisk 4
1.3.1 Các kênh 4
1.3.2 Codec và chuyển dịch codec 5
1.3.3 Các giao thức 5
1.3.4 Các ứng dụng 5
1.4 Mô tả tổng quan tổng đài IP PBX Asterisk 6
1.5 So sánh giữa các loại tổng đài 7
1.5.1 Điện thoại sử dụng mô hình PBX/Softswitch cũ 7
1.5.2 Điện thoại dùng hệ thống Asterisk 7
1.6 Xây dựng một hệ thống kiểm tra 8
1.6.1 Một FXO, một FXS 8
1.6.2 Nhà cung cấp dịch vụ VoIP, ATA 8
1.6.3 Board FXO không đắt tiền, ATA 8
1.7 Một số ứng dụng của Asterisk 9
1.7.1 IP PBX 9
1.7.2 Sử dụng IP trong các tổng đài PBX cũ 10
1.7.3 Bỏ qua chi phí gọi điện thoại đường dài 11
1.7.4 Server ứng dụng (IVR, điện thoại hội nghị, Voicemail) 11
1.7.5 Media Gateway 12
1.7.6 Trung tâm giao tiếp chăm sóc khách hàng - Contact Center Platform (Call Center) 13
1.8 VoIP với Asterisk 13
1.8.1 Các ưu điểm của VoIP 13
1.8.1.a Tính hội tụ 13
1.8.1.b Chi phí cơ sở hạ tầng 14
1.8.1.c Tiêu chuẩn mở 14
1.8.1.d Sự tích hợp giữa máy tính và điện thoại 14
1.8.2 Kiến trúc VoIP của Asterisk 14
1.8.3 Các giao thức VoIP và mô hình OSI 15
1.8.4 Làm sao để chọn một giao thức? 16
1.8.4.a SIP - giao thức thiết lập phiên 16
1.8.4.b IAX - Inter Asterisk eXchange 16
1.8.4.c Giao thức điều khiển cổng phương tiện MGCP 17
1.8.4.d H.323 17
1.8.4.e Bảng so sách các giao thức 17
1.8.5 User, Peer và Friend 17
1.8.6 Các codec và chuyển đổi codec 18
1.8.7 Làm sao để chọn một codec phù hợp 18
1.8.8 Phần mào đầu do phần Header của giao thức 18
1.8.9 Kỹ thuật lưu lượng 19
1.8.9.a Sự đơn giản hoá 19
1.8.9.b Phương pháp Erlang B 19
1.8.10 Giảm băng thông yêu cầu cho VoIP 20
1.8.10.a Nén RTP Header 20
1.8.10.b IAX2 trunk mode 21
1.8.10.c Giảm VoIP tải 21
CHƯƠNG 2: CÀI ĐẶT TỔNG ĐÀI IP PBX ASTERISK 22
2.1 Cái đặt từng phần 22
2.1.1 Cài đặt hệ điều hành CentOS 22
2.1.2 Cài đặt các gói trong tổng đài Asterisk 27
2.1.2.a Chuẩn bị các tập tin trước khi cài đặt 27
2.1.2.b Compiling và cài đặt các gói 28
2.1.2.c Cài đặt Asterisk-GUI 31
2.2 Giới thiệu Trixbox các thành phần 32
2.2.1 Cài đặt Trixbox 32
2.3 Các hỗ trợ trong vận hành và cấu hình Asterisk 35
2.3.1 Một số lệnh chính trong CLI của Asterisk 35
2.3.1.a Các lệnh chung 35
2.3.1.b Các lệnh cho SIP 35
2.3.1.c Quản trị Server 35
2.3.2 Các công cụ hỗ trợ vận hành và cấu hình Asterisk 36
2.3.2.a Phần mềm Putty 36
2.3.2.b Phần mềm WINSCP 37
CHƯƠNG 3: TÌM HIỂU CÁCH CẤU HÌNH ASTERISK 38
3.1 Tìm hiểu các tập tin cấu hình trong Asterisk 38
3.2 Ngữ pháp của Asterisk 38
3.2.1 Nhóm đơn 39
3.2.2 Các tùy chọn đối tượng kiểu ngữ pháp thừa kế 39
3.2.3 Dạng thực thể phức hợp 40
3.3 Tìm hiểu cấu hình một giao tiếp PSTN 40
3.3.1 Cài đặt X100P 41
3.3.2 Cài và cấu hình driver card X100P 41
3.4 Tìm hiểu cấu hình điện thoại IP SIP 41
3.4.1 Phần chung [general] 41
3.4.2 Phần Client 42
3.5 Tim hiều sơ đồ quay số 43
3.5.1 Số nội bộ (Extensions) 43
3.5.1.a Một số mẫu số (pattern) 43
3.5.1.b Các ví dụ về số nội bộ (extensions) 44
3.5.2 Số ưu tiên (Priorities) 44
3.5.3 Ứng dụng (Applications) 44
3.5.4 Ngữ cảnh (Contexts) 45
3.6 Tìm hiểu cách tạo một sơ đồ quay số 46
3.6.1 Ví dụ cơ bản 46
3.6.2 Một ví dụ khác 46
3.6.3 Các kênh cầu nối sử dụng ứng dụng dial() 47
3.7 Tìm hiểu cách tạo một hệ thống IVR 48
3.7.1 Ứng dụng background() 48
3.7.2 Ứng dụng record() 48
3.7.3 Ứng dụng playback() 49
3.7.4 Ứng dụng read() 49
3.7.5 Ứng dụng gotoif() 49
3.8 Xây dụng một hệ thống IVR 49
3.8.1 Thu âm lời chào 50
3.8.2 Tạo ra hệ thống IVR 50
CHƯƠNG 4: XÂY DỰNG MỘT TỔNG ĐÀI THỰC TẾ 51
4.1 Mô tả các bước thực hiện 51
4.2 Mô tả chức năng và hoạt động của tổng đài 51
4.3 Cấu hình phần cứng 51
4.4 Cài đặt tổng đài Asterisk 51
4.5 Chuẩn bị và cài đặt các thiết bị FXS, FXO 51
4.6 Cấu hình các thông số trong tổng đài 55
4.7 Thiết lập các Client và kiểm tra cuộc gọi 56
CHƯƠNG 5: ĐÁNH GIÁ CHUNG VÀ HƯỚNG MỞ CỦA ĐỀ TÀI 57
5.1 Đánh giá chung 57
5.1.1 Ưu điểm 57
5.1.2 Những điểm hạn chế 57
5.1 Hướng mở của đề tài 58
TÀI LIỆU THAM KHẢO 59
68 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3757 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Nghiên cứu về hoạt động và cách triển khai tổng đài IP PBX Asterisk, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
cho thương mại sử dụng tổng số đường line = 33 và xấp xỉ 2xT1 lines
1.b Băng thông yêu cầu
Chúng ta chọn G.729 codec vì băng thông yêu cầu, chất lượng thoại và môi trường tiêu tốn CPU.
Với một đường trung kế cho mỗi 5 extension:
Băng thông yêu cầu cho chi nhánh số 1 (Frame-relay): 26.8*6=160.8 Kbps
Băng thông yêu cầu cho chi nhánh số 2 (Frame-relay): 26.8*3= 80.4 Kbps
1.8.9.b Phương pháp Erlang B
1.a Số cuộc gọi đồng thời trong VoIP
Đôi khi, tính đơn giản không phải là phưong pháp tốt nhất. Khi bạn có dữ liệu phía trước, bạn có thể yêu cầu lên nhiều đặc tính khác. Agner Karup Erlang (công ty điện thoại Copenhagen, 1909) đã phát triển một công thức để tính toán số đường line trong một nhóm trung kế giữa hai thành phố. Chúng ta sẽ sử dụng công thức này. Erlang là một đơn vị đo đạc lưu lượng thường được sử dụng trong viễn thông, nó được sử dụng để miêu tả độ lớn của lưu lượng trong một giờ.
Ví dụ: 20 cuộc gọi trong một giờ với 5 phút trung bình cho mỗi cuộc gọi.
Bạn tính số erlang như sau:
Lưu lượng tính theo phút trong một giờ là: 20x5=100 phút
Giờ lưu lượng trong một giờ: 100/60=1,66 Erlangs
Bạn có thể tính được con số này từ một cuộc gọi đã được ghi nhật ký vào hệ thống và sử dụng nó để thiết kế ra mạng của bạn để tính toán số đường line yêu cầu. Mỗi đường line được biết đến có thể tính cho băng thông yêu cầu.
Erlang B là phương pháp được sử dụng nhiều nhất để tính số đường line trong một nhóm trung kế. Nó giả sử các cuộc gọi đến một cách ngẫu nhiên (dạng phân bố Poisson) và các cuộc gọi bị khoá ngay lập tức được giải toả. Phương pháp này yêu cầu bạn phải biết về lưu lượng giờ cao điểm Busy Hour Traffic (BHT). Bạn có thể có được BHT này từ nhật ký cuộc gọi hay một cách đơn giản là BHT =17% số cuộc gọi phút trong một ngày.
Một biến số quan trọng khác là cấp độ dịch vụ GoS (Grade of Service). GoS định nghĩa số cuộc gọi có thể bị khoá trong nhóm đường line. Bạn có thể điều chỉnh thông số này. Nó thường nằm ở 0.05 (5% các cuộc gọi bị mất) hay 0.01 (1% cuộc gọi bị mất).
Ví dụ: Sử dụng cùng ví dụ trên chúng ta cho một vài dữ liệu trong thành phần lưu lượng. Từ nhật ký cuộc gọi hệ thống chúng ta khám phá ra dữ liệu này.
Dữ liệu từ cuộc gọi ghi nhật ký (phút cuộc gọi và BHT)
Chi nhánh chính đến chi nhánh con 1 = 2000 phút, BHT= 300 phút
Chi nhánh chính đến chi nhánh con 2 = 1000 phút, BHT = 170 phút
Chi nhánh 1 đến chi nhánh 2 = 0, BHT = 0, GoS=0.01
Chi nhánh chính đến chi nhánh con 1 - BHT = 300phút/60 = 5 Erlangs
Chi nhánh chính đến chi nhánh con 2 - BHT = 170phút/60 = 2.83 Erlangs
Sử dụng bảng tính Erlang tại www.erlang.com
1.b Băng thông yêu cầu
Chúng ta sử dụng một mạng WAN nơi mà gói mất hiếm khi xảy ra. Chúng ta sẽ chọn G.729 codec vì chất lượng thoại tốt của nó và dữ liệu được nén (8Kbps).
Chọn codec: G.729
Lớp Datalink: Frame-relay
Ước lượng băng thông cho chi nhánh 1: 28.8x11 = 294.8 Kbps
Ước lượng băng thông cho chi nhánh 2: 26.8x8 = 214.40 Kbps
1.8.10 Giảm băng thông yêu cầu cho VoIP
Có 3 phương pháp để làm giảm băng thông được yêu cầu cho các cuộc gọi VoIP:
+ Nén RTP header
+ IAX trunked
+ VoIP tải (payload)
1.8.10.a Nén RTP Header
Trong mạng Frame-relay và PPP, ta có thể sử dụng nén RTP header, nén RTP header được định nghĩa trong RFC 2508. Nó là một chuẩn IETF cho nhiều router. Tuy nhiên chú ý rằng một vài loại router yêu cầu một tập đặc tính khác cho tài nguyên này được sẵn sàng.
Sự ảnh hưởng của việc sử dụng nén RTP header này là không có cơ sở. Nó giảm băng thông được yêu cầu trong ví dụ của chúng ta từ 26.8 Kbps cho mỗi cuộc đàm thoại xuống 11.2 Kbps, giảm được 58.2%.
1.8.10.b IAX2 trunk mode
Nếu đang kết nối 2 server Asterisk, ta có thể sử dụng giao thức IAX2 trong dạng trunk mode. Công nghệ tiên phong này không yêu cầu bất kỳ một router cụ thể nào và nó có thể áp dụng cho bất kỳ loại datalink nào. IAX2 trunk mode sử dụng lại cùng phần header từ các cuộc gọi thứ 2 và các cuộc gọi sau đó. Sử dụng G.729 và một đường PPP link, cuộc gọi đầu tiên tốn 30 Kbps băng thông, nhưng cuộc gọi thứ hai sử dụng cùng phần header như cuộc gọi thứ nhất nên đã giảm mức băng thông cần thiết cho cuộc gọi này xuống 9.6 Kbps.
1.8.10.c Giảm VoIP tải
Thật không may phương pháp này không có trong Asterisk. Nó thường sử dụng lược đồ trong các gateway trên Internet. Việc sử dụng phần tải (payload) lớn làm tăng độ trễ của hệ thống.
CHƯƠNG 2: CÀI ĐẶT TỔNG ĐÀI IP PBX ASTERISK
2.1 Cái đặt từng phần
Để cài đặt thành công một tổng đài IP PBX Asterisk ta tiến hành cài đặt các phần sau:
Cài đặt 1 hệ điều hành Linux. Ở đây ta chọn hệ điều hành CentOS 5.2
Cài đặt các gói trong tổng đài Asterisk.
Cài đặt Asterisk-GUI để hỗ trợ việc thiết lập và quản lý tổng đài bằng WEB một cách nhanh, dễ sử dụng.
2.1.1 Cài đặt hệ điều hành CentOS
Download CentOS DVD tại địa chỉ:
Các bước cài đặt chính:
Hình 14: Cài đặt CentOS - Khởi động việc cài đặt
Hình 15: Cài đặt CentOS - Giao diện bắt đầu cài đặt CentOS
Hình 16: Cài đặt CentOS - Chọn ngôn ngữ
Hình 17: Cài đặt CentOS - Chọn kiểu bàn phím
Hình 18: Cài đặt CentOS - Cấu hình thiết lập ổ cứng và phân vùng ổ cứng
Hình 19: Cài đặt CentOS - Phân vùng ổ cứng cho CentOS
Trong kỹ thuật phân vùng trong Linux hay CentOS thì người ta thường chia ra làm 4 phần chính:
Phân vùng /boot: khoảng 100MB dùng để lưu dữ liệu khởi động hệ thống.
Phân vùng swap: tốt nhất là dung lượng gấp 2 lần RAM, đối với hệ thống >4GB RAM thì ta chọn bằng với dung lượng RAM. Phần vùng swap sẽ là một phân vùng giúp cho hệ điều hành hoạt động nhanh hơn, tương tự như vùng nhớ Virtual Memory trong Windows.
Phân vùng /home: dung lượng khoảng một nửa dung lượng còn lại chứa dữ liệu cho user.
Phân vùng / : đây là phân vùng root chiếm phần dung lượng còn lại.
Hình 20: Cài đặt CentOS - Thiết lập địa chỉ IP
Phần thiết lập địa chỉ IP: ta có thể sử dụng Dynamic cấp địa chỉ IP tự động hoặc tự thiết lập địa chỉ IP bằng tay. Phần thiết lập địa chỉ IPv6 có thể bỏ qua vì không sử dụng.
Hình 21: Cài đặt CentOS - Chọn múi giờ
Hình 22: Cài đặt CentOS - Nhập password Console cho hệ thống
Hình 23: Cài đặt CentOS - Chọn cách cài đặt
Phần thiết lập cách cài đặt: để đơn giản ta chỉ cần cài theo kiểu server. Không cần cài những kiểu có giao diện như Gnome hay KDE vì sau này ta sẽ cấu hình trực tiếp qua Console hoặc bằng phần mềm Putty.
Chọn Customize now để cài đặt thêm các gói hỗ trợ cho Asterisk.
Hình 24: Cài đặt CentOS - Chọn các gói hỗ trợ cho Asterisk
Phần chọn các gói hỗ trợ cho Asterisk: ta cần chọn Development Tools, chi tiết các gói trong này ta có thể bấm nút Optional packages để tìm hiểu chi tiết hơn. Các gói này sẽ hỗ trợ các chương trình và thư viện đủ để ta cài đặt và vận hành thành công Asterisk sau này.
Hình 25: Cài đặt CentOS - Chọn kiểu loader khởi động
Hình 26: Cài đặt CentOS - Chuẩn bị cài đặt
Hình 27: Cài đặt CentOS - Quá trình cài đặt
Quá trình cài đặt CentOS diễn ra khoảng 20 phút sau đó ta khởi động lại hệ thống và tiến trình cài đặt CentOS thành công, tiếp theo là cài đặt các gói thực hiện chức năng tổng đài IP PBX Asterisk.
2.1.2 Cài đặt các gói trong tổng đài Asterisk
2.1.2.a Chuẩn bị các tập tin trước khi cài đặt
+ Tạo thư mục lưu trữ các tập tin cài đặt Asterisk
# cd /usr/src
# mkdir asterisk
# cd asterisk
+ Dùng lệnh wget để tải các gói cài đặt Asterisk. Các gói này được lấy từ trang web chính của Asterisk bằng các click chuột phải vào dòng download của các gói cài đặt và chọn Copy Link Location.
+ Ta lần lượt download các gói tin về thư mục /usr/src/asterisk gồm:
Asterisk-1.4.21.2
Zaptel-1.4.21.1
Libpri-1.4.7
Addons-1.4.7
+ Ta sử dụng các lệnh sau:
# wget
# wget
# wget
# wget
Hình 28: Tải các gói cài đặt Asterisk
+ Vì các gói tin download về dưới dạng tập tin nén nên ta phải giải nén trước khi compile vào trong hệ thống. Ta sử dụng các câu lệnh sau để giải nén các gói cài đặt:
# tar -xzvf asterisk-1.4.21.2.tar.gz
# tar -xzvf zaptel-1.4.12.1.tar.gz
# tar -xzvf libpri-1.4.7.tar.gz
# tar -xzvf asterisk-addons-1.4.7.tar.gz
Khi giải nén xong trong thư mục /usr/src/asterisk ta có 4 thư mục con:
asterisk-1.4.21.2
zaptel-1.4.12.1
libpri-1.4.7
asterisk-addons-1.4.7
2.1.2.b Compiling và cài đặt các gói
+ Cài đặt Zaptel
Gói Zaptel nên cài đặt trước tiên. Ta dùng lần lượt các lệnh sau để cài đặt:
# cd zaptel-1.4.12.1
# ./configure
# make
# make install
+ Cài đặt libpri
# cd ../ libpri-1.4.7
# make
# make install
+ Cài đặt Asterisk
# cd ../asterisk-1.4.21.2
# ./configure
Hình 29: Khi chạy configure cho compile
# make menuselect
Hình 30: Tuỳ chọn menu sau khi tạo menu bằng lệnh make menuselect
# make
# make install
Hình 31: Sau khi dùng lệnh make install thành công
Tạo các tập tin cấu hình mẫu
# make samples
Hình 32: Tạo các tập tin cấu hình mẫu
Tạo các tài liệu chương trình của Asterisk
# make progdocs
Hình 33: Tạo các tài liệu chương trình của Asterisk
+ Cài đặt asterisk-addons
# asterisk-addons-1.4.7
# ./configure
# make
Hình 34: Cài đặt asterisk-addons
# make install
Quá trình cài đặt Asterisk thành công.
Chú ý sau khi cài đặt thành công Asterisk ta có các thư mục quan trọng sau:
/etc/asterisk/ : chưa các file configuration dạng *.conf, bạn có thể thay đổi trực tiếp các file config bằng một editor (vi) và reload asterisk để thay đổi có hiệu lực.
/var/lib/asterisk/ : Chứa các file library, sound ..etc của Asterisk.
2.1.2.c Cài đặt Asterisk-GUI
+ Ta dùng lệnh svn để tải Asterisk-GUI về và tiến hành cài đặt. Ta lần lượt sử dụng các lệnh sau:
# svn co asterisk-gui
# cd asterisk-gui
# ./configure
# make
# make install
+ Sau khi cài đặt xong ta cần cấu hình 2 file sau:
- Sửa tập tin manager.conf trong thư mục /etc/asterisk/
# vi /etc/asterisk/manager.conf
Sửa tập tin manager.conf thành:
[general]enabled=yeswebenabled=yes ; cho phép truy cập qua web
port=5038 bindaddr=0.0.0.0 ; lắng nghe trên tất cả các port
[vinh] ; tạo một user admin để login qua web cấu hình
secret=password ; password của user vinh
read=system,call,log,verbose,command,agent,user,config,originate,read,writewrite=system,call,log,verbose,command,agent,user,config,originate,read,write
Bấm “ESC:, bấm tiếp “:wq” và “Enter” để lưu tập tin manager.conf mới sửa.
- Sửa tập tin http.conf trong thư mục /etc/asterisk/
# vi /etc/asterisk.http.conf
Sửa tập tin http.conf thành:
[general]enabled=yesbindaddr=0.0.0.0bindport=8088prefix=guienablestatic=yes
Bấm “ESC:, bấm tiếp “:wq” và “Enter” để lưu tập tin manager.conf mới sửa.
+ Vào thư mục /usr/src/asterisk/asterisk-gui và kiểm tra xem quá trình cài đặt Asterisk-GUI thành công không:
# cd /usr/src/asterisk/asterisk-gui
# make checkconfig
+ Khởi động lại Asterisk
# asterisk -r
CLI> restart now
+ Vào đường dẫn sau để truy cập vào Asterisk-GUI (ip là địa chỉ IP của server cài Asterisk)
2.2 Giới thiệu Trixbox các thành phần
Có rất nhiều cách để thực hiện cài đặt một tổng đài Asterisk. Ngoài cách cài đặt từng bước ở trên ta có những sản phẩm khác đóng gói thành một bộ, khi cài đặt là ta có ngay một giải pháp hoàn chỉnh của một tổng đài IP PBX Asterisk.
Trixbox là một ví dụ điển hình cho gói phần mềm hoàn chỉnh cho một tổng đài Asterisk. Cài đặt và vận hành rất dễ dàng. Khi cài đặt xong Trixbox ta có các chức năng: Asterisk trên hệ điều hành CentOS, cấu hình tổng đài qua Web, có thể xem các báo cáo về hệ thống, thống kê các thông số trong tổng đài, chi tiết cuộc gọi, có thể thêm các ứng dụng về voicemail, điện thoại hội nghị …
2.2.1 Cài đặt Trixbox
Download Trixbox CD tại địa chỉ:
Các bước cài đặt chính:
Hình 35: Giao diện bắt đầu cài đặt Trixbox
Hình 36: Chọn loại bàn phím
Hình 37: Chọn Vủng thời gian cho hệ thống
Hình 38: Password để cấu hình Asterisk
Hình 39: Tiến trình cài đặt Trixbox 1
Hình 40: Tiến trình cài đặt Trixbox 2
Hình 41: Giao diện cấu hình qua Web của Trixbox
2.3 Các hỗ trợ trong vận hành và cấu hình Asterisk
2.3.1 Một số lệnh chính trong CLI của Asterisk
Để vào CLI của Asterisk ta dùng lệnh # asterisk -r
2.3.1.a Các lệnh chung
abort halt : huỷ các tiến trình đang bị treo
add extension : thêm 1 số nội bộ vào trong ngữ
debug channel : dò lỗi trên một kênh nào đó
no debug channel : hủy dò lỗi trên một kênh nào đó
help : hiển thị danh sách hỗ trợ
show agents : hiển thị trạng thái của các agent
show applications : hiển thị danh sách các ứng dụng Asterisk hỗ trợ
show application : mô tả chi tiết một ứng dụng
show channel : hiển thị thông tin một kênh
show channels : hiển thị thông tin nhiều kênh
show codecs : hiện thị thông tin các codec
show conferences : hiển thị trạng thái của các phòng hội nghị
show dialplan : hiển thị sơ đồ quay số
show locals : hiển thị trạng của các kênh nội bộ
show queues : hiển thị trạng thái các hàng đợi
show voicemail users : hiển thị các hộp thư thoại của người dùng đã đăng ký
2.3.1.b Các lệnh cho SIP
sip debug : dò lỗi SIP
sip no debug : hủy dò lỗi SIP
sip reload : reload sip.conf
sip show channels : hiển thị các kênh SIP đang hoạt động
sip show channel : hiển thị thông tin kênh SIP chi tiết
sip show peers : hiển thị danh sách các số SIP trong tổng đài
2.3.1.c Quản trị Server
restart now : khởi động lại Asterisk lập tức
restart when convenient : khởi động Asterisk khi không có cuộc gọi nào
reload : reload cấu hình
stop now : tắt Asterisk lập tức
stop when convenient : tắt Asterisk khi không có cuộc gọi nào
show version : hiển thị phiên bản Asterisk
2.3.2 Các công cụ hỗ trợ vận hành và cấu hình Asterisk
2.3.2.a Phần mềm Putty
Phần mềm Putty hỗ trợ ta trong việc cấu hình trực tiếp lên hệ điều hành Linux từ xa dùng SSH. Đây là một công cụ rất thông dụng để cấu hình Linux ở dạng Console lệnh.
Ta có thể tải phần mềm từ:
Sau đây là một số hình ảnh của chương trình Putty
Hình 42: Giao diện phần mềm Putty - Đăng nhập
Hình 43: Giao diện phần mềm Putty - Cửa sổ lệnh
2.3.2.b Phần mềm WINSCP
Phần mềm WINSCP giúp ta thao tác trên các tập tin và phân vùng ổ cứng trong môi trường Linux giống như chương trình Windows Commander trong Windows, hay NC dùng trong DOS.
WINSCP giúp ta tiết kiệm rất nhiều thời gian trong việc cập nhật và quản lý các tập tin trong Linux, bằng các thao tác rất đơn giản.
Ta có thể tải phần mềm từ:
Sau đây là một số hình ảnh của chương trình WINSCP
Hình 44: Giao diện phần mềm WINSCP - Đăng nhập
Hình 45: Giao diện phần mềm WINSCP - Sử dụng
CHƯƠNG 3: TÌM HIỂU CÁCH CẤU HÌNH ASTERISK
3.1 Tìm hiểu các tập tin cấu hình trong Asterisk
Ta có thể cấu hình Asterisk trong console mode, hoặc có một cách tiện lợi hơn là biên tập trực tiếp các tập tin cấu hình trong /etc/asterisk. Mỗi ứng dụng riêng của Asterisk như voicemail, zaptel, music-on-hold, meetme, conference, iax… đều có tập tin cấu hình riêng của mình, tuy nhiên có 2 tập tin cấu hình quan trọng nhất là sip.conf và extension.conf:
- sip.conf : tập tin cấu hình về các thông tin của các số nội bộ client như username, password, IP, type, security, codec là thành phần căn bản nhất lưu giữ thông tin trong Asterisk.
- extension.conf: tập tin cấu hình về các luật định tuyến cuộc gọi, luật quay số (sơ đồ quay số), các extension trong ngoài và những tính năng đặc biệt khác. extensions.conf là tập tin quan trọng nhất trong bất kỳ cấu hình Asterisk nào.
Các tập tin cấu hình khác:
- voicemail.conf : tập tin cấu hình cho hệ thống hộp thư thoại (voice-mail) của Asterisk. Asterisk có thể dùng lệnh Sendmail trên CentOS để gởi mail đến cho các địa chỉ được lưu trong tập tin cấu hình này.
- zaptel.conf : tập tin này nằm ngoài /etc, là tập tin chứa thông số index, driver dành cho Linux khi kích hoạt các thiết bị điện thoại cắm trực tiếp vào Asterisk thông qua cổng PCI.
- zapata.conf : cũng thuộc module zaptel, nhưng là tập tin kết nối các thiết bị điện thoại đã được khai báo vào hệ thống chính của Asterisk.
- iax(2).conf : các thông số về IAX (inter-asterisk protocol) dùng khi kết nối 2 Asterisk box với nhau.
- meetme.conf : một chức năng tạo room conference căn bản.
3.2 Ngữ pháp của Asterisk
Asterisk được điều khiển bằng các tập tin cấu hình dạng văn bản (text) được lưu trong thư mục /etc/asterisk. Kiểu định dạng tập tin này tương tự như tập tin “.ini” trong Windows. Dấy chẩm phẩy “;” được sử dụng để ghi chú, dấu “=” và “=>” tương đương nhau và dấu khoảng trống được bỏ qua.
[Session]
Key = value ; Khởi tạo biến
[Session 2]
Key => value ; Khai báo đối tượng
Asterisk biên dịch “=” và “=>” cùng một cách thức. Điều khác biệt là cú pháp được sử dụng ở đây khác nhau cho đối tượng và biến. Cú pháp là giống nhau giữa tất cả các tập tin và có 3 loại ngữ pháp được chỉ ra bên dưới:
Loại ngữ pháp
Đối tượng được tạo ra
Tập tin cấu hình
Ví dụ
Nhóm đơn
Tất cả trên cùng một dòng
extensions.conf
exten=>4000,1,Dial(SIP/4000)
Tuỳ chọn kế thừa
Tuỳ chọn được tạo trước, đối tượng kế thừa các tuỳ chọn
zapata.conf
[channels]
context=default
signalling=fxs_ks
group=1
channel => 1
Dạng thực thể phức hợp
Mỗi thực thể nhận một ngữ cảnh
sip.conf
iax.conf
[cisco]
type=friend
secret=mysecret
host=10.1.30.50
context=trusted
[xlite]
type=friend
secret=xlite
host=dynamic
Bảng 2: Các kiểu ngữ pháp trong Asterisk
3.2.1 Nhóm đơn
Kiểu định dạng nhóm đơn được sử dụng trong các tập tin extensions.conf, meetme.conf và voicemail.conf là ngữ pháp cơ bản nhất. Mỗi đối tượng được khai báo với các tùy chọn trong cùng một hàng.
Ví dụ:
[Session]
Object 1 => op1,op2,op3
Object 2=> op1b,op2b,op3b
Trong ví dụ này, Object 1 được tạo ra với các tùy chọn op1, op2, op3 trong khi object 2 được tạo ra với các tùy chọn op1b, op2b, op3b.
3.2.2 Các tùy chọn đối tượng kiểu ngữ pháp thừa kế
Kiểu định dạng này được sử dụng bởi zapata.conf và agents.conf nơi có nhiều tùy chọn sẵn sàng, hầu hết các giao tiếp, các đối tượng chia sẻ và khai báo các kênh. Các tùy chọn cho đối tượng được khai báo phía trên đối tượng và có thể được thay đổi trong đối tượng khác. Mặc dù khái niệm này hơi khó hiểu nhưng nó rất dễ sử dụng.
Ví dụ:
[Session]
op1 = bas
op2 = adv
object=>1
op1 = int
object => 2
Hai dòng cấu hình đầu tiên giá trị của tùy chọn op1 và op2 là “bas” và “adv”. Khi đối tượng 1 được tạo ra nó được tạo ra sử dụng option 1 như là “bas” và option 2 như là “adv”. Sau khi định nghĩ đối tượng 1 chúng ta thay đổi option 1 sang “int”. Sau đó chúng ta tạo ra đối tượng 2 với option 1 là “int” và option 2 là “adv”.
3.2.3 Dạng thực thể phức hợp
Kiểu định dạng này được sử dụng trong iax.conf, sip.conf và trong những tập tin cấu hình nơi mà có nhiều thực thể với nhiều tùy chọn. Cơ bản, kiểu định dạng này không chia sẽ một luợng lớn các cấu hình chung. Mỗi một thực thể nhận một ngữ cảnh. Đôi khi ngữ cảnh được dành riêng giống như [general] cho cấu hình toàn cục. Các tùy chọn được khai báo trong nội dung khai báo.
Ví dụ:
[entity1]
op1=value1
op2=value2
[entity2]
op1=value3
op2=value4
Thực thể [entity1] có các giá trị “value1” và value2” cho các tùy chọn op1 và op2. Thực thể [entity2] có các giá trị “value3” và value4” cho các tùy chọn op1 và op2.
3.3 Tìm hiểu cấu hình một giao tiếp PSTN
Để kết nối đến một PSTN ta sẽ phải cần có một card giao tiếp FXO và một đường dây điện thoại. Ta có thể sử dụng một số PBX có sẵn. Ta có thể làm được bằng một card giao tiếp điện thoại với với một giao tiếp FXO từ nhiều nhà cung cấp khác nhau. Trong ví dụ này chúng ta tìm hiểu cách cài đặt một mạch Zaptel:
Ghi chú: có nhiều card FXO khác. Card X100P có thể tìm thấy trên thị trường với giá khá rẻ. Những mạch này dựa trên nền fax/modem 56K của Motorola và Intel chipset. Những chipset này là:
- Motorola 68202-51
- Intel 537PU
- Intel 537 PG
- Intel Ambient MD3200
Không có đảm bảo để mạch này sẽ làm việc được. Việc sử dụng là tùy, một vài vấn đề về tiếng dội và âm lượng thấp. Nếu ta muốn chất luợng tốt, đảm bảo độ tin cậy thì nên dùng board của Digium.
3.3.1 Cài đặt X100P
Trước khi cài đặt một card X100P vào trong máy tính, ta phải disable tất cả các phần cứng không cần dùng đến hay không sử dụng từ mạch chính. Điều này sẽ giúp cho chúng ta tránh được các vấn đề về chia sẽ các ngắt (interrupt). Để cài đặt đúng X100P, ta sẽ phải gắn card vào trong một khe PCI và điểu chỉnh 2 tập tin cấu hình:
• zaptel.conf : tập tin này nằm ngoài /etc, là tập tin chứa thông số index, driver dành cho Linux khi kích hoạt các thiết bị điện thoại cắm trực tiếp vào Asterisk thông qua cổng PCI.
• zapata.conf : cũng thuộc module zaptel, nhưng là tập tin kết nối các thiết bị điện thoại đã được khai báo vào hệ thống chính của Asterisk.
- zaptel.conf
fxsks=1
loadzone = br
defaultzone=br
channels=1
- zapata.conf
[channels]
context=default
signalling=fxs_ks
group=1
channel => 1
3.3.2 Cài và cấu hình driver card X100P
Sau khi hoàn tất việc chỉnh sửa các tập tin trên ta tiến hành load các bộ điều khiển zaptel và cài đặt bằng các lệnh:
# modprobe zaptel
# modprobe wcfxo
# ztcfg -v
# asterisk -g
3.4 Tìm hiểu cấu hình điện thoại IP SIP
Chúng ta hãy cấu hình các điện thoại SIP. Ý tưởng là cấu hình một tổng đài PBX. SIP được cấu hình trong thư mục /etc/asterisk/sip.conf và có tất cả các thông số liên hệ tới điện thoại SIP và nhà cung cấp dịch vụ VoIP. Các SIP client phải được cấu hình trước khi ta nhận hay thực hiện cuộc gọi.
3.4.1 Phần chung [general]
SIP tập tin được đọc từ trên xuống dưới. Phần đầu chứa các thông số toàn cục [general]. Các tùy chọn chính gồm:
• allow/disallow : định nghĩa codecs nào có thể được sử dụng.
• bindaddr : Địa chỉ mà Asterisk SIP dùng để lắng nghe (listener). Nếu ta thiết lập nó thành 0.0.0.0 (mặc định) nó sẽ lắng nghe ở tất cả các giao tiếp.
• context : Thiết lập ngữ cảnh mặc định cho tất cả các client ngoại trừ các client đã được thay đổi.
• bindport : port SIP UDP dùng để lắng nghe.
• maxexpirey : Thời gian tối đa cho việc đăng ký (tính bằng giây).
• defaultexpirey : Thời gian mặc định cho việc đăng ký (tính bằng giây).
• register : đăng ký Asterisk tới một host khác..
Ví dụ:
[general]
bindport = 5060
bindaddr = 10.1.30.45
context = default
disallow = all
allow = ulaw
allow = alaw
maxexpirey = 120
defaultexpirey = 80
3.4.2 Phần Client
Sau khi hoàn thành các phần chung [general], tiếp theo sẽ thiết lập các SIP client.
• [name] : Khi một thiết bị SIP kết nối đến Asterisk, nó sử dụng phần username của SIP URI để tìm ra peer/user.
• type : Cấu hình lớp kết nối. Các tuỳ chọn là peer, user và friend.
• peer : Asterisk gởi các cuộc gọi đến peer.
• user : Asterisk nhận các cuộc gọi từ một user.
• friend : Cả hai cùng thời điểm.
• host : địa chỉ IP hay tên của host. Tuỳ chọn thông thường là “dynamic”, được sử dụng khi host đăng ký đến Asterisk.
• secret : Mật khẩu để xác thực peer và user.
Ví dụ:
[cisco]
type=friend
secret=mysecret
host=10.1.30.50
context=trusted
[xlite]
type=friend
secret=xlite
host=dynamic
defaultip=10.1.30.17
3.5 Tim hiều sơ đồ quay số
Sơ đồ quay số là trái tim của Asterisk, nó định nghĩa cách mà Asterisk điều khiển, định tuyến mỗi cuộc gọi và bất kỳ cuộc gọi đến PBX. Nó chứa các số, danh sách lệnh cho Asterisk tuân theo. Các lệnh được gắn vào các số nhận được từ kênh hay ứng dụng. Để cấu hình Asterisk thành công, việc hiểu sơ đồ quay số là rất quan trọng.
Hầu hết sơ đồ quay số đều được chứa trong tập tin extensions.conf tại thư mục /etc/asterisk. Tập tin này sử dụng ngữ pháp nhóm đơn và có 4 thành phần chính sau:
• Số nội bộ (Extensions).
• Số ưu tiên (Priorities).
• Ứng dụng (Applications).
• Ngữ cảnh (Contexts).
3.5.1 Số nội bộ (Extensions)
Sơ đồ quay số là một tập hợp các số được định nghĩa trước. Một số là một chuỗi sẽ trigger một sự kiện khi một cuộc gọi được thực hiện. Các số có thể hoặc bằng chữ hoặc bằng mẫu số (pattern).
3.5.1.a Một số mẫu số (pattern)
• _ : chỉ việc bắt đầu 1 pattern.
• X : đại diện cho bất kỳ số nào từ 0 đến 9.
• N : đại diện cho bất kỳ số nào từ 2 đến 9.
• Z : đại diện cho bất kỳ số nào trừ số 0.
• [dãy bất kỳ] : khớp với chỉ một trong các ký tự nằm trong dấu ngoặc vuông “[]”. Ví dụ: [02-68*#] sẽ khớp với các ký tự 0, từ 2 đến 6, 8, * hoặc #.
• . : là một wildcard, khớp với bất kỳ ký tự nào nằm phía sau dấu chấm “.”.
• | : để chỉ việc sử dụng phím số phía trước | để gọi ra ngoài (thường là số 0 hay số 9). Số này được loại bỏ không đưa ra ngoài.
Một số ví dụ của mẫu số (pattern):
9|NXXXXXXXX : bấm số 9 để ra ngoài, dãy số gọi ra ngoài gồm 9 phím số bắt đầu từ số 2 đến 9 và 8 số còn lại là bất kỳ. Vậy tổng cộng người sử dụng gọi 10 số nhưng số 9 đầu bị loại bỏ và chỉ gởi 9 số sau ra ngoài trung kế.
_4XXX : chỉ những số gọi nội bộ có 4 số bắt đầu từ số 4.
_90[2-8]. : dùng cho trường hợp số gọi ra ngoài (bấm số 9 ra ngoài) số sau là dãy số đường dài. Dùng trong các ngữ cảnh cấp quyền gọi đường dài.
_909XXXXXXXX : dùng cho trường hợp số gọi ra ngoài (bấm số 9 ra ngoài) số sau là dãy số di động. Dùng trong các ngữ cảnh cấp quyền gọi di động.
_91900. : dùng cho trường hợp số gọi ra ngoài (bấm số 9 ra ngoài) số sau là dãy số dịch vụ 1900. Dùng trong các ngữ cảnh cấp quyền gọi dịch vụ 1900.
Như ta thấy bên trên, việc hiểu và sử dụng các mẫu số (pattern) này mang lại tính linh hoạt và sơ đồ quay số rất mạnh cho cấu hình định tuyến Asterisk.
3.5.1.b Các ví dụ về số nội bộ (extensions)
+ Ví dụ 1:
exten=>8580,1,dial(SIP/8580,20)
exten=>8580,2,hangup()
Lệnh “exten” mô tả bước tiếp theo của cuộc gọi đến số 8580 là một tập hợp của các số nhận được (số được gọi). Số “1” và “2” là độ ưu tiên định nghĩa thứ tự xử lý. Quay số “8580” sẽ gọi SIP IP Phone đã được đăng ký như “8580”. Nếu cuộc gọi không có nguời trả lời sau 20 giây nó sẽ giải toả cuộc gọi.
+ Cú pháp Extension
exten=> number (name), {priority|label{+|-}offset}[(alias)],application
Lệnh extension “exten=” theo sau bởi một số nội bộ hoặc tên, một dấu phẩy, một số ưu tiên, một dấu phẩy nữa và cuối cùng là ứng dụng. số nội bộ gắn với địa chỉ của cuộc gọi (số điện thoại). Số ưu tiên được sử dụng để chỉ thứ tự các bước thực thi tương ứng với số ưu tiên. Ứng dụng là hành động (quay số, gọi lại, gác máy …). Mỗi một hành động là một ứng dụng khác nhau.
+ Ví dụ 2:
exten=>_90[2-8].,1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_90[2-8].,n,hangup()
Trên là một ví dụ điển hình cho việc gọi đường dài của một số nội bộ:
- _90[2-8]. : chỉ ra bắt đầu một pattern, gọi ra ngoài dùng số 9 đầu và gọi đi liên tỉnh (bắt dầu số 0 và sau là số 2 đến số 8 để gọi mã liên tỉnh). Dấu chấm “.” chỉ bất kỳ dãy số nào phía sau đều chấp nhận.
- ZAP/g1 : chỉ đường ra là một trong các đường trung kế rỗi gắn vào card FXO. Nếu ZAP/1 tức là đường số 1, Zap/2 tức là đường số 2 và ZAP/g1 là bất kỳ đường nào rỗi trong dãy trung kế.
- ${EXTEN:1) : đây là biến lấy số nhập vào là phần sau của dãy số đã nhập, trừ đi 1 số đầu, tức số 9 sẽ bị bỏ qua.
3.5.2 Số ưu tiên (Priorities)
Số ưu tiên đánh số các bước thực hiện trong mỗi số được quay. Mỗi số ưu tiên gọi một ứng dụng xác định. Thông thường số này bắt đầu từ số “1” và tăng từng bước 1 bậc trong phần định nghĩa số nội bộ. Hiện tại các phiên bản Asterisk mới hỗ trợ việc sử dụng thuật ngữ “n” đại diện cho số ưu tiên tiếp theo thay vì phải gán số tiếp theo.
3.5.3 Ứng dụng (Applications)
Các ứng dụng đóng một vai trò quan trọng trong Asterisk. Chúng điểu khiển các kênh thoại, âm hiệu, chấp nhận các con số được gọi từ PBX và giải toả cuộc gọi. Các ứng dụng có thể được gọi với các tuỳ chọn để chỉ cách hành xử. Ta có thể sử dụng lệnh “show applications” trong giao diện lệnh của Asterisk để chỉ ra các ứng dụng có sẵn.
CLI>show applications
3.5.4 Ngữ cảnh (Contexts)
Ngữ cảnh đóng một vai trò quan trọng trong việc cấu hình sơ đồ quay số của Asterisk và bảo mật. Ngữ cảnh định nghĩa một vùng (scope) cho phép phân chia sơ đồ quay số thành nhiều phần khác nhau. Việc hiểu ngữ cảnh được gắn kết với các kênh là rất quan trọng. Khi tổng đài Asterisk nhận một cuộc gọi, cuộc gọi được xử lý trong phần ngữ cảnh gọi đến (incoming). Ngữ cảnh (context) gọi đến luôn luôn được định nghĩa bởi tập tin cấu hình kênh (iax.conf, sip.conf, zap.conf…).
Giả sử rằng chúng ta có 2 lớp người sử dụng “managers” và “guests”. Giả sử rằng chúng ta muốn có 2 thông điệp cho “guests” và “managers” khi họ quay số “9000”. Ta có thể làm được việc này bằng các định nghĩa ngữ cảnh gọi đến trong tập tin cấu hình kênh (sip.conf, iax.conf, zap.conf).
Trong ví dụ bên dưới, khi nhanvienA quay số 9000, nhanvienA nhận được thông điệp “youareaguest”. Khi nhanvienB quay cùng số này nhanvienB nhận được thông điệp khác “youaremanager”.
sip.conf
[nhanvienB]
context=managers
host=dynamic
…
[nhanvienA]
context=guests
host=dynamic
…
extensions.conf
[nhanvienB]
exten=>9000,1,Playback(youareamanager)
[nhanvienA]
exten=>9000,1,Playback(youareaguest)
Khi hiểu khái niệm này ta có thể tạo ra nhiều chức năng khác nhau trong Asterisk. Các ngữ cảnh khác nhau có thể được sử dụng để phục vụ cho nhiều công ty khác nhau và nhiều lớp người dùng khác nhau trong cùng cấu hình Asterisk. Ngữ cảnh có thể được xác định là ai có thể gọi được cuộc gọi đường dài và ai không được.
Ngữ cảnh nhận một tên bên trong dấu “[]”. Tất cả các lệnh định nghĩa sau đó là một phần của ngữ cảnh. Để bắt đầu một ngữ cảnh, đơn giản là chèn vào phần ngữ cảnh mới. Một ngữ cảnh kết thúc khi một ngữ cảnh khác bắt đầu.
Có 2 ngữ cảnh quan trọng trong tập cấu hình extensions.conf. Ngữ cảnh [globals] được sử dụng để định nghĩa các biến trong khi ngữ cảnh [general] được sử dụng để định nghĩa các tuỳ chọn chung.
3.6 Tìm hiểu cách tạo một sơ đồ quay số
Bây giờ chúng ta bắt đầu với việc tạo ra sơ đồ quay số đầu tiên. Chúng ta sẽ sử dụng các ví dụ để mô tả sơ đồ quay số. Hãy đi từng bước:
3.6.1 Ví dụ cơ bản
Trong ví dụ này, Asterisk sẽ nhận một cuộc gọi, phát ra một âm thanh và giải toả cuộc gọi.
Điều chỉnh tập tin extensions.conf bao gồm:
[incoming]
exten=>s,1,answer()
exten=>s,2,playback(goodbye)
exten=>s,3,hangup()
Ưu tiên 1 gọi ứng dụng answer() để trả lời. Asterisk điều khiển đường dây và thiết lập các cuộc gọi. Sau khi trả lời nó sẽ qua ưu tiên tiếp theo.
Ưu tiên 2 gọi ứng dụng playback() để phát ra một âm thanh từ tập tin goodbye.gsm.
Cuối cùng ưu tiên 3 gọi ứng dụng hangup() kết thúc cuộc gọi.
Mô tả ví dụ:
Một cuộc gọi được nhận bởi một giao tiếp FXO được gởi đến ngữ cảnh incoming, được định nghĩa trong tập tin cấu hình kênh (zapata.conf). Khi một cuộc gọi đến nó được xử lý trong số “s” của ngữ cảnh incoming. Chúng ta có 3 tuỳ chọn mỗi tuỳ chọn gọi một ứng dụng.
Số đặc biệt “s” được sử dụng để bắt đầu xử lý cuộc gọi đến khi số được gọi đến tổng đài không xác định (ví dụ cuộc gọi đến bởi 1 đường line analog).
Nếu chúng ta trả lời một cuộc gọi, tốt hơn là chúng ta biết ứng dụng nào sẽ thực hiện. Ứng dụng answer() được sử dụng để trả lời một kênh trong trạng thái rung chuông. Một vài ứng dụng yêu cầu ứng dụng answer() trước khi xử lý cuộc gọi.
Ứng dụng playback() được sử dụng để phát ra một bản tin từ một tập tin âm thanh được thu trước. Khi ứng dụng playback() được thực thi, bất kỳ phím bấm vào đưa vào đều được bỏ qua. Cú pháp lệnh playback(filename). Nó sẽ phát tập tin với đuôi .gsm từ thư mực âm thanh mặc định.
Ứng dụng hangup() làm nhiệm vụ giống như tên gọi của nó. Nó giải toả kênh đang kích hoạt.
3.6.2 Một ví dụ khác
Chúng ta hãy phát triển ví dụ đầu của chúng ta bằng các đưa ra thêm 2 ứng dụng nữa: background() và goto(). Điều chính yếu cho các hệ thống tương tác trên Asterisk là ứng dụng background(). Nó cho phép ta phát một tập tin âm thanh trong khi vẫn đang chờ để nhận các phím số đưa vào. Khi điều này xuất hiện, âm thanh đang phát sẽ ngưng lại và thực thi tiếp theo sẽ tuỳ thuộc vào các số được bấm.
Cú pháp câu lệnh ứng dụng background()
exten=>extension, priority, background(filename)
Một ứng dụng hữu ích khác là goto(). Như tên của nó, nó nhảy từ ngữ cảnh hiện tại qua một số nội bộ, một số ưu tiên đến một nội dung xác định, số nội bộ và một số ưu tiên khác.
Cú pháp ứng dụng goto():
exten=>extension, priority,goto(context,extension, priority)
Cú pháp hợp lệ của goto():
Goto(context,extension,priority)
Goto(extension,priority)
Goto(priority)
Đây là một ví dụ của một công ty nhỏ với 3 phòng ban: kỹ thuật hỗ trợ, kinh doanh và huấn luyện. Chúng ta hãy tạo ra một hệ thống tương tác cho phép các người dùng có thể chọn phòng ban được gọi. Đầu tiên, chúng ta sẽ phát một đoạn chào hỏi giới thiệu giống như “bấm phím 1 để hỗ trợ kỹ thuật, phím 2 để huấn luyện, và phím 3 để gặp phòng kinh doanh”. Trong ví dụ này chúng ta không xử lý những trường hợp gõ số sai. Sau khi ta chọn một phòng ban, hệ thống sẽ phát một bản tin giống như “Bạn đang kết nối đến phòng ban…” và chuyển việc xử lý đến một ngữ cảnh tương ứng.
[incoming]
exten=>s,1,Answer()
exten=>s,2,Background(greeting)
exten=>s,3,hangup()
exten=>1,1,playback(support)
exten=>1,2,goto(support,s,1)
exten=>2,1,playback(training)
exten=>2,2,goto(training,s,1)
exten=>3,1,playback(sales)
exten=>3,2,goto(sales,s,1)
Diễn giải từng bước:
Khi một người nào đó thực hiện cuộc gọi điện thoại đến hệ thống Asterisk thông qua card giao tiếp FXO (đã được cấu hình [incoming] trong zapata.conf), số “s” trong [incoming] đã được trigger. Số “s” trả lời cuộc gọi sử dụng ứng ụng background và phát một thông điệp chào, chờ nhận số. Nếu người sử dụng bấm số “1” thì hệ thống sẽ chuyển sang số “1” và phát một bản tin tương ứng “Bạn được chuyển đến phòng hỗ trợ kỹ thuật”. Tiếp theo, số “2” gởi đến [support] để xử lý tiếp…
3.6.3 Các kênh cầu nối sử dụng ứng dụng dial()
Ta có thể nâng cấp ví dụ của mình bằng cách thêm vào lệnh dial(). Thay vì gởi đến xử lý một ngữ cảnh khác, chúng ta sẽ chuyển cuộc gọi đến một số nội bộ một cách trực tiếp dùng ứng dụng dial().
[incoming]
exten=>s,1,Answer()
exten=>s,2,Background(greeting)
exten=>s,3,hangup()
exten=>1,1,playback(support)
exten=>1,2,Dial(SIP/8000)
exten=>2,1,playback(training)
exten=>2,2,Dial(ZAP/1)
exten=>3,1,playback(sales)
exten=>3,2,Dial(IAX2/8002)
So sánh với ví dụ đầu tiên, chúng ta vừa tạo ra một đường tắt. Thay vì gởi cuộc gọi đến một ngữ cảnh khác, chúng ta bây giờ chuyển cuộc gọi đến kênh cuối cùng. Cho “support”, chúng ta sẽ trực tiếp gọi đến SIP phone với số 8000. Cho “training” chúng ta sẽ chuyển cuộc gọi trực tiếp đến TDM (analog hoặc digital) đến kênh số “1” . Cuối cùng cho “sales” chúng ta sẽ gởi cuộc gọi đến IAX2 phone với số “8002”.
3.7 Tìm hiểu cách tạo một hệ thống IVR
Trước khi thực hiện một hệ thống IVR ta đi tìm hiểu các ứng dụng cơ bản để tạo ra hệ thống IVR, sau đó ta đi tìm hiểu các bước xây dựng một hệ thống IVR.
3.7.1 Ứng dụng background()
Phát một tập tin âm thanh trong khi vẫn chờ để nhận các số vào.
Cú pháp:
background(filename1[filename2…][options[langoverride][context]])
Ứng dụng này sẽ phát một danh sách tập tin được đưa vào trong khi vẫn chờ để nhận một số được gởi đến bởi một kênh gọi đến. Để tiếp tục chờ nhận các số sau khi ứng dụng này đã kết thúc việc phát các tập tin âm thanh thì ứng dụng WaitExten được sử dụng. tuỳ chọn “langoverride” chỉ ngôn ngữ được sử dụng để nhận các tập tin âm thanh phát ra (tức các tập tin âm thanh được tạo ra thành các bộ theo từng ngôn ngữ). Nếu một ngữ cảnh (context) được sử dụng thì nó là một ngữ cảnh của sơ đồ quay số mà ứng dụng này sẽ sử dụng khi hoàn tất một số đã được gởi đến. Nếu một trong các tập tin trong danh sách các tập tin được phát ra không tồn tại thì tiến trình phát sẽ bị hủy bỏ.
3.7.2 Ứng dụng record()
Ứng dụng này dùng để thu âm từ một kênh và tạo ra một tập tin định sẵn, nếu tập tin này đã tồn tại thì nó sẽ ghi đè lên.
Cú pháp:
record(filename.format silence[maxduration][option])
• “format” : là kiểu định dạng của tập tin có thể lưu được (như: wav, gsm…).
• “silence” : là số giây im lặng cho phép trước khi bắt đầu thu âm.
• “maxduration” : là số giây ghi âm tối đa nếu không có thông số này hoặc thông số này bằng 0 thì không có giới hạn về thời gian ghi âm.
• “options” : tuỳ chọn gồm bất kỳ các ký tự sau:
o 'a' : thêm vào một tập tin âm thanh đã tồn tại thay vì ghi đè.
o 'n' : không trả lời nhưng lại ghi âm bất kể đường dây có trả lời hay không.
o 'q' : im lặng, không phát ra tiếng beep báo bắt đầu ghi âm.
o 's' : vẫn giữ việc ghi âm cho dù đường dây không trả lời.
o 't' : dùng để thay việc kết thúc ghi âm dùng dấu sao “*” thay vì dấu thăng “#”.
o 'x' : bỏ qua phím báo hiệu kết thúc ghi âm và giữ đến khi nào gắc máy.
Nếu tên tập tin có chứa “%d” nó sẽ thay thế cho một số tăng dần mỗi khi một tập tin đươc ghi âm.
Dùng lệnh # show file formats để xem các kiểu định dạng mà hệ thống hỗ trợ.
Người sử dụng bấm phím # để kết thúc việc ghi âm, nếu người sử dụng gác máy giữa chừng thì quá trình ghi âm sẽ bị huỷ bỏ và không lưu lại tập tin ghi âm này.
3.7.3 Ứng dụng playback()
Phát một tập tin âm thanh (không cần đưa vào phần đuôi)
Cú pháp:
playback([filename1[& filename2…][option])
3.7.4 Ứng dụng read()
Ứng dụng này dùng để xác định trước số con số hay một khoảng thời gian quy định trước (biến số) khi người dùng nhập vào hệ thống.
Cú pháp:
Read(variable[filename][maxdigits][option][attempts][timeout]
• “filename” : tập tin âm thanh phát ra truớc khi đọc các con số.
• “maxdigits” : số các con số nhập vào tối đa.
• “attempts” : nếu lớn hơn 1 tức sẽ thử nhiều lần nếu không có dữ liệu đưa vào.
3.7.5 Ứng dụng gotoif()
Cú pháp:
Gotoif(condition?[labeliftrue]:[labeliffalse])
Ứng dụng này sẽ giúp cho cuộc gọi có thể nhảy đến một vùng xác định trong sơ đồ quay số dựa vào giá trị trong phần điều kiện (condition). Cuộc gọi sẽ tiếp tục đến “labeliftrue” nếu thoả điều kiện và “lableiffalse” nếu không thoả. “label” có cấu trúc tương tự như cấu trúc sử dụng trong ứng dụng goto().
3.8 Xây dụng một hệ thống IVR
Yêu cầu: Khi nhận số IVR sẽ phát một tập tin âm thanh với nội dung ‘Chào mừng bạn đến với công ty XYZ, bấm phím 1 để vào phòng kinh doanh, phím 2 để vào phòng hỗ trợ kỹ thuật, bấm số 3 để vào phòng huấn luyện, hoặc xin quý khách chờ trong giây lát để gặp tổng đài viên của chúng tôi…”. Khi số 1 được bấm, cuộc gọi sẽ được chuyển đến phòng kinh doanh (SIP/4001); nếu bấm phím số 2, cuộc gọi sẽ được chuyển đến phòng hỡ trợ kỹ thuật (SIP/4002); nếu bấm phím số 3, cuộc gọi sẽ được chuyển đến phòng huấn luyện (SIP/4003). Nếu không có phím nào được bấm thì chuyển cuộc gọi đến tổng đài viên (SIP/4000).
Ta thực hiện hệ thống IVR qua 2 bước:
3.8.1 Thu âm lời chào
Chúng ta tạo ra một lời chào bằng cách ghi âm một lời chào với tên được nhập vào sau khi quay số 9001, sau khi nghe tiếng bíp ta bắt đầu thu âm và khi kết thúc ta bấm nút thăng “#” để lưu lại tập tin này và phát lại tập tin để kiểm tra:
Ta tạo ra các lệnh sau trong tập tin extensions.conf:
exten=_9001.,1,answer()
exten=_9001.,n,record(${EXTEN:4} t)
exten=_9001.,n,playback(${EXTEN:4})
exten=_9001,n,handup()
3.8.2 Tạo ra hệ thống IVR
OPERATOR=>SIP/4000
[menu]
exten=>s,1,background(mainmenu)
exten=>1,1,goto(sales,s,1)
exten=>2,1,goto(techsupport,s,1)
exten=>3,1,goto(training,s,1)
; Nếu bấm sai số thì chuyển qua số của tổng đài viên
exten=>i,1,dial(${OPERATOR})
; Nếu hết thời gian thì chuyển qua số của tổng đài viên
exten=>t,1, dial(${OPERATOR})
[sales]
exten=s,1,dial(SIP/4001,20,tT)
[techsupport]
exten=s,1,dial(SIP/4002,20,tT)
[training]
exten=s,1,dial(SIP/4003,20,tT)
CHƯƠNG 4: XÂY DỰNG MỘT TỔNG ĐÀI THỰC TẾ
4.1 Mô tả các bước thực hiện
1. Mô tả chức năng và hoạt động của tổng đài.
2. Cấu hình phần cứng.
3. Cài đặt tổng đài Asterisk.
4. Chuẩn bị và cài đặt các thiết bị FXS, FXO.
5. Cấu hình các thông số trong tổng đài.
6. Thiết lập các Client và kiểm tra cuộc gọi.
4.2 Mô tả chức năng và hoạt động của tổng đài
Mô tả nhu cầu công ty:
+ Khoảng 50 số nội bộ, đảm bảo khả năng xử lý cuộc gọi tốt trong nội bộ.
+ Bên ngoài gọi vào số nội bộ của công ty phải qua tổng đài viên, có thể gọi trực tiếp đến một số số đặc biệt.
+ Dùng hệ thống IVR để giao tiếp với khách hàng.
+ Có cơ chế phân quyền gọi đi nội hạt, di động, liên tỉnh, quốc tế và các dịch vụ 1900…
4.3 Cấu hình phần cứng
+ CPU: P4 2.8 GHz
+ RAM: 512 MB
+ HDD: 80 GB Sata
+ Card Digium TDM400P
Đánh giá chung cấu hình: cấu hình này so với cấu hình thực tế phần cứng hiện nay là thấp. Nhưng trên thực tế tổng đài Asterisk không yêu cầu cấu hình quá cao. Cấu hình đề nghị bên trên có thể sử dụng cho công ty có khoảng 500 người dùng với mô hình phân tán khá rộng (cấu hình server Asterisk của công ty Thế Giới Di Động với 1200 nhân viên, 30 siêu thị hoạt động trên toàn quốc).
4.4 Cài đặt tổng đài Asterisk
b1. Cài đặt hệ điều hành CentOS 5.2
b2. Cài đặt các gói trong tổng đài Asterisk
b3. Cài đặt Asterisk-GUI để hỗ trợ cấu hình và quản lý tổng đài
(Các bước cài đặt tham khảo Chương 2)
4.5 Chuẩn bị và cài đặt các thiết bị FXS, FXO
Chúng ta sẽ sử dụng một card giao tiếp thoại của Digium TDM400 với 1 module FXS và 1 module FXO và thực hiện các bước sau:
b1. Cài đặt board mạch TDM400P.
b2. Cấu hình tập tin Zaptel.conf.
b3. Cài đặt driver cho mạch giao.
b4. Chạy zttest để kiểm tra các ngắt.
b5. Chạy ztcfg để cấu hình driver.
b6. Cấu hình kênh ZAP trong tập tin zapata.conf.
b7. Load Asterisk.
Bước 1: Cài đặt board mạch TDM400P
TDM400P
Hình 46: TDM400P card
TDM400P chứa các module FXS và FXO. Kết nối các module FXS (S100M - màu xanh) và FXO (Z100M - mày đỏ) đến TDM400P nếu chưa được kết nối. Các module FXS cần có thêm nguồn để cung cấp điện áp rung chuông. Nếu ta sử dụng FXS thì cần thiết kết nối card này trực tiếp đến nguồn điện 12V (giống như ổ cứng). Sử dụng nguồn điện ổn định để không làm hỏng card.
Các module FXO và FXS
FXO module
(S100M - màu đỏ)
FSO module
(X100M - màu xanh)
Hình 47: FXO module (S100M - màu đỏ), FXS Module (X100M - màu xanh)
Bước 2: Cấu hình tập tin zaptel.conf
Tập tin zaptel.conf phải được chỉnh sửa lại để cấu hình zaptel driver. Tập tin zaptel.conf nằm trong thư mục /etc
fxsks=1 ; FXS port, đảm bảo module FXS nằm vị trí số 1.
fxoks=2 ; FXO port
defaultzone=us
loadzone=us
Bước 3: Tải các kernel driver
Bây giờ chúng ta tải các module zaptel và các driver của card kernel tương ứng, ta có bảng tham khảo các driver của Digium:
Card
Driver
Mô tả
TE410P
wct4xxp
4xE1/T1-3.3V PCI
TE405P
wct4xxp
4xE1/T1-5V PCI
TDM400P
wctdm
4 FXS/FXO
T100P
wct1xxp
1 T1
E100P
wctlxxp
1 E1
X100P
wcfxo
1 FXO
Bảng 3: Danh sách tham khảo các driver của Digium
Ta thực hiện các lệnh sau:
# modprobe zaptel
# modprobe wctdm
Bước 4: Sử dụng tiện ích zttest
Một ứng dụng quan trọng là zttest. Nó được sử dụng để kiểm tra các ngắt (interrupt) bị thiếu trong card zaptel. Vấn đề chất lượng âm thanh thường liên quan đến các xung đột (conflict) của các ngắt.
Để kiểm tra card zaptel không chia sẽ ngắt (interrupt) với các card khác ta có thể sử dụng lệnh sau:
# cat /proc/interrupts
Ta có thể kiểm tra số các ngắt bị thiếu bằng cách sử dụng tiện ích zttest đã được biên dịch với các card zaptel.
Bước 5: Sử dụng tiện ích ztcfg để cấu hình driver
Để cấu hình driver cho card zaptel ban đầu ta phải cấu hình tập tin zaptel.conf trước sau đó mới sử dụng các cấu hình này để cấu hình driver zaptel sử dụng lệnh ztcfg.
# ztcfg
Sau khi hoàn tất cấu hình phần cứng, ta có thể thực hiện việc cấu hình Asterisk
Bước 6: cấu hình tập tin zapata.conf
Sau khi cấu hình card zaptel, ta mới chỉ cấu hình cho card thôi nhưng nó còn được sử dụng cho các mục đích khác như định tuyến và SS7. Để sử dụng với Asteirsk ta phải cấu hình các kênh Zapata Astersik. Mỗi kênh trong Asterisk phải được định nghĩa, các kênh SIP được định nghĩa trong tập tin sip.conf, các kênh TDM được định nghĩa trong tập tin zapata.conf. Nó sẽ tạo ra các kênh TDM luận lý để sử dụng trong sơ đồ quay số.
signalling=fxs_ks
group=1
context=incoming
channel => 1 ; Kênh 1 FXS
signalling=fxo_ks
group=2
context=extensions
channel=> 2 ; Kênh 2 FXO
Bước 7: Load Asterisk
# asterisk -r
CLI>restart now
4.6 Cấu hình các thông số trong tổng đài
Ta thực hiện cấu hình các tập tin zapata.conf. sip.conf và extentions.conf
zapata.conf
[channels]
context=incoming
signalling=fxs_ks
group=1
channel => 1
context=extensions
signalling=fxo_ks
group=2
channel => 2
extensions.conf
[globlals]
OPERATOR=SIP/4000
[incoming]
exten=s,1,dial(${OPERATOR},20,tT)
exten=s,n,hangup()
[default]
; Số nội bộ là các số có 4 số bắt đầu từ số 4
exten=>_4XXX,1,dial(SIP/${EXTEN},20,tT)
exten=>_4XXX,n,hangup()
[noihat]
; Bấm số 9 để ra ngoài
exten=>_9.,1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_9.,n,hangup()
[duongdai]
exten=>_90[2-8].,1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_90[2-8].,n,hangup()
[didong]
exten=>_909. 1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_909..,n,hangup()
[dichvu]
exten=>_91[8,9]00.,1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_91[8,9]00.,n,hangup()
[quocte]
exten=>_900.,1,dial(ZAP/g1/${EXTEN:1},20,tT)
exten=>_900.,n,hangup()
[menu]
exten=>s,1,background(mainmenu)
exten=>1,1,goto(sales,s,1)
exten=>2,1,goto(techsupport,s,1)
exten=>3,1,goto(training,s,1)
exten=>i,1,dial(${OPERATOR})
exten=>t,1, dial(${OPERATOR})
[sales]
exten=s,1,dial(SIP/4001,20,tT)
[techsupport]
exten=s,1,dial(SIP/4002,20,tT)
[training]
exten=s,1,dial(SIP/4003,20,tT)
…
sip.conf
[4000]
type=friend
context=default;noihat
context=didong;duongdai
[4001]
type=friend
context=default;noihat
context=didong;duongdai
[4002]
type=friend
context=default;noihat
context=didong
[4003]
type=friend
context=default;noihat
[4004]
type=friend
context=default;noihat
…
4.7 Thiết lập các Client và kiểm tra cuộc gọi
Để kiểm tra cuộc gọi nội bộ dùng softphone ta tiến hành cấu hình các thông số của tổng đài bằng phần mềm X-lite.
+ Cài đặt và khởi động chương trình X-lite.
+ Vào mục SIP Account Settings…
+ Thiết lập các thông số để kết nối một số nội bộ vào trong tổng đài
Hình 48: Thiết lập các thông số X-lite
Các thông số cần thiết lập bao gồm:
User name: là số nội bộ (extension).
Password: là mật khẩu của số nội bộ (secret).
Authorization user name: là số nội bộ (extension).
Domain: là IP của Server cài đặt Asterisk, nếu cùng trong mạng LAN thì IP này là IP của Server Asterisk, nếu cấu hình qua internet thì IP này là một IP WAN mặt ngoài sau khi đã NAT vào trong Server Asterisk nội bộ.
Cài đặt tương tự cho các số khác trong hệ thống để nhận và thực hiện các cuộc gọi.
CHƯƠNG 5: ĐÁNH GIÁ CHUNG VÀ HƯỚNG MỞ CỦA ĐỀ TÀI
5.1 Đánh giá chung
Nhìn chung tổng đài IP PBX Asterisk là một giải pháp cung cấp tổng đài điện thoại khá hoàn hảo, các công ty có mô hình phân bố rộng, địa bàn lớn có thể áp dụng triển khai cho kết quả khá tốt. Sau đây ta đánh giá chung lại các ưu điểm và nhược điểm của tổng đài này.
5.1.1 Ưu điểm
Nền tảng mã nguồn mở chạy trên nền Linux và cộng đồng sử dụng lớn giúp việc hoàn thiện hệ thống tốt hơn trong khi vẫn đảm bảo tính linh hoạt và tự do trong việc phát triển hệ thống.
Môi trường phát triển nhanh chóng và dễ dàng. Asterisk có thể được mở rộng bằng cách sử dụng các ngôn ngữ kịch bản giống như PHP và Perl với các giao diện AMI và AGI. Asterisk là mã nguồn mở và mã nguồn của nó có thể được chỉnh sửa bởi người sử dụng. Mã nguồn được viết hầu hết trên ngôn ngữ lập trình ANSI C.
Xây dựng hệ thống với chi phí thấp.
Giàu tính năng (IVR, ACD, Voicemail…).
Khả năng kết nối trong địa bàn rộng lớn, nhiều nơi khác nhau trên nền mạng IP, mạng riêng hay ngay cả mạng internet.
Cho phép các nhân viên có thể tích hợp Web và Email với Voicemail. Cho phép các nhân viên làm việc di động truy cập vào PBX của công ty từ bất kỳ nơi nào với chỉ một kết nối băng thông rộng hay kết nối VPN.
…
5.1.2 Những điểm hạn chế
Tính ổn định không cao bằng điện thoại truyền thống. Do hệ thống phụ thuộc nhiều vào Server, đường truyền Internet, bị chặn bởi Firewall, hoạt động của NAT địa chỉ mạng... Khi các vấn đề này không được giải quyết một cách hợp lý sẽ sinh ra sự không ổn định trong hoạt động.
Thói quen sử dụng softphone (điện thoại thông qua PC - X-lite) không nhiều, việc sử dụng softphone để gọi điện thoại không tiện lợi bằng điện thoại truyền thống trong khi việc đầu tư IP Phone phải đòi hỏi có mạng Internet và chi phí khá cao cho thiết bị này.
QoS thấp. Việc đánh giá và cải thiện QoS tăng chất lượng của giải pháp đòi hỏi phải xây dựng một hệ thống mạng WAN có chất lượng. Có các đường thuê kênh riêng (Lease line) giữa các chi nhánh làm tăng chi phí vận hành hệ thống.
Nếu các vấn đề trên xuất hiện thì hệ thống IP PBX gặp nhiều trở ngại trong việc sử dụng hiệu quả hệ thống. Thực tế trong khi hoạt động khi hệ thống không đáp ứng đuợc yêu cầu của doanh nghiệp lập tức giải pháp IP PBX gặp nhiều khó khăn và phải bàn lại tính khả thi cũng như tính hiệu quả trong đầu tư.
5.1 Hướng mở của đề tài
Vì thời gian làm luận văn có hạn, cũng như kiến thức về môi trường Linux và tổng đài Asterisk không sâu nên luận văn dừng lại ở mức độ xây dựng một tổng đài, cấu hình và vận hành các chức năng trong tổng đài Asterisk. Khi triển khai thực tế có rất nhiều khó khăn về mặt xử lý kỹ thuật mạng cũng như đảm bảo QoS và bảo mật hệ thống, sửa lỗi trong các cấu hình đặc thù mạng thực tế của từng công ty.
Hướng mở của đề tài là triển khai thành một mạng IP PBX Asterisk trong thực tế, có sửa các lỗi và cơ chế đảm bảo QoS và bảo mật hệ thống. Ngoài ra tổng đài Asterisk còn giúp ta xây dựng nên một trung tâm hỗ trợ khách hàng (Call Center). Đây làm một ứng dụng rất mạnh của tổng đài Asterisk mang lại nhiều lợi ích cho doanh nghiệp trong việc hỗ trợ và phục vụ khách hàng cũng như phát triển một trung tâm bán hàng trực tuyến cho công ty.
Một lần nữa em xin chân thành cảm ơn sự định hướng và chỉ bảo chân tình của Thầy Phạm Đình Nguyên đã hỗ trợ và tạo nhiều điều kiện để em hoàn thành được luận văn này.
TÀI LIỆU THAM KHẢO
+
+
+ Asterisk PBX Configuration Guide - Flavio E. Gonçalves.
+ Asterisk The Future of Telephony - O’Reilly.
+ Trixbox2 Without Tears - Ben Sharif.
+ Call Center Operation - Design, Operation, And Maintenance - 2003 Digital Press.
Các file đính kèm theo tài liệu này:
- Nghiên cứu về hoạt động và cách triển khai tổng đài IP PBX Asterisk.doc