Tải bản đầy đủ (.pdf) (85 trang)

Xây dựng hệ thống call center tiếng việt

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 (1.22 MB, 85 trang )

..

Nguyễn ngọc anh

bộ giáo dục và đào tạo
trường đại học bách khoa hà nội
---------------------------------------

Nguyễn Ngọc Anh

cao học cntt

Xây dựng hệ thống call center tiếng việt

luận văn thạc sĩ công nghệ thông tin

2007 -2009
Hà Nội - 2009


bộ giáo dục và đào tạo
trường đại học bách khoa hà nội
--------------------------------------Nguyễn Ngọc Anh

Xây dựng hệ thống call center tiếng việt

Chuyên ngành : Công Nghệ Thông Tin

luận văn thạc sĩ công nghệ thông tin

người hướng dẫn khoa học :


TS. Hoàng Minh Thøc

Hµ Néi - 2009


Mục lục

lời nói đầu .................................................................................... 2
tóm tắt luận văn ...................................................................................... 3

thuật ngữ ..................................................................................... 5
chương i. Giới thiệu chung ................................................ 7
1.1.

Mục đích triển khai Call Center: ...................................................... 7

1.2.

Các đặc trưng của EasyCC ................................................................ 8

chương ii. phần mềm hệ thống ...................................... 10
2.1. Giới thiệu về IP-PBX .................................................................................10

2.2. Tổng đài Asterisk .................................................................................... 11
2.2.1. Giới thiệu ..................................................................................................11
2.2.2. Kiến trúc Asterisk ..................................................................................13
2.2.3. Cài đặt .......................................................................................................15
2.2.4. Giới thiệu các file cấu hình của Asterisk ........................................33
2.2.5. Nghiên cứu cấu trúc thời gian thực Asterisk ..................................35
2.2.6. Cài đặt Asterisk RealTime ...................................................................35


2.3. giao tiÕp qua ®­êng trun sè ........................................... 41
2.3.1. Giao tiếp trên đường truyền ISDN 30B+D........................................42
2.3.2. Giao tiếp với đường truyền SS7 .........................................................44

Chương iii. Phát triển ứng dụng call center ..... 47
3.1. CÊu tróc tỉng quan ................................................................................. 47
3.2. Giíi thiƯu CodeIgniter PHP Framework ............................................. 47
3.3. Qu¶n lý ng­êi dïng................................................................................. 49
3.4. Module PBX ............................................................................................ 52
3.5. Module Inbound ...................................................................................... 72
3.6. Module Outbound ................................................................................... 75
3.7. Module B¸o c¸o ....................................................................................... 80

kÕt luËn ....................................................................................... 82
tài liệu tham khảo ............................................................... 83


lời nói đầu
Có thể nói, sự ra đời và phát triển của mạng máy tính là một cuộc cách mạng
trong thế kỷ 20, nó đà làm thay đổi hoàn toàn cách thức trao đổi thông tin của nhân
loại. Nếu như trước kia, khi chưa có mạng máy tính, việc trao đổi thông tin với những
người ở xa diễn ra hết sức khó khăn và chủ yếu thông qua con đường thư tín. Thì ngày
nay chỉ với 1 chiếc máy tính kết nối vào mạng Internet, chúng ta có thể tận hưởng được
mọi dịch vụ của mạng máy tính mang lại, chúng ta dễ dàng cập nhật được mọi thông
tin đang diễn ra trên toàn thế giới, chúng ta có thể trò chuyện trực tiếp với những người
ở xa, dễ dàng chia sẻ tài liệu, và thậm trí có thể thưởng thức được những bộ phim, mới
nhất vừa được giới thiệu. Mỗi dịch vụ đều đem lại sự tiện lợi cho con người, một trong
những dịch vụ không thể không nhắc đến đó là dịch vụ VoIP, đây là dịch vụ cho phép
chúng ta truyền lời thoại thông qua môi trường mạng máy tính.

Trong những năm gần đây, cùng với sự phát triển của hạ tầng mạng, dịch vụ VoIP
đà phát triển rất nhanh, nó đang được nhiều quốc gia, công ty khai thác và phát triển.
Các hệ thống tổng đài mềm cũng được phát triển nhằm đáp ứng tốt hơn các khả năng
tích hợp truyền thoại và số liệu của dịch vụ VoIP, một trong những tổng đài rất phổ
biến đó là Asterisk. Nhưng một trong những khó khăn đó là, mỗi một doanh nghiệp khi
muốn xây dựng tổng đài Asterisk lại phải mất thời gian tìm hiểu, nghiên cứu, cấu hình
tổng đài, như vậy thì rất tốn thời gian và tiền của cho doanh nghiệp. Chính vì vậy để
đáp ứng nhu cầu này, tôi đà tập trung nghiên cứu, xây dựng và phát triển luận văn
Xây dựng hệ thống Call Center tiếng việt để đáp ứng các yêu cầu thực tế cho các
doanh nghiệp tại Việt Nam khi muốn ứng dụng các công nghệ kỹ thuật của dịch vụ
VoIP.


Abstract
VoIP is a new technology; it allows voice over IP packet switched network. This
technology has gradually asserted its place beside the conventional telephone
network PSTN, and also dominates the telecommunications device market share
advantage through price and service diversity. Asterisk is software to perform the
function of internal telephone exchange (PBX), which allows the device branch
(extension) to make calls to each other and connect to other telephone systems,
including telephone network regular analog (PSTN) and VoIP. Asterisk full PBX
feature of trade: flow distribution calls, voicemail, talks, interactive (navigation
device) ... Asterisk also supports multiple VoIP protocols such as SIP and H.323,
work stations connection between IP phones and PSTN. In particular, from version
1.2.1 onwards, real-time structure Asterisk Real time Architecture is integrated
within the switchboard to allow managers and customers can configure the script
in general and the Voicemail system in particular that the operator does not need to
reload. Current needs of businesses want to install and use IP as a Call Center to
reduce costs and exploitation and application of the utility of VoIP technology is
better, but they were difficult the process of implementation of this is not their

field of expertise. So businesses often have to look to companies specializing in
this field to ask for advice and they accept to pay a fee just to be able to own a
private IP suit your business , and do not take time to learn to install and repair
every system error occurred. Derived from the actual needs, in the process of
making my projects have focused on research and learn to harness and apply the
operator-based VoIP switchboard Asterisk, to provide Call Center services.
The contents of the thesis is "Developing Call Center Vietnamese" will focus on
research, find out about switchboard Asterisk software, thereby giving direction to
award the construction of a system for a Call Center Business Industry based
switchboard Asterisk software available.


tóm tắt luận văn
VoIP là một công nghệ mới , nó cho phép truyền thoại thông qua mạng chuyển
mạch gói IP. Công nghệ này đang dần khẳng định chỗ đứng của mình bên cạnh mạng
điện thoại PSTN thông thường, và cũng đà chiếm lĩnh được thị phần thoại viễn thông
nhờ ưu thế về giá cả và dịch vụ đa dạng.
Asterisk là phần mềm thực hiện chức năng tổng đài điện thoại nội bộ (PBX), cho
phép các máy điện thoại nhánh (extension) thùc hiƯn cc gäi víi nhau vµ kÕt nèi với
các hệ thống điện thoại khác bao gồm cả mạng điện thoại analog thông thường (PSTN)
và VoIP. Asterisk có đầy đủ tính năng của tổng đài PBX thương mại: phân luồng cuộc
gọi, thư thoại, hội đàm, tương tác (menu thoại)... Asterisk còn hỗ trợ nhiều giao thức
VoIP như SIP và H.323, hoạt động như trạm kết nối giữa các điện thoại IP và mạng
PSTN. Đặc biệt, từ phiên bản 1.2.1 trë ®i, cÊu tróc thêi gian thùc Asterisk Realtime
Architecture ®· được tích hợp ngay trong tổng đài cho phép nhà quản lý và khách hàng
có thể cấu hình các kịch bản nói chung và hệ thống Voicemail của tổng đài nói riêng
mà không cần thiết phải reload.
Hiện nay nhu cầu của các doanh nghiệp muốn cài đặt, sử dụng tổng đài IP dưới
dạng một Call Center để giảm chi phí và khai thác, ứng dụng những tiện ích của công
nghệ VoIP là rất lớn, nhưng họ lại gặp nhiều khó khăn trong quá trình thực hiện do đây

không phải là lĩnh vực chuyên môn của họ. Do đó các doanh nghiệp thường phải tìm
đến các công ty chuyên về lĩnh vực này để xin tư vấn và họ chấp nhận chi trả một
khoản chi phí vừa phải để có thể sở hữu một tổng đài IP riêng phù hợp với doanh
nghiệp của mình, đồng thời không mất thời gian tìm hiểu cài đặt và sửa chữa mỗi khi
hệ thống xảy ra lỗi. Xuất phát từ nhu cầu thực tế, trong quá trình làm luận văn tôi đÃ
tập trung nghiên cứu và tìm hiểu để khai thác, ứng dụng tổng đài VoIP dựa trên nền
tổng đài Asterisk, để cung cấp các dịch vụ Call Center.
Nội dung chính của luận văn là Xây dựng Call Center tiếng Việt sẽ tập trung
nghiên cứu, tìm hiểu về tổng đài mềm Asterisk, qua đó đưa ra các hướng giải chính để
có thể xây dựng một hƯ thèng Call Center cho mét doanh nghiƯp dùa trªn nền tổng đài
mềm Asterisk đà có.


thuật ngữ
STT Từ viết tắt

Từ đầy đủ

1

PSTN

Public Switched Telephone Network

2

SIP

Session Initiation Protocol


3

TCP

Transmisstion Control Protocol

4

IP

Internet Protocol

5

VoIP

Voice over IP

6

PBX

Private Branch Exchange

7

UA

User Agent


8

UAC

User Agent Client

9

UAS

User Agent Server

10

ATM

Asynchronous Transfer Mode

11

B2BUA

Back to Back User Agent

12

IVR

Interactive Voice Response


13

IETF

Internet Engineering Task Force

14

UDP

User Datagram Protocol

15

DNS

Domain Name Service

16

HTTP

Hypertext Transfer protocol

17

SDP

Session Descripsion Protocol


18

RTP

Real Time Protocol

19

RTCP

Real Time Control Protocol

20

DHCP

Dianmic Host Configuaration Protocol

21

CPL

Call Process Language

22

ACK

Acknowledgment


23

OSI

Open Systems Interconnection

24

AVT

Audio/Video/Transport

25

URL

Uniform Resource Locator

26

URI

Uniform Resource Identifier

27

IPTEL

IP Telephony


28

TLS

Transmission Layer Security

29

NAT

Network Address Translation

30

AGI

Asterisk Gateway Interface


31

ICMP

Internet Control Message Protocol

32

ARP

Address Resolution Protocol


33

MMUSIC

Multiparty Multimedia Session Control


chương i. Giới thiệu chung
Call Center là tên gọi chung cho các giải pháp tập trung hóa việc điều phối,
quản lý và cung cấp dịch vụ gia tăng cho liên lạc điện thoại của một tổ chức. Sự
phát triển của CNTT với các công nghệ tích hợp điện thoại - máy tính đà làm các
Call Center ngày càng thông minh hơn, thay thế con người trong nhiều công
việc.
Cùng với sự phát triển nhanh chóng và mạnh mẽ của ngành công nghệ thông
tin và điện tử viễn thông, cùng với đó là nhu cầu chia sẻ dữ liệu, thông tin lẫn
nhau ngày càng tăng, bên trong doanh nghiệp tồn tại thêm mét hƯ thèng m¹ng
míi song song tån t¹i víi m¹ng điện thoại thông thường, đó là mạng chuyển
mạch gói (mạng LAN, Interntet v.v). Với những ưu điểm vượt trội về sự mềm
dẻo và hiệu suất, mạng chuyển mạch gói đang dần thay thế mạng chuyển mạch
kênh, sự ra đời của công nghệ VoIP càng khẳng định thêm xu hướng này.
Các Call Center thường được phát triển dựa trên cơ sở một PBX hoặc
PAPBX có khả năng kết nối với máy tính, phát triển phần mềm để đưa thêm dịch
vụ, chức năng xử lý tự động hay quản lý theo yêu cầu. Để xây dựng một Call
Center, cần phải phát triển các phần mềm quản lý thiết bị, điều khiển định tuyến,
chuyển mạch và cung cấp các dịch vụ theo yêu cầu.
Asterisk là một phần mềm nguồn mở nổi tiếng, được đóng góp, xây dựng và
phát triển bởi cộng đồng. Với rất nhiều tính năng cơ bản, như Voicemail,
Conference, định tuyến cuộc gọi và hỗ trợ nhiều giao thức VoIP, nhiều phần
cứng giao tiếp PSTN, hiện nay Asterisk đà được sử dụng rộng rÃi để thay thế từ

các PBX truyền thống cho đến các hệ thống VoIP lớn. Dĩ nhiên các Call Center
xây dựng trên nền Asterisk cũng ngày càng nhiều, nhờ vào sự linh hoạt và khả
năng mở rộng của nó.

1.1. Mục đích triển khai Call Center:
Cần phương tiện để cung cấp các dịch vụ gia tăng, như dịch vụ tư vấn, giải
trí qua đầu số 1800-1900, dịch vụ khách hàng tự phục vụ (IVR), dịch vụ
Call Center.


Cần cải thiện khả năng quản lý hệ thống điện thoại trong tổ chức để giảm
chi phí, tăng hiệu quả sử dụng nhân lục, tài nguyên, làm cơ sở cho việc ra
quyết định trong điều hành, sản xuất, kinh doanh.
Muốn đem lại khả năng phục vụ khách hàng mọi lúc, mọi nơi. Tăng độ
hài lòng của khách hàng và giảm chi phí.
Tuy nhiên, các yếu tố như chi phí đầu tư lớn, quản trị phức tạp, hạn chế về
kinh nghiệm và kiến thức căn bản, đặc biệt với những công ty, doanh nghiệp
không chuyên về lĩnh vực công nghệ thông tin và viễn thông, gặp nhiều khó
khăn trong quá trình thiết lập tổng đài Asterisk cho doanh nghiệp của mình, và
khi hệ thống xảy ra trục trặc hay lỗi thì thường không biết cách sửa chữa, sự đáp
ứng của hệ thống kém trước các yêu cầu thay đổi làm cho hiện tại các Call
Center hầu như chỉ được triển khai tại các tổ chức có tiềm lực mạnh về tài chính
và nhân lực chuyên môn.
Hệ thống EasyCC được phát triển dựa trên nền tảng Asterisk. Mục đích
chính của hệ thống là mang lại khả năng quản lý tập trung, cung cấp dịch vụ
khách hàng thông qua hệ thống điện thoại có khả năng mở rộng được, có tính
mềm dẻo linh hoạt, dễ sử dụng, quản lý và sẵn sàng đáp ứng các yêu cầu đa dạng
với chi phí thÊp, hiƯu qu¶ cao. EasyCC cho phÐp tỉ chøc, doanh nghiệp có thể dễ
dàng khai thác và sử dụng các tính năng chăm sóc khách hàng, các chiến dịch
tiếp thị, và xử lý thoại nội bộ.

EasyCC có thể được sử dụng như một hệ thống Call Center, một tổng đài
nội bộ PBX, tổng đài dịch vụ, chăm sóc khách hàng hay Trung tâm đường dây
nóng, hỗ trợ khách hàng.

1.2. Các đặc trưng của EasyCC
Hỗ trợ nhiều tính năng cơ bản cũng như cao cấp về công nghệ thoại: Ghi
âm, Hội đàm, ACD, IVR.
Mềm dẻo, linh hoạt bằng cách kết hợp các tính năng sẵn có, và tổ chức lại
để tạo thành module mới. Hệ thống xây dựng giao diện quản lý trên nền
Web, giúp người vận hành có thể quản lý tập trung, và người khai thác có
thể truy cập trực tiếp và sử dụng thông qua mạng LAN hay VPN cđa c«ng
ty.


Xây dựng dưới dạng module để có thể mở rộng, tổng hợp lại, đóng gói lại
thành các package và chuyển giao cho tổ chức, công ty hay cá nhân khác.
Hỗ trợ tiếng Việt, thân thiện với người sử dơng.
C¸c module chÝnh cđa EasyCC:
 CorePBX: C¸c module chÝnh, cung cấp các tính năng được các thành
phần khác của hệ thống sử dụng.
# Conference : Hội đàm. Cho phép nhiều ng­êi tham gia nãi chun
cïng mét lóc.
# Voicemail : Hép thư thoại. Cho phép ghi âm lời nhắn và email tới cho
1 điện thoại viên của hệ thống.
# Extension : Gọi trực tiếp tới soft dialer của một điện thoại viên trong
hệ thống.
# Tra cứu thông tin : Cho phép tự tạo các dịch vụ Tra cứu thông tin,
Danh bạ, Tra điểm thi, Đọc kết quả.
Inbound : Xử lý chiều gọi vào.
# ACD : phân phối cuộc gọi tự động. Mỗi cuộc gọi đến sẽ được đẩy đến

người vận hành theo các luật tùy chọn, dựa trên các tiêu chÝ nh­ thêi
gian lµm viƯc, thêi gian chê, kinh nghiƯm, quay vòng, hay đối tượng
khách hàng.
# CID based Routing : Định tuyến theo số chủ gọi. Tự động kết nối đến
CSDL của CRM để lấy thông tin về khách hàng gọi tới, dựa trên số
điện thoại mà khách hàng dùng ®Ĩ gäi tíi hƯ thèng.
# IVR : Cung cÊp giao diện xây dựng dịch vụ tương tác thoại, để thực
hiện tự động việc lấy số liệu, lấy yêu cầu từ phía khách hàng, cung cấp
các bản tin, các thông báo hay cho phép khách hàng ghi âm yêu cầu
của mình.
Outbound : Thực hiện các cuộc gọi tự động ra ngoài, và kết nối tới các
thành phần trong module CorePBX.
Report : Tạo các form báo cáo, thống kê để người vận hành có thể xây
dựng, điều chỉnh hay vận hành hệ thống hiệu quả hơn.


chương ii. phần mềm hệ thống
tổng đài asterisk
Trong một mạng điện thoại nội bộ bình thường, tổng đài là một thành phần
không thể thiếu. Nó cung cấp các ứng dụng để điều khiển cuộc gọi, các chức
năng giám sát, phân luồng cuộc gọi và nhiều tiện ích khác, giúp cho nhà quản lý
mạng dễ dàng thao tác và quản lý mạng điện thoại của mình. Tương tự như vậy,
trong mạng thoại sử dụng công nghệ VoIP thì tổng đài cũng là một thành phần
nhất thiết phải có. Một trong những tổng đài VoIP nổi tiếng đó là tổng đài mÃ
nguồn mở Asterisk. ở chương này tôi tập trung vào nghiên cứu, xây dựng, cấu
hình các chức năng chính của tổng ®µi Asterisk phơ vơ cho mét doanh nghiƯp.
2.1. Giíi thiƯu về IP-PBX

Tại các doanh nghiệp, nhu cầu sử dụng dịch vụ liên lạc thoại nội bộ với chi phí
rẻ, kết hợp với các dịch vụ gia tăng trên nền giao thức IP đang ngày càng tăng.

Các tổng đài IP-PBX ra đời nhằm đáp ứng nhu cầu này. Ngoài việc có được chức
năng của các tổng đài chuyển mạch (PBX Private Branch Exchange) trun
thèng, IP-PBX cßn më réng rÊt nhiỊu các dịch vụ thoại và số liệu trên nền IP,
tăng khả năng giao tiếp ra ngoài của tổng đài với các mạng, dịch vụ đa dạng,
phong phú hơn. So với tổng đài PSTN truyền thống, tổng đài IP-PBX có nhiều ưu
điểm hơn như:
Khả năng quản lý và bảo dưỡng dễ dàng.
Khả năng kết nối từ xa, khả năng di động.
Kết hợp thoại/dữ liệu tạo ra ứng dụng mới.
Dễ dàng phát triển các dịch vụ mới do cấu trúc mở và các giao diện chuẩn
Dễ sử dụng do được hỗ trợ bở phần mềm và giao diện đồ họa GUI
Thông tin hợp nhất..
Tổng đài IP-PBX đặc biệt hữu dụng khi triển khai trong doanh nghiệp vừa và
nhỏ, nó không chỉ giúp cho các doanh nghiệp này giảm bớt được chi phí, mà còn
giúp họ dễ dàng hơn trong việc quản lý tài nguyên, dữ liệu, và trao đổi thông tin
giữa các thành viên trong doanh nghiệp dễ dàng hơn.


Kiến trúc của một tổng đài IP-PBX
Hệ thống tổng đài IP-PBX tiêu biểu sẽ bao gồm một hoặc nhiều kiểu máy chủ
thiết bị điện thoại để hỗ trợ các điểm cuối của các phiên truyền thông vât lý do
khách hàng sử dụng. Tổng đài IP-PBX cũng sẽ bao gồm một số các máy chủ
thiết bị ảo mà thực hiện các đặc tính như thoại, nhắn tin hợp nhất. Hệ thống giao

Hình 2.1: Kiến trúc cơ bản của một IP-PBX

tiếp ra ngoài thông qua các máy chủ thiết bị đường dây.
Phần phức tạp nhất trong một tổng đài IP-PBX chính là hệ thống phần mềm.
Chúng được xây dựng và hoạt động sử dụng kiến trúc tính toán phân tán tiên
tiến. Các hệ thống này áp dụng các chuẩn viễn thông và tính toán mở rộng để tạo

ra nền tảng đặc tính dịch vụ và chuyển mạch tin cậy.

2.2. Tổng đài Asterisk
Để có thể hiểu sâu hơn về kiến trúc và chức năng của một tổng đài IP-PBX cơ
bản, phần này tôi tập trung vào nghiên cứu, tìm hiểu một tổng đài IP-PBX có
sẵn, đó là tổng đài mở Asterisk.
2.2.1. Giới thiệu

Asterisk là một tổng đài có mà nguồn mở chạy trên nền Linux, nó hỗ trợ nhiều
giao thức như SIP, H.323, IAX Tuy nhiên trong quá trình làm luận văn tôi tập
chung nghiên cứu tổng đài Asterisk với giao thức SIP.


Asterisk cùc kú linh ho¹t, cã thĨ kÕt nèi víi mạng điện thoại bên ngoài qua
đường tương tự (analog) hay số (digital), và có thể phân luồng cuộc gọi nội bộ
qua cáp điện thoại truyền thống hay qua mạng IP. Asterisk có thể dùng như là
một chiếc cầu nối tổng đài PBX truyền thống với mạng viễn thông hiện đại. Ta
có thể đặt nó trước PBX như là một gateway hoặc có thể đặt sau PBX như là một
Server ứng dụng ngoại vi
Hệ thống Asterisk có thể dễ dàng kết nối với Internet. Điện thoại IP thì có thể
kết nối trực tiếp với mạng Internet, còn điện thoại tương tự hay máy Fax thì cần
có một thiết bị tương thích VoIP. Nếu hệ thống Asterisk được kết nối với
Internet thì bất cứ thiết bị IP nào kết nối Internet cũng cã thĨ gäi tíi Asterisk.
Chóng ta cã thĨ gäi tíi bất cứ thiết bị thoại nào thuộc hệ thống Asterisk mà
không cần biết điện thoại đó đang ở đâu. Các kết nối này đảm bảo bí mật và các
người dùng không xác thực sẽ bị ngăn chặn.
Phần mềm Asterisk được thiết kế dạng môđun. Các thành phần chức năng được
thiết kế thành từng môđun riêng biệt và tách rời với phần chuyển mạch lõi, điều
này tạo khả năng dễ điều chỉnh và mở rộng cao. Một trong những "điểm son"
của Asterisk là phần quản lý extension. Từng bước của cuộc gọi được định nghĩa

như một ứng dụng. Quay số là một ứng dụng; trả lời, phát lại, thư thoại... là
những ví dụ ứng dụng khác. Ta có thể tạo kịch bản thực hiện gọi ứng dụng bất
kỳ trên kênh bất kú. VÝ dơ, cã thĨ thiÕt lËp mét sè extension được đổ chuông
cùng lúc ở 2 kênh (có thể nối đến 2 máy điện thoại: 1 analog và 1 digital) trước
khi chuyển cuộc gọi đến điện thoại di động, và sau đó chuyển qua hệ thống thư
thoại


Hình 2.2: Mô hình cuộc gọi VoIP sử dụng tổng đài Asterisk

2.2.2. Kiến trúc Asterisk

Trước khi đi sâu vào nghiên cứu cấu trúc Asterisk, ta sẽ phân tích các chức năng
chính của Asterisk như sau:
Thứ nhất: Asterisk là thiết bị trung gian để kết nối Internet và công nghệ thoại
với Internet và ứng dụng thoại. Các ứng dụng của Asterisk có thể kết nối bất cứ
loại điện thoại nào, bất cứ loại đường dây thoại hay loại gói thoại nào với các
giao diện và dịch vụ. Asterisk có thể dễ dµng co d·n tïy theo hƯ thèng lín hay
nhá.
Thø hai: Asterisk hỗ trợ mọi khả năng của công nghệ thoại gåm: VoIP, SIP,
H.323, IAX, BGCP… Asterisk cã thĨ vËn hµnh với hầu hết mọi thiết bị thoại
chuẩn và hỗ trợ các công nghệ thoại truyền thống như ISDN, T1, E1 Nã còng


thùc hiƯn rÊt nhiỊu øng dơng dÞch vơ nh­ Voicemail, IVR, chuyển tiếp cuộc gọi

Thứ ba: Asterisk được kết nối với mạng nội bộ có thể điều khiển các điện thoại
kết nối với mạng nội bộ đó, các điện thoài này cũng có thể gọi đến nhau thông
qua Asterisk Server. Asterisk Server có thể điều khiển các điện thoại kết nối với
mạng khác hay với Internet thậm chí thông qua Firewall.

Thứ tư: Một cuộc gọi có thể được chuyển từ Asterisk Server này sang Asterisk
Server khác và cũng có thể chuyển sang các mạng khác như PSTN
Từ những chức năng chính trên, trong quá trình tìm hiểu thiết kết Asterisk, tác
giả đà chia ra làm nhiều khối chức năng khác nhau. Mỗi khối có một chức năng
cơ bản, giải quyết những nhiệm vụ riêng. Tất cả các khối đó khi kết hợp lại sẽ
hình thành một tổng đài IP-PBX.

Tro
ng
hìn
h
vẽ
trên
,
Ast
eris
k
gồ
m
Hình 2.3: Các khối cơ bản của Asterisk-PBX

các

công cụ thực hiện các chức năng nhất định. Khi Asterik khởi động, Dynamic
Module Loader sẽ tải và khởi động các drivers. Các driver sẽ cung cấp các bộ
phận điều khiển kênh, dạng file, bản ghi chi tiết các cuộc gọi, mà hóa, và các
ứng dơng kÌm theo.
Bé phËn chun m¹ch lâi( Switching Core) nhËn các cuộc gọi từ các interface.
Chuyển mạch lõi sẽ điều khiển, kiểm soát các cuộc gọi tùy theo chỉ thị trong



dialplan. Chuyển mạch lõi sử dụng Appplication Launcher để rung chuông, kết
nối tới voicemail, hoặc gọi ra trung kế.
Chuyển mạch lõi gồm có khối Schedule và khối quản lí vào ra( I/O manager),
các khối này liên quan đến các driver và các ứng dụng. Nói chung sự mềm dẻo
của Asterisk có được từ các ứng dụng, các loại mà hóa, các bộ phận điều khiển
kênh (channel drivers), các file định dạng, và các thiết bị kết hợp với các giao
diện chương trình
2.2.3. Cài đặt

Việc cài đặt Asterisk khá dễ dàng, nhưng một điều cần chú ý trước khi cài
Asterisk đó là Asterisk là phần mềm mà nguồn mở chạy trên nền Linux, nên yêu
cầu cơ bản trước hết là máy phải chạy Linux, hiện nay có rất nhiều công ty đưa
ra các bản Linux rất ổn định như: CentOS, RedHat, Ubuntu Dưới đây tôi xin
trình bày cách cài đặt Asterisk tõ source code trªn nỊn Debian Linux.
Asterisk sư dơng 3 gói phần mềm chính: chương trình chính (Asterisk), các
driver điện thoại DAHDI và các thư viện PRI (libpri). Nếu đơn thuần chỉ là mạng
VoIP thì yêu cần thực duy nhất cần thiết là gói tin Asterisk. Các driver DAHDI
sẽ được yêu cầu nếu ta đang sử dụng phần cứng tương tự hoặc số. Thư viện
Libpri là tuỳ chọn mang tính chất kỹ thuật trừ phi ta đang sử dụng các giao diện
ISDN PRI.
Một gói tin khác nên cài đặt là asterisk-sounds. Trong khi Asterisk đi cùng với
một vài dấu nhắc ©m thanh trong sù ph©n phèi nguån chÝnh, th× gãi tin asterisksounds sÏ cho ta thËm chÝ nhiỊu h¬n thÕ. Nếu muốn mở rộng một số lời nhắc
được ghi lại một cách chuyên nghiệp để sử dụng cho hệ thống thì gói tin này là
cần thiết
DAHDI là tên gọi mới của module Zaptel trên Asterisk 1.4.x, để điều khiển các
card Digium (dành cho cổng FXO, FXS và E1/T1). Để cài đặt DAHDI, ta phải
có gói header của nhân linux đang dïng, cïng víi gãi build-essential.
$ apt-get install linux-headers-`uname -r` build-essential
$ wget />$ tar xzvf dahdi-linux-complete-current.tar.gz

$ cd dahdi-linux-xxxx
$ make && make install


Để cài đặt Asterisk, ta phải cài thêm gói libncurses-dev, libeditline, libnewt
$ apt-get install libncurses-dev libeditline0 libeditline-dev libeditdev libnewt-dev

Ngoµi ra, ta cần có thêm các gói sau để có thêm lệnh SendFAX và ReceiveFAX:
$

apt-get install libspandsp-dev

Để có codec SpeeX, cài thêm 2 gói :
$

apt-get install libspeex-dev libspeexdsp-dev

Còn để có thể ghi âm hay đọc định dạng Ogg Vorbis định dạng mở thay thế
cho MP3, ta phải cài thêm gói libvorbis-dev nữa:
$

apt-get install libvorbis-dev

Cuối cùng là thực hiện biên dịch và cài đặt.
$

wget />
1.6.1-current.tar.gz
$


tar xzvf asterisk-1.6.2-current.tar.gz

$

cd asterisk-1.6.2-xxx

Để Asterisk thực sự hỗ trợ tiếng Việt, ta còn phải sửa lại code của một số module
đọc số và ứng dụng voicemail cho Asterisk. Dưới đây là nội dung bản patch dành
cho Asterisk 1.6.2.
--- asterisk-1.6.2.0-rc6/main/say.c

2009-10-02 07:07:43.000000000

+0700
+++ asterisk-vi/asterisk-1.6.2.0~rc2/main/say.c

2009-11-22

03:08:54.665320172 +0700
@@ -349,12 +349,14 @@
static int ast_say_number_full_ka(struct ast_channel *chan, int num,
const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd);
static int ast_say_number_full_hu(struct ast_channel *chan, int num,
const char *ints, const char *language, int audiofd, int ctrlfd);
static int ast_say_number_full_th(struct ast_channel *chan, int num,
const char *ints, const char *language, int audiofd, int ctrlfd);
+static int ast_say_number_full_vi(struct ast_channel *chan, int num,
const char *ints, const char *language, int audiofd, int ctrlfd);


/* Forward declarations of language specific variants of
ast_say_enumeration_full */
static int ast_say_enumeration_full_en(struct ast_channel *chan, int
num, const char *ints, const char *language, int audiofd, int ctrlfd);
static int ast_say_enumeration_full_da(struct ast_channel *chan, int
num, const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd);


static int ast_say_enumeration_full_de(struct ast_channel *chan, int
num, const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd);
static int ast_say_enumeration_full_he(struct ast_channel *chan, int
num, const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd);
+static int ast_say_enumeration_full_vi(struct ast_channel *chan, int
num, const char *ints, const char *language, int audiofd, int ctrlfd);

/* Forward declarations of ast_say_date, ast_say_datetime and
ast_say_time functions */
static int ast_say_date_en(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
@@ -368,6 +370,7 @@
static int ast_say_date_hu(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
static int ast_say_date_th(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
static int ast_say_date_he(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
+/*static int ast_say_date_vi(struct ast_channel *chan, time_t t,

const char *ints, const char *lang);*/

static int ast_say_date_with_format_en(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);
static int ast_say_date_with_format_da(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);
@@ -382,6 +385,7 @@
static int ast_say_date_with_format_zh(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);
static int ast_say_date_with_format_gr(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);
static int ast_say_date_with_format_th(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);
+static int ast_say_date_with_format_vi(struct ast_channel *chan,
time_t t, const char *ints, const char *lang, const char *format,
const char *tzone);

static int ast_say_time_en(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);


static int ast_say_time_de(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
@@ -395,6 +399,7 @@
static int ast_say_time_hu(struct ast_channel *chan, time_t t, const

char *ints, const char *lang);
static int ast_say_time_th(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
static int ast_say_time_he(struct ast_channel *chan, time_t t, const
char *ints, const char *lang);
+/*static int ast_say_time_vi(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);*/

static int ast_say_datetime_en(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);
static int ast_say_datetime_de(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);
@@ -408,12 +413,14 @@
static int ast_say_datetime_hu(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);
static int ast_say_datetime_th(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);
static int ast_say_datetime_he(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);
+/*static int ast_say_datetime_vi(struct ast_channel *chan, time_t t,
const char *ints, const char *lang);*/

static int ast_say_datetime_from_now_en(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);
static int ast_say_datetime_from_now_fr(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);
static int ast_say_datetime_from_now_pt(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);
static int ast_say_datetime_from_now_ka(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);

static int ast_say_datetime_from_now_he(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);
+/*static int ast_say_datetime_from_now_vi(struct ast_channel *chan,
time_t t, const char *ints, const char *lang);*/

static int wait_file(struct ast_channel *chan, const char *ints,
const char *file, const char *lang)
{
@@ -493,6 +500,8 @@
return ast_say_number_full_zh(chan, num, ints, language,
audiofd, ctrlfd);


} else if (!strncasecmp(language, "zh", 2)) { /* Taiwanese / Chinese
syntax */
return ast_say_number_full_zh(chan, num, ints, language, audiofd,
ctrlfd);
+ } else if (!strncasecmp(language, "vi", 2)) { /* Vietnamese syntax */
+

return ast_say_number_full_vi(chan, num, ints, language, audiofd,

ctrlfd);
}

/* Default to english */
@@ -2548,6 +2557,101 @@
return res;
}


+/*! \brief

ast_say_number_full_vi: Vietnamese syntax */

+static int ast_say_number_full_vi(struct ast_channel *chan, int num,
const char *ints, const char *language, int audiofd, int ctrlfd)
+{
+ int res = 0;
+ int playh = 0;
+ int playoh = 0;
+ int playohz = 0;
+ int playz = 0;
+ int playl = 0;
+ char fn[256] = "";
+ if (!num)
+

return ast_say_digits_full(chan, 0, ints, language, audiofd,

ctrlfd);
+
+

while (!res && (num || playh)) {
if (num < 0) {

+

ast_copy_string(fn, "digits/minus", sizeof(fn));


+

if ( num > INT_MIN ) {

+

num = -num;

+

} else {

+
+
+

num = 0;
}
} else if (playl) {

+

snprintf(fn, sizeof(fn), "digits/%da", num);

+

playl = 0;

+


num = 0;

+

} else if (playh) {

+

ast_copy_string(fn, "digits/hundred", sizeof(fn));

+

playh = 0;

+
+

} else if (playz) {
ast_copy_string(fn, "digits/odd", sizeof(fn));


+
+

playz = 0;
} else if (playoh) {

+

ast_copy_string(fn, "digits/0-hundred", sizeof(fn));


+

playoh = 0;

+

} else if (playohz) {

+

ast_copy_string(fn, "digits/0-hundred-odd", sizeof(fn));

+

playohz = 0;

+

} else

if (num < 20) {

+

snprintf(fn, sizeof(fn), "digits/%d", num);

+

num = 0;


+

} else

if (num < 100) {

+

snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);

+

num %= 10;

+

if ((num == 5) || (num == 4) || (num == 1)) playl++;

+
+

} else {
if (num < 1000){

+

snprintf(fn, sizeof(fn), "digits/%d", (num/100));

+


num %= 100;

+

if (num && (num < 10)){

+

playz ++;

+

playh++;

+

} else {

+
+
+
+
+

playh++;
}
} else {
if (num < 1000000) { /* 1,000,000 */
res = ast_say_number_full_vi(chan, num /


1000, ints, language, audiofd, ctrlfd);
+

if (res)

+

return res;

+

num %= 1000;

+

snprintf(fn, sizeof(fn), "digits/thousand");

+

if (num && (num < 10)){

+

playohz ++;

+

} else if (num && (num < 100)){


+

playoh ++;

+

} else {

+

playh = 0;

+

playohz = 0;

+

playoh = 0;

+
+
+
+

}
} else {
if (num < 1000000000) { /* 1,000,000,000 */
res = ast_say_number_full_vi(chan, num



/ 1000000, ints, language, audiofd, ctrlfd);
+

if (res)

+

return res;

+

num %= 1000000;

+

ast_copy_string(fn, "digits/million",

sizeof(fn));
+

} else {

+

res = -1;

+

}


+

}

+

}

+

}

+

if (!res) {

+

if (!ast_streamfile(chan, fn, language)) {

+

if ((audiofd

+

> -1) && (ctrlfd > -1))

res = ast_waitstream_full(chan, ints,


audiofd, ctrlfd);
+

else

+

res = ast_waitstream(chan, ints);

+

}

+

ast_stopstream(chan);

+

}

+}
+ return res;
+}
+
/*! \brief

ast_say_enumeration_full: call language-specific


functions */
/* Called from AGI */
static int say_enumeration_full(struct ast_channel *chan, int num,
const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd)
@@ -2560,6 +2664,8 @@
return ast_say_enumeration_full_de(chan, num, ints, language,
options, audiofd, ctrlfd);
} else if (!strncasecmp(language, "he", 2)) { /* Hebrew syntax */
return ast_say_enumeration_full_he(chan, num, ints, language,
options, audiofd, ctrlfd);
+ } else if (!strncasecmp(language, "vi", 2)) { /* Vietnamese syntax */
+

return ast_say_enumeration_full_vi(chan, num, ints, language,

audiofd, ctrlfd);
}

/* Default to english */
@@ -2665,6 +2771,25 @@


return res;
}

+static int ast_say_enumeration_full_vi(struct ast_channel *chan, int
num, const char *ints, const char *language, int audiofd, int ctrlfd)
+{
+ int res = 0;

+ char fn[256] = "";
+ ast_copy_string(fn, "digits/h", sizeof(fn));
+ if (!res) {
+

if (!ast_streamfile(chan, fn, language)) {

+

if ((audiofd > -1) && (ctrlfd > -1)) {

+

res = ast_waitstream_full(chan, ints, audiofd,

ctrlfd);
+

} else {

+

res = ast_waitstream(chan, ints);

+

}

+


}

+

ast_stopstream(chan);

+}
+
+ return ast_say_number_full_vi(chan, num, ints, language, audiofd,
ctrlfd);
+}
+
/*! \brief

ast_say_enumeration_full_da: Danish syntax */

static int ast_say_enumeration_full_da(struct ast_channel *chan, int
num, const char *ints, const char *language, const char *options, int
audiofd, int ctrlfd)
{
@@ -3470,6 +3595,8 @@
return ast_say_date_with_format_zh(chan, t, ints, lang, format,
tzone);
} else if (!strncasecmp(lang, "zh", 2)) { /* Taiwanese / Chinese
syntax */
return ast_say_date_with_format_zh(chan, t, ints, lang, format,
tzone);
+ } else if (!strncasecmp(lang, "vi", 2)) { /* Vietnamese syntax */
+


return ast_say_date_with_format_vi(chan, t, ints, lang, format,

tzone);
}

/* Default to English */
@@ -4296,6 +4423,222 @@
return res;


}

+/* Vietnamese syntax */
+int ast_say_date_with_format_vi(struct ast_channel *chan, time_t t,
const char *ints, const char *lang, const char *format, const char
*tzone)
+{
+ struct timeval when = { t, 0 };
+ struct ast_tm tm;
+ int res=0, offset, sndoffset;
+ char sndfile[256], nextmsg[256];
+
+ if (format == NULL)
+

format = "A 'digits/day' eB 'digits/year' Y 'digits/at' k

'hours' M 'minutes' p";
+
+ ast_localtime(&when, &tm, tzone);

+
+ for (offset=0 ; format[offset] != '\0' ; offset++) {
+

ast_debug(1, "Parsing %c (offset %d) in %s\n", format[offset],

offset, format);
+

switch (format[offset]) {

+

/* NOTE:

if you add more options here, please try to be

consistent with strftime(3) */
+

case '\'':

+

/* Literal name of a sound file */

+

sndoffset=0;


+

for (sndoffset=0 ; (format[++offset] != '\'') &&

(sndoffset < 256) ; sndoffset++)
+

sndfile[sndoffset] = format[offset];

+

sndfile[sndoffset] = '\0';

+

res = wait_file(chan, ints, sndfile, lang);

+

break;

+

case 'A':

+

case 'a':

+


/* Sunday - Saturday */

+

snprintf(nextmsg, sizeof(nextmsg), "digits/day-%d",

tm.tm_wday);
+

res = wait_file(chan, ints, nextmsg, lang);

+

break;

+

case 'B':

+

case 'b':

+

case 'h':

+


/* January - December */

+

snprintf(nextmsg, sizeof(nextmsg), "digits/mon-%d",


×