hoàn toàn có thể thay đổi phù hợp 
với ngữ cảnh sử dụng, không nhất thiết phải sử dụng thông điệp mặc định . 
Cấu hình chức năng voicemail 
Sau đây là các bƣớc xây dựng hệ thống Voicemail 
Tạo hộp thƣ có tên là [hopthu] trong tập tin voicemail.conf : 
[hopthu] 
3003=>1234,hai,
[email protected]. 
Trong tập tin sip.conf khai báo nhƣ sau: 
[3003] 
type=friend 
username=3003 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 60 
Chương III : Các mô hình ứng dụng và cấu hình hoạt động cho Asterisk 
secret=121212 
host=dynamic 
context=testhopmail 
mailbox=3003@hopthu. 
Trong tập tin extensions.conf khai báo nhƣ sau: 
[testhopmail] 
exten => 3003,1,Dial(SIP|3003,45) 
exten => 3003,2,VoiceMail(u3003@hopthu) ; nếu không trả lời thì chuyển 
đến hộp thƣ thoại 
exten =>3003,102,VoiceMail(b3003@hopthu) ; ứng dụng Dial() gởi cuộc 
gọi đến priority n+101 nếu đƣờng dây bận. 
 Kiểm tra Voicemail: 
Ứng dụng VoicemailMain() quản lí các user của PBX để truy cập vào 
voicemail của họ. 
Ví dụ: 
exten => 500,1,VoiceMailMan() 
Extension 500 đƣa đến hệ thống voicemail.Trong trƣờng hợp này, hệ thống 
sẽ nhắc user đƣa vào số của mailbox và password, nếu giá trị đƣa vào hợp lệ, user 
sẽ nghe đƣợc nội dung của mailbox đó . 
3.10.4 Nhạc chờ (Music On Hold MOH) 
Tính năng MOH của Asterisk với nhiều ứng dụng thực tế rất thiết thực, một 
số ứng dụng tiêu biểu nhƣ trong khi giử máy để gặp ngƣời khác, thuê bao có thể 
nghe âm nhạc giải trí để quên đi thời gian chờ đợi, khi chờ trả lời cuộc gọi thuê bao 
sẽ nghe âm nhạc thay vì hồi âm chuông, hoặc phát ra một thông điệp thông báo cho 
một tác vụ nào đó. 
Cấu hình tính năng MOH 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 61 
Chương III : Các mô hình ứng dụng và cấu hình hoạt động cho Asterisk 
Chép toàn bộ tập tin nhạc vào thƣ mục mặt định /var/lib/asterisk/mohmp3 
.Sau đó khai báo trong tập tin cấu hình /etc/asterisk/musiconhold.conf với nội dung: 
[default] 
mode=files 
directory=/var/lib/asterisk/mohmp3 
random=yes 
Nếu random=no thì tất cả các tập tin âm thanh trong thƣ mục mohmp3 sẽ 
thực hiện theo thứ tự. 
Nếu random=yes sẽ thực hiện một tập tin âm thanh ngẫu nhiên trong thƣ 
mục. Sau khi cấu hình xong chúng ta có thể test bằng cách cấu hình kế hoạch quay 
số trong tập tin /etc/asterisk/extensions.conf nhƣ sau : 
;các dòng này phải đƣợc đặt cùng ngữ cảnh với các thuê bao 
exten => 9000,1,Answer() 
exten => 9000,n,SetMusicOnHold(default) 
exten => 9000,n,WaitMusicOnHold(15) 
exten => 9000,n,Hangup() 
Khi thuê bao quay số 9000 hệ thống sẽ trả lời sau đó phát ra một bài nhạc 
ngẫu nhiên trong thƣ mục default, trong vòng 15s sau đó gác máy 
 Chúng ta có thể tạo ra một lớp thƣ mục khác với lớp default sau đó chép tất 
cả các tập tin âm nhạc vào thƣ mục này và đồng thời khai báo trong tập tin cấu hình 
/etc/asterisk/musiconhold.conf thì chúng ta có thể sử dụng chức năng MOH. 
Sau đây là quá trình thực hiện : 
Tạo thƣ mục mới 
#mkdir /var/lib/asterisk/mohmp3/newclass 
Khai báo tập tin cấu hình /etc/astersik/musiconhold.conf 
[newclass] 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 62 
Chương III : Các mô hình ứng dụng và cấu hình hoạt động cho Asterisk 
mode=files 
directory=/var/lib/asterisk/mohmp3/newclass 
random=yes 
Đoạn kế hoạch quay số trong tập tin extensions.conf nhƣ sau: 
exten=> 9000,1,Answer() 
exten=> 9000,n,SetMusicOnHold(newclass) 
exten=> 9000,n,WaitMusicOnHold(15) 
exten=> 9000,n,Hangup() 
3.10.5 Hàng đợi (Queue) 
Hàng đợi tạo ra một chỗ logic để xếp các caller vào cho đến khi chúng ta sẵn 
sàng trả lời cuộc gọi.Hàng đợi là một cung cụ rất mềm dẻo và mạnh mẽ cho các hệ 
thống dịch vụ khách hàng. 
Cấu hình: 
Tất cả các cấu hình liên quan đến hàng đợi, nằm trong tập tin 
/etc/astersik/queues.conf. Để định nghĩa một hàng đợi, chúng ta bắt đầu bằng tên 
hàng đợi, đƣợc đặt trong dấu ngoặc vuông “[]”.Đây cũng là số để các extension 
khác có thể truy cập vào queue thông qua số này.Do đó tốt nhất nên đặt tên hàng 
đợi dƣới dạng số .Ví dụ: [1000]. 
Sau đó chúng ta phải thiết lập các tham số cho hàng đợi.Đầu tiên là nhạc chờ 
trong hàng đợi, chúng ta sẽ chỉ ra class chứa những tập tin âm thanh đã upload lên 
hệ thống (nhƣ mô tả trong phần Music On Hold): 
music = music_class 
Tiếp theo chúng ta định nghĩa một thông báo, nếu nhƣ chúng ta muốn.Điều 
này giúp phát một tập tin âm thanh thông báo đến các điện thoại viên (agent) khi 
anh ta (cô ta ) trả lời cuộc gọi đến từ hàng đợi. Chức năng này sẽ hữu ích nếu chúng 
ta có các agent trả lời nhiều hàng đợi, nó sẽ giúp thông báo cho agent biết cuộc gọi 
này đi từ hàng đợi nào tới . Nếu muốn dùng, phải chắc chắn rằng chúng ta có tập tin 
âm thanh: /var/lib/asterisk/sounds/..Thiết lập chức năng này 
bằng câu lệnh: 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 63 
Chương III : Các mô hình ứng dụng và cấu hình hoạt động cho Asterisk 
announce= 
Bây giờ chúng ta cần cấu hình qui luật đổ chuông cho các agent trong hàng 
đợi . Chúng ta nên quyết định điều này dựa vào đặc thù của công việc mà hàng đợi 
đó phải làm.Ví dụ nếu thiết lập chức năng ringall cho hàng đợi, ta dùng: 
strategy = ringall 
Khi đó,nếu một cuộc gọi đƣợc vào hàng đợi, tất cả các điện thoại của các 
agent trong hàng đợi mà đang rỗi đều đổ chuông và sẵn sàng nhận cuộc gọi . 
Tiếp theo chúng ta thiết lập timeout. Đây là thời lƣợng mà mỗi cuộc gọi sẽ 
đổ chông trƣớc khi hàng đợi xem xét cuộc gọi không đƣợc trả lời .Chúng ta nên 
thiết lập thời gian này đủ lớn để các agent đủ thời gian nhấc máy và trả lời điện 
thoại .Giá trị thƣờng dùng là 15ms : 
timeout=15 
Bây giờ chúng ta thiết lập thời gian đợi trƣớc khi bắt đầu thử lại sau khi đổ 
chuông hết tất cả các extension trong hàng đợi mà không đƣợc trả lời .Giá trị 
thƣờng dùng là 0. 
retry=0 
Tiếp theo chúng ta thiết lập giới hạn bao nhiêu cuộc gọi đƣợc xếp vào hàng 
đợi.Nếu chúng ta muốn cho phép mọi cuộc gọi đều vào hàng đợi, thì thiết lập giá trị 
0: 
maxlen=0 
Cuối cùng, chúng ta định nghĩa các thành viên trong hàng đợi.Đơn giản 
chúng ta chỉ cần thêm các dòng lệnh theo định dạng nhƣ sau: 
member => agent/extension_number 
member => agent/extension_number 
Trong đó, extension_number là các số của agent mà ta đã định nghĩa trong 
tập tin agents.conf 
Và cứ nhƣ thế ta tiếp tục địng nghĩa các hàng đợi khác với các tham số phù 
hợp để đáp ứng nhu cầu đề ra . Số lƣợng hàng đợi chúng ta định nghĩa có thể là 
không giới hạn, chỉ phụ thộc vào nguồn tài nguyên của server . 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 64 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Chương IV 
XÂY DỰNG TRUNG TÂM QUÀ TẶNG ÂM 
NHẠC TRÊN NỀN ASTERISK 
4.1 Giới thiệu 
Sự bùng nổ của Internet, việc ứng dụng ngày càng rộng rãi của thƣơng mại 
điện tử và các ứng dụng đa phƣơng tiện (multimedia) đã làm cho nhu cầu về trao 
đổi thông tin một cách thông suốt (transparent) giữa khách hàng với các cơ sở dữ 
liệu (Database) ngày càng tăng. 
Các dịch vụ/trung tâm chăm sóc khách hàng (CSKH) qua điện thoại, 
websites đang hứa hẹn trở thành một lĩnh vực hoạt động kinh doanh đầy tiềm năng 
tại Việt Nam, trong bối cảnh hội nhập với thế giới. 
 Hệ thống chăm sóc khách hàng là điểm tiếp nhận mọi thông tin, yêu cầu từ 
phía khách hàng dƣới mọi hình thức: thoại, e-mail, SMS, web, fax... và không phụ 
thuộc vào vị trí xuất phát của nguồn thông tin để phục vụ công tác CSKH, tiếp nhận 
yêu cầu, giải quyết khiếu nại... Ví dụ nhƣ một khách hàng muốn truy cập vào tài 
khoản ngân hàng của mình họ sẽ đƣợc hệ thống kết nối trực tiếp tới cơ sở dữ liệu 
(CSDL) của ngân hàng đó. Sau đó khách hàng sẽ tƣơng tác trực tiếp với CSDL để 
thực hiện các yêu cầu của mình. 
Các dịch vụ truyền thông giải trí hoạt động một cách tự động cũng đang đáp 
ứng đƣợc phần lớn nhu cầu của khách hàng. Mặt khác các tổng đài tự động giảm chi 
phí đáng kể cho nhà đầu tƣ và giảm số lƣợng nhân viên trực tổng đài nhƣ: Tổng đài 
trả lời tự động kết quả xổ số, tỉ giá đô la chứng khoáng, dự báo thời tiếc, quà tặng 
âm nhạc, quà tặng trái tim. 
4.2 Mục đích Yêu cầu 
Trong đồ án này sẽ tập trung xây dựng một hệ thống Callcenter với 2 chức 
năng chính. Khi khách hàng gọi tới tổng đài 1234 sẽ đƣợc nghe lời chào và hƣớng 
dẫn bấm phím. 
Bấm phím 0 
 Cho phép kết nối trực tiếp khách hàng với nhân viên tƣ vấn chăm sóc khách 
hàng của tổng đài. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 65 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hệ thống xây dựng đáp ứng đƣợc các chức năng đã đề ra, giải quyết tối đa 
các yêu cầu gọi đến và đảm bảo chất lƣợng âm thanh thoại. 
Bấm phím 1 
 Sử dụng dịch vụ quà tặng âm nhạc, cho phép khách hàng có thể gửi tặng 
một bản nhạc tới những ngƣời thân của mình cùng với lời nhắn của chính 
ngƣời gửi, thời điểm gửi sẽ do ngƣời gửi quyết định. Khách hàng sẽ đƣợc 
hƣớng dẫn để nhập mã quà tặng, số điện thoại ngƣời nhận và thời gian gửi 
quà tặng, nếu khách hàng nhập sai sẽ đƣợc thông báo và yêu cầu nhập lại. 
Mã quà tặng sẽ là một chuỗi số có 4 chữ số, bị coi là không đúng khi không 
tồn tại mã quà tặng này. Số điện thoại sẽ là một chuỗi số 4 chữ số khách 
hàng nhập. Thời gian gửi quà tặng sẽ là một chuỗi số có dạng hhmm, trong 
đó hh là giờ, mm là phút. Thời gian đƣợc coi là không đúng khi chuỗi số 
khách hàng nhập vào là một số nhỏ hơn 0000 hoặc lớn hơn 2400. Sau đó 
tổng đài yêu cầu nhập vào ngày tháng theo định dạng mmddyyyy, với mm là 
tháng, dd là ngày và yyyy là năm gửi quà tặng. Ngày tháng đƣợc xem là 
không đúng khi ngày tháng năm nhập vào nhỏ hơn thời gian hiện tại của hệ 
thống hoặc nhập mm nhỏ hơn 00 hoặc lớn hơn 12 hoặc yyyy lớn hơn năm 
2020. Cuối cùng khách hàng sẽ ghi âm lại lời nhắn của chính mình để gửi tới 
ngƣời nhận. Sau đó là lời cảm ơn và kết thúc quá trình gửi quà tặng. 
 Tổng đài sẽ yêu cầu bấm phím “*” để tiếp tục gửi quà tặng âm nhạc hay bấm 
phím “#” để trở về [mainmenu]. Nếu sau 30s không nhấn phím thì hệ thống 
tự động Hangup. 
4.3 Phân tích thiết kế 
4.3.1 Kịch bản cho hệ thống 
Khách hàng gọi đến 1234: 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 66 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 Kịch bản Menu chính của hệ thống 
Quy trình gửi quà tặng âm nhạc. 
nhấn phím 1 nhấn phím 0 
Chào mừng bạn đến với trung tâm vụ và chăm sóc 
khách hàng của chúng tôi. Nhấn phím 1 để gửi quà 
tặng âm nhạc, nhấn phím 0 để gặp nhân viên tư vấn 
khách hàng.. 
Gặp tổng 
đài viên 
Gửi Quà 
tặng âm 
nhạc 
Menu chính 
Nhập mã quà tặng 
Nhập lại mã quà 
tặng 
Mã sai 
 iểm tra m 
quà tặng 
M số sai, xin vui 
lòng nhập lại 
Mã đúng 
Nhập số điện thoại 
người nhận 
Nhập m số quà tặng 4 chữ số. Để 
biết m số quà tặng truy cập trang 
web:www… 
Nhập số điện thoại người nhận quà 
tặng 
Đặt giờ gửi quà tặng b ng cách 
nhấn giờ theo định dạng: 
giờgiờphútphút 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 67 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Giờ đúng 
Giờ nhập không đúng, 
xin vui lòng nhập lại 
Nhập lại 
giờ 
Giờ sai 
 iểm tra ngày 
gửi quà tặng 
Nhập giờ 
gửi quà 
Đặt ngày gửi quà tặng b ng 
cách nhấn ngày theo định 
dạng: thángtháng 
ngàyngàynămnăm. 
 iểm tra giờ 
gửi quà tặng 
H y để lại lời nhắn sau 
tiếng Bíp 
Ngày nhập không 
đúng, xin vui lòng nhập 
lại 
Ngày đúng 
Ngày sai 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 68 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 Quy trình gửi quà tặng âm nhạc. 
Quy trình gặp nhân viên tư vấn 
Ghi âm lại lời nhắn 
và thực hiện đặt 
lịch gửi quà tặng 
Quà tặng đ đư c gửi .Cám 
ơn qu khách đ sử dụng 
dịch vụ. 
 ết thúc gửi 
quà tặng 
Trở về đầu 
quy trình 
quà tặng âm 
nhạc 
Trở về menu 
chính 
Nhấn phím # Nhấn phím * 
Không nhấn 
phím * hoặc # 
trong 30 giây 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 69 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.3.2 Biểu đồ phân rã chức năng 
 Hình 4.1 Biểu đồ phân cấp chức năng 
Đưa vào hàng đ i chờ 
đư c trả lời đồng thời 
đư c nghe nhạc chờ 
Nhân viên tư vấn trả 
lời khách hàng khi tới 
lư t khách hàng đó 
 ết thúc 
cuộc gọi 
Gặp nhân viên tƣ vấn 
CALL CENTER 
Gặp tồng đài viên Gửi quà tặng âm nhạc 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 70 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.3.3 Biểu đồ ngữ cảnh 
 Hình 4.2 Biểu đồ ngữ ảnh 
4.3.4 Biểu đồ luồng dữ liệu mức đỉnh 
Hình 4.3 Biểu đồ luồng dữ liệu mức đỉnh 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 71 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.3.5 Giới thiệu về tiện ích Auto dial out 
Để có thể thực hiện đƣợc việc gửi quà tặng trong tƣơng lai, phải sử dụng đến 
một tiện ích gọi Auto dial out trong Asterisk đó là asterisk call file. 
Asterisk call file là một cấu trúc file mà khi chuyển vào thƣ mục thích hợp, 
có thể tự động thực hiện các cuộc gọi sử dụng Asterisk. Call file là cách tuyệt vời để 
thực hiện các cuộc gọi tự động mà không cần sử dụng các tính năng phức tạp của 
Asterisk nhƣ AMI 
Cách thức hoạt động của Call file: 
Di chuyển call file vào thƣ mục /var/spool/asterisk/outgoing/ 
Trong file modules.conf đặt autoload=no để chắc chắn rằng file pbx_spool.so 
đƣợc load, ngƣợc lại thì nó sẽ không hoạt động. 
Nếu thay đổi thời gian call file trong tƣơng lai, Asterisk sẽ chờ cho đền khi 
giờ hệ thống phù hợp với thời gian thay đổỉ ở lần trƣớc đó để thực hiện call file. 
Asterisk sẽ thông báo và ngay lập tức thực hiện các chỉ thị đƣợc xác định 
trong file call. Điều này có thể bao gồm kết nối với một bối cảnh Asterisk dialplan, 
hoặc thực hiện một dialplan. 
Sau đó asterisk sẽ gỡ bỏ call file ra khỏi thƣ mục 
/var/spool/asterisk/outgoing/ 
Cú pháp của 1 call file: 
Xác định làm thế nào để gọi 
Channel: : kênh để sử dụng cho cuộc gọi. 
CallerID: "name" : Caller ID đƣợc gọi. 
MaxRetries: Số lần thử gọi lại tối đa khi thất bại (không bao gồm 
cuộc gọi ban đầu, ví dụ nhƣ 0 thì tổng số cuộc gọi thực hiện là). Mặc định là 0. 
RetryTime: thời gian(s) giữa hai lần thử. Mặc định là 300 (5 
phút). 
WaitTime: thời gian (giây) để đợi câu trả lời. Mặc định là 45. 
Account: Thiết lập các mã tài khoản để sử dụng. 
Nếu cuộc gọi đƣợc trả lời, kết nối nó ở đây: 
Context: Bối cảnh trong extensions.conf 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 72 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Extension: đƣợc định nghĩa trongi extensions.conf 
Priority: ƣu tiên extension để bắt đầu 
Set: Thiết lập một biến để sử dụng trong logic extension 
Application : ứng dụng Asterisk để chạy (sử dụng thay vì xác định bối cảnh 
extension và ƣu tiên) 
Data: Các tùy chọn dữ liệu cho ứng dụng 
Ví dụ: tạo 1 call file đơn giản 
Channel: SIP/2000 
CallerID: 2000 
MaxRetries: 2 
 RetryTime: 60 
 WaitTime: 30 
Extension: call-test-file 
Trong file Extension.conf 
[call-file-test] 
Exten=> 10,1,Answer() 
Exten=> 10,n,Wait(2) 
Exten=> 10,n,Playback(hello-world) 
Exten=> 10,n,Hangup 
Hệ thống sẽ tự động kiểm tra liên tục tất cả các file .call trong thƣ mục 
var/spool/asterisk/outgoing, nếu thời gian tạo ra file .call bằng đúng thời gian hệ 
thống thì hệ thống sẽ tự động gọi đến số điện thoại theo context đƣợc tạo trong file 
.call. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 73 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.3.6 Cơ sở dữ liệu 
Cớ sở dữ liệu phục vụ cho hệ thống cũng khá đơn giản. 
Hình 4.4 Cơ sở dữ liệu 
4.4 Triển khai hệ thống 
4.4.1 Mô hình hệ thống 
Hình 4.5 Mô hình logic hệ thống 
Bảng MSBH dùng để lƣu mã số bài hát, trƣờng msbh là mã số bài hát và 
trƣờng tenbaihat là tên của bài hát. Bảng này nhằm mục đích để kiếm tra tính hợp lệ 
của mã bài hát khi khách hàng nhập vào. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 74 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Trong hệ thống thực tế triển khai trong đồ án gồm có: 
 1 Server Linux (Ubuntu 8.04) trên đó cài đặt phần mềm Asterisk version 
1.4.x, MySQL 5.0, PHPAdmin. 
 2 Softphone (X-lite) 
Cấu hình đề nghị đối với PC cài đặt server Asterisk: 
CPU P4 2.4 Ghz 
RAM 512 
HDD 40G 
4.4.2 Cài đặt các gói phần mềm. 
4.4.2.1 Hệ Điều Hành Ubuntu 8.04 
Sử dụng đĩa cài đặt Ubuntu version 8.04 và cài đặt mặc định các gói của hệ 
thống. Sau khi cài xong thì cần cài thêm các gói nhỏ sau để có thể cài và chạy đƣợc 
phần mềm Asterisk: 
gcc 
gcc++ 
kernel-devel 
bison 
openssl 
ncurses 
curl 
unixODBC, unixODBC-devel 
libtool 
mysql-connector-odbc, mysql-devel 
php-mysql, php, php-mcrypt 
Ngoài ra còn cần mod_ssl, wget… 
Gõ lệnh sau dƣới chế độ root để tự động cài đặt tất cả các gói cần thiết: 
Update your Ubuntu packages 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 75 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
# apt-get update 
# apt-get upgrade 
Install required 
# apt-get install mc build-essential linux-headers-`uname -r` 
# apt-get install libncurses5-dev libssl-dev libmysqlclient15-dev libnewt-dev 
zlib1g-dev 
# apt-get install libxml2-dev libtiff4-dev libaudiofile-dev 
# apt-get install openssh-server curl sox lame mpg123 
Đặt lại mật khẩu nhƣ mật khẩu root mysql server, hãy nhớ rằng đây chỉ là vì 
lợi ích sử dụng, sau này bạn phải thay đổi nó thành mật khẩu của bạn. 
# apt-get install apache2 mysql-server php5 php5-cli php5-gd php5-mysql 
php-pear php-db 
4.4.2.2 Cài đặt phần mềm Asterisk 
 +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 
+Bằng cách sử dụng các lệnh sau: 
 # wget 
1.4.21.2.tar.gz 
 # wget 
1.4.12.1.tar.gz 
 # wget  
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 76 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 # wget 
1.4.7.tar.gz 
Giải nén chúng vào thƣ mục /usr/src/asterisk 
Tiến hành cài đặt: 
Install libpri 
# tar -zxf libpri-1.4.7.tar.gz 
# cd libpri-1.4.7 
# make 
# make install 
# cd ../ 
Install Zaptel 
# tar -zxf zaptel-1.4.12.1.tar.gz 
# cd zaptel-1.4.12.1 
# ./configure 
# make menuconfig 
Press x to save selections 
# make 
# make install 
# make config 
# cd ../ 
Install Asterisk 
# tar -zxf asterisk-1.4.21.2.tar.gz 
# cd asterisk-1.4.21.2 
# ./configure 
# make menuconfig 
Press x to save selections 
# make 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 77 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
# make install 
# make samples 
# cd ../ 
Install Asterisk addons 
# tar -zxf asterisk-addons-1.4.7.tar.gz 
# cd asterisk-addons-1.4.7 
# ./configure 
# make menuconfig 
# make 
# make install 
# make samples 
# cd ../ 
4.4.2.3 Cài đặt Softphone 
 Softphone đƣợc sử dụng ở đây là phần mềm X-Lite. Tiến hành download X-
Lite 3.0 tại www.counterpath.com và cài đặt bình thƣờng. 
 Phần mềm hỗ trợ lập trình giao tiếp với Asterisk 
Cài đặt thêm gói FreeTDS để hỗ trợ kết nối với Database SQL Server tại: 
ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz 
Tiến hành cài đặt: ./configure;make;make install 
Ngoài ra còn cần cài các gói để chuyển định dạng file âm thành từ mp3 sang 
gsm sau: mpg123, lame, sox. 
4.4.2.4 Cài đặt PhpMyAdmin 
Các chức năng của PhpMyAdmin 
 PhpMyAdmin có thể quản lý toàn bộ MySQL Server. 
 Xem dữ liệu, xóa CSDL, bảng, view, trƣờng và các chỉ số. 
 Tạo, sao chép, xóa, đổi tên và thay đổi CSDL, các bảng các trƣờng và chỉ số. 
 Bảo trì Server, các CSDL và các bookmark hay bất kì câu lệnh SQL hoặc 
một lô các câu lệnh. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 78 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 Nạp những tệp văn bản vào các bảng. 
 Đọc vào tạo nhiều văn bảng. 
 Xuất dữ liệu ra nhiều kiểu định dạng CSV, XML, PDF, Open text, 
Spreadsheet của open Word, Exel, Latex định đạng. 
 Quản trị đa server. 
 Quản lý ngƣời dùng và những đặc quyền. 
 Kiểm tra các thực thể liên kết trong bảng MyISAM. 
 Sử dụng truy vấn bằng ví dụ, tạo các truy vấn phức tạp một cách tự động. 
 Tìm kiếm toàn bộ trong dữ liệu hoặc một dữ liệu con của nó. 
 Thực hiện nhớ dữ liệu với bất kì định dạng sử dụng với những chức năng 
đƣợc thiết lập trƣớc, nhƣ là hiển thị dữ liệu định dạng ảnh hay các đƣờng liên 
kết. 
 Hỗ trợ bảng và khóa dạng InnoDB. 
 Hỗ trợ MySQLi. 
 Hỗ trợ với hơn 50 ngôn ngữ. 
Cài đặt 
Có nhiều cách cài đặt PhpMyAdmin trên Linux, trong phần này xin hƣớng 
dẫn cách cài đặt PhpMyAdmin bằng dòng lệnh. 
 Cài đặt Apache 
Để bắt đầu chúng tôi sẽ hƣớng dẫn cài đặt Apache. 
1. Mở phần Terminal (Applications > Accessories > Terminal) 
2. Copy/Paste dòng mã sau vào Terminal và nhấn phím enter: 
sudo apt-get install apache2 
Terminal sẽ hỏi mật khẩu của bạn, nhập nó vào và nhấn enter. 
Kiểm tra Apache. 
Để chắc chắn mọi thứ đã đƣợc cài đặt chính xác, chúng ta sẽ tiến hành kiểm 
tra Apache để đảm bảo nó hoạt động đúng cách. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 79 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
1. Mở trình duyệt và sau đó nhập địa chỉ web sau đây vào ô địa chỉ: 
2. Bạn sẽ thấy một thƣ mục có tên là apache2-default/. Mở thƣ mục đó ra, 
bạn sẽ nhận đƣợc thông báo là “It works!” và bạn đã thành công. 
 Cài đặt PHP. 
Tiếp theo chúng ta sẽ tiến hành cài đặt PHP 5. 
Bƣớc 1: Mở lại phần Terminal (Applications > Accessories > Terminal) . 
Bƣớc 2: Copy/Paste dòng lệnh sau vào Terminal và nhấn enter: 
sudo apt-get install php5 libapache2-mod-php5. 
Bƣớc 3: Hợp lệ để PHP làm việc và tƣơng thích với Apache và chúng ta phải 
khởi động lại nó. Nhập vào câu lệnh sau trong Terminal để thực hiện điều 
này: 
sudo /etc/init.d/apache2 restart. 
Kiểm tra lại PHP. 
Để đảm bảo không có vấn đề gì phát sinh đối với PHP, hãy kiểm tra lại nó 
bằng các bƣớc sau: 
Bƣớc 1: Trong Terminal, copy và paste dòng lệnh sau rồi nhấn enter: 
sudo gedit /var/www/testphp.php 
Câu lệnh này sẽ mở một file có tên là phptest.php. 
Bƣớc 2: Copy/Paste dòng lệnh sau vào file phptest: 
Bƣớc 3: Lƣu và đóng file lại 
Bƣớc 4: Mở trình duyệt web của bạn và nhập vào địa chỉ sau: 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 80 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Bạn sẽ thấy giao diện sau: 
Hình 4.6 giao diện trang php khi cài đặt 
Việc cài đặt cả Apache và PHP đã thành công! 
 Cài đặt MySQL 
Bƣớc 1: Lại tiếp tục mở lại Terminal và đƣa vào dòng lệnh sau: 
sudo apt-get install mysql-server 
Bƣớc 2 (không bắt buộc): Để các máy tính khác trong mạng xem đƣợc server 
mà bạn đã tạo, đầu tiên là bạn phải chỉnh sửa “Bind Address”. Bắt đầu bằng 
việc mở Terminal để sửa file my.cnf. 
gksudo gedit /etc/mysql/my.cnf 
Tại dòng 
bind-address = 127.0.0.1 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 81 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
đổi địa chỉ 127.0.0.1 thành địa chỉ IP của bạn 
Bƣớc 3: Đây là bƣớc quan trọng, nhập dòng lệnh sau vào Terminal: 
mysql -u root -p 
Gõ dòng lệnh sau: 
mysql> SET PASSWORD FOR 'root'@'localhost' = 
PASSWORD('yourpassword'); 
(Hãy thay đổi yourpassword bằng mật khẩu mà bạn chọn) 
Bƣớc 4: Giờ chúng ta sẽ tiến hành cài đặt chƣơng trình phpMyAdmin, đây là 
một công cụ đơn giản để chỉnh sửa cơ sở dữ liệu của bạn. Copy/paste dòng 
lệnh sau vào Terminal: 
sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin 
Sau khi đã cài đặt mọi thứ, bƣớc tiếp theo cần thực hiện là làm cho PHP có 
thể làm việc cùng với MySQL. Để thực hiện điều này, chúng ta cần mở file 
php.ini bằng cách nhập vào dòng lệnh sau: 
gksudo gedit /etc/php5/apache2/php.ini 
Trong file này, chúng ta cần bỏ dấu chú thích ở dòng lệnh sau bằng cách bỏ 
đi dấu chấm phẩy đầu dòng (;): 
;extension=mysql.so 
Thay đổi nó thành nhƣ sau: 
extension=mysql.so 
Giờ thì bạn có thể khởi động lại Apache và hoàn thiện toàn bộ quá trình cài 
đặt! 
sudo /etc/init.d/apache2 restart 
 Cài đặt phpMyAdmin 
apt-get install phpmyadmin 
Trong khi cài đặt, bạn sẽ đƣợc nhắc chọn các máy chủ web đó sẽ đƣợc sử 
dụng để chạy phpMyAdmin. Chọn Apache2. 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 82 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Sau khi cài đặt ,thực hiện lệnh sau để sao chép các thƣ mục phpMyAdmin 
vào thƣ mục / var / www / . (Theo mặc định nó đƣợc cài đặt trong thƣ mục / usr / 
share / phpmyadmin /.) 
ln -s /usr/share/phpmyadmin/ /var/www/phpmyadmin 
Bây giờ bạn có thể vào các trang đăng nhập phpMyAdmin bằng cách trỏ 
trình duyệt của bạn:  
Sau khi kết thúc quá trình cài đặt theo bài hƣớng dẫn tnhƣng nếu vẫn chƣa 
khởi động đƣợc phpmyadmin thì fix nhƣ sau: 
gedit /etc/apache2/apache2.conf 
Thêm vào dòng : Include /etc/phpmyadmin/apache.conf 
Và sau đó restart lại apache bằng lệnh 
/etc/init.d/apache2 restart 
Quá trình cài đặt PhpMyAdmin đã hoàn tất, để vào giao diện của nó ta vào 
trình duyệt gõ lệnh : 
Sử dụng PhpMyAdmin 
Sau khi vào trình duyệt gõ lệnh  thì sẽ hiển thị 
cửa sổ yêu cầu nhập vào user, pass, và CSDL nếu có : 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 83 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.7 Đăng nhập PhpMyAdmin 
Sau khi đăng nhập đúng sẽ ra màn hình hiển thị: 
Hình 4.8:Giao diện của PhpMyAdmin sau khi đăng nhập thành công 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 84 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.4.3 Cấu hình hệ thống Asterisk 
Cấu hình các file .conf nhƣ sau: 
Extensions.conf: 
//để tặng nhạc 
[guiqua] 
exten=>10,1,Ringing() 
exten=>10,n,Answer() 
exten=>10,n,Wait(1) 
exten=>10,n,Playback(do-an/${MSG}) 
exten=>10,n,Wait(1) 
exten=>10,n, Playback (do-an/${MABH}) 
exten=>10,n,Hangup() 
[qtangamnhac] 
exten=>1234,1,Answer() 
exten=>1234,2,goto(mainmenu,s,1) 
[mainmenu] 
exten=>s,1,Background(chaomung) 
exten=>s,2,waitexten(30) 
exten=>s,3,Playback(goodbye) 
exten=>s,4,hangup() 
exten=>0,1,goto(nvtv,s,1) 
exten=>1,1,goto(qtan,s,1) 
exten=>2,1,goto(saimenu,s,1) 
exten=>3,1,goto(saimenu,s,1) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 85 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
exten=>4,1,goto(saimenu,s,1) 
exten=>5,1,goto(saimenu,s,1) 
exten=>6,1,goto(saimenu,s,1) 
exten=>7,1,goto(saimenu,s,1) 
exten=>8,1,goto(saimenu,s,1) 
exten=>9,1,goto(saimenu,s,1) 
exten=>*,1,goto(saimenu,s,1) 
exten=>#,1,goto(saimenu,s,1) 
[qtan] 
exten=>s,1,AGI(qtamnhac.php) 
exten=>s,2,waitexten(30) 
exten=>*,1,goto(qtan,s,1) 
exten=>#,1,goto(mainmenu,s,1) 
exten=>s,3,hangup() 
[saimenu] 
exten=>s,1,Playback(chonsai) 
exten=>s,2,goto(mainmenu,s,2) 
[nvtv] 
exten=>s,1,SetMusicOnHold(hanly) 
exten=>s,2,queue(nhanvien) 
[agent] 
exten=> 900,1,Answer() 
exten=> 900,n,AgentLogin() 
file queues.conf: 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 86 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
[nhanvien] 
strategy=ringall 
member => Agent/1111 
member => Agent/2222 
file agents.conf: 
agent => 2222,2222,ThanhTung 
agent => 1111,1111,TanHan 
file musiconhold.conf 
[hanly] 
mode=custom 
directory=/var/lib/asterisk/moh 
application=/usr/local/bin/mpg123 -q -r 8000 -f 8192 -b 2048 --mono -s 
random=yes 
Cấu hình Softphone 
Để cấu hình tài khoản SIP cho X-Lite (máy 2000), vào Show Menu - SIP Account 
Setting, ta nhập các thông số nhƣ hình sau đây: 
Hình 4.9 đăng ký tài khoản SIP cho softphone X-Lite 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 87 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Sau khi nhập đầy đủ các thông tin nhƣ trên, X-Lite sẽ tiến hành đăng ký với 
Asterisk server . Nếu đăng ký thành công, ta có màn hình hiển thị của X-Lite nhƣ 
sau: 
Hình 4.10 đăng ký cho softphone thành côngLập trình cho hệ thống 
4.4.4 Giới thiệu AGI 
 Asterisk Gateway Interface ( AGI ) là một chuẩn giao tiếp với Asterisk . AGI 
cho phép Astersik gọi thực thi một chƣơng trình ngoài để mở rộng nhiều chức năng 
của Astersik nhƣ điều khiến các kệnh thoại , phát âm thanh , đọc số DTMF , liên kết 
với cơ sở dữ liệu …. Các chƣơng trình ngoài đƣợc gọi là AGI Script , ta có thể lập 
trình ra các AGI Script bằng nhiều ngôn ngữ lập trình khác nhau nhƣ Perl, PHP, C, 
C#, Java. 
Trong lập trình giao tiếp với Asterisk, cần phân biệt hai khái niệm API và 
AGI. API là giao diện lập trình ứng dụng, thƣờng đƣợc cung cấp dƣới dạng đầu vào 
là các lời gọi hàm đến một thƣ viện nào đó của ứng dụng. Còn AGI thực chất cung 
cấp cho lập trình viên một kênh giao tiếp với Asterisk thông qua các con trỏ file 
(file Pointer) là STDIN, STDOUT, STDERR. Vì vậy công việc lập trình cũng trở 
nên đơn giản hơn vì không phải đính kèm với một thƣ viện nào của Asterisk. 
Khi bắt đầu mỗi script, Asterisk sẽ truyền các biến môi trƣờng và giá trị của nó đến 
AGI script. Ví dụ: 
 agi_request: quangtangamnhac.php 
 agi_channel: Zap/1-1 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 88 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 agi_language: vi 
 agi_callerid: 
 agi_context: default 
 agi_extension: 123 
 agi_priority: 2 
 Sau khi truyền các biến này thì Asterisk sẽ gửi một dòng trống để dánh dấu 
kết thúc các biến môi trƣờng và chuyển quyền điều khiển cho script. 
Trong file cấu hình extensions.conf, ta gọi script nhƣ sau: 
[default] 
exten => 123,1,Answer( ) 
exten => 123,2,AGI(quatangamnhac.php) 
File quatangamnhac.php 
#!/usr/bin/php -q 
<?php 
{ 
 $link=mysql_connect("localhost","root","quangngai"); 
if(!$link){die("Could not connect to MySQL");} 
mysql_select_db("kuhan",$link) or die ("could not open db".mysql_error()); 
 $parm_error_log = '/tmp/qtangamnhac.log'; 
 $parm_debug_on = 1; 
 $parm_temp_dir = '/tmp'; 
 $parm_call_dir = '/var/spool/asterisk/outgoing'; 
 $parm_maxretries = 3; 
 $parm_waittime = 60; 
 $parm_retrytime = 60; 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 89 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 $parm_wakeupcallerid = 'quatangamnhac'; 
 $parm_chan_ext = 0; 
 // ---------------------------------------------------- 
 // END CONFIG PARMS 
 //----------------------------------------------------- 
 GLOBAL $stdin, $stdout, $stdlog, $result, $parm_debug_on, $parm_test_mode; 
 // These setting are on the WIKI pages  
 ob_implicit_flush(false); 
 set_time_limit(30); 
 error_reporting(0); 
 $stdin = fopen( 'php://stdin', 'r' ); 
 $stdout = fopen( 'php://stdout', 'w' ); 
 if ($parm_debug_on) 
 { 
 $stdlog = fopen( $parm_error_log, 'w' ); 
 fputs( $stdlog, "---Start---\n" ); 
 } 
 // ASTERISK * Sends in a bunch of variables, This accepts them and puts them 
in an array 
 //  
 while ( !feof($stdin) ) 
 { 
 $temp = fgets( $stdin ); 
 if ($parm_debug_on) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 90 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 fputs( $stdlog, $temp ); 
 // Strip off any new-line characters 
 $temp = str_replace( "\n", "", $temp ); 
 $s = explode( ":", $temp ); 
 $agivar[$s[0]] = trim( $s[1] ); 
 if ( ( $temp == "") || ($temp == "\n") ) 
 { 
 break; 
 } 
 } 
 $channel = $agivar[agi_channel]; 
 if (preg_match('.^([a-zA-Z]+)/([0-9]+)([0-9a-zA-Z-]*).', $channel, $match) ) 
 { 
 $sta = trim($match[2]); 
 $chan = trim($match[1]); 
 } 
 $callerid = $agivar[agi_callerid]; 
 if (preg_match('//', $callerid, $match) ) 
 { 
 $cidn = trim($match[1]); 
 } 
 else 
 { 
 if (preg_match('/([0-9]+)/', $callerid, $match) ) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 91 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 { 
 $cidn = trim($match[1]); 
 } 
 else 
 $cidn = -1; 
 } 
 // Check if we have an outstanding Wakeup Call file 
 if ( $parm_chan_ext ) 
 $dir_check = "$chan.$sta.call"; 
 else 
 $dir_check = "ext.$cidn.call"; 
 if ($parm_debug_on) 
 fputs( $stdlog, "Checking Directory [$parm_call_dir] Check=[$dir_check]\n" 
); 
 $outc=0; 
 $dir_handle = opendir( $parm_call_dir ); 
 while( $file = readdir($dir_handle ) ) 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "File=$file\n" ); 
 if (strstr( $file, $dir_check ) ) 
 $out[$outc++] = $file; 
 } 
 closedir( $dir_handle ); 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 92 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
//==========================================================
=============== 
 // This is where we interact with the caller. Answer the phone and so on 
//==========================================================
=============== 
 $rc = execute_agi( "ANSWER "); 
 sleep(1); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "STREAM FILE chaomung \"\" "); 
 $rc[result] = 0; 
 while ( !$rc[result] ) 
 { 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"0123456789\" "); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "STREAM FILE nhapgio \"0123456789\" "); 
 // If we get here, they haven't pressed anything yet. 
 if ( !$rc[result] ) 
 $rc = execute_agi( "GET DATA beep 15000 4"); 
 if ( $rc[result] != -1 ) 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "We have num digits:" . strlen( $rc[result]) . "- 
$rc[result] \r\n\r\n" ); 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 93 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 if ( strlen( $rc[result] ) == 2 ) 
 { 
 $num= $rc[result]-48; 
 while ( strlen($num) 0 ) 
 { 
 $rc = execute_agi( "WAIT FOR DIGIT 15000"); 
 if ( $rc[result] >= 48 && $rc[result] <= 57 ) 
 $num .= $rc[result] - 48; 
 else 
 $rc[result] = 0; 
 } 
 if (strlen($num) == 4 ) 
 $rc[result] = $num; 
 } 
 if ($parm_debug_on) 
 fputs( $stdlog, "Checking Results [$rc[result]] \r\n\r\n" ); 
 if ( $rc[result] > 2359 || strlen( $rc[result]) < 4 || substr($rc[result],2,2) 
> 59 || $rc[result] < 0) 
 { 
 $rc[result] = 0; 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"\" "); 
 } 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 94 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 if (strlen( $rc[result] ) == 4 && $rc[result] == 0 ) 
 $rc[result] = -2; // Special 00:00 time 
 } 
 } 
 if ( $rc[result] == -2 ) 
 $rc[result] = '0000'; 
 else if ( $rc[result] == -1 ) 
 exit; // The user hung up 
 // Save the time entered 
 $wtime = $rc[result]; 
 // We don't know who the user is, so if its less than 1300 it could be AM or 
PM, so prompt 
 // them for am pm 
 if ( $wtime != -1 && $wtime < 1300 ) 
 { 
 $rc[result] = 0; 
 while ( !$rc[result] ) 
 { 
 if ( !$rc[result] ) 
 $rc = execute_agi( "GET DATA sangchieu 15000 1"); 
 } 
 switch( $rc[result] ) 
 { 
 case '1': // Set to AM should be under 1159 or less 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 95 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 if ( $wtime > 1159 ) 
 $wtime -= 1200; 
 $rc[result] = 0; 
 break; 
 case '2': // Set to PM should be equal or over 1200 
 if ( $wtime < 1159 ) 
 $wtime += 1200; 
 $rc[result] = 0; 
 break; 
 } 
 } 
 $rc[result] = 0; 
 while ( !$rc[result] ) 
 { 
 $rc = execute_agi( "STREAM FILE soduocgoi \"0123456789\" "); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "GET DATA beep 15000 4"); 
 $sogoi = $rc[result]; 
 } 
 $rc[result] = 0;$BADFLAG=0 ; 
 while (( !$rc[result] )||(!$BADFLAG)) 
 { 
 $rc = execute_agi( "STREAM FILE date \"0123456789\" "); 
 if ( !$rc[result] ) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 96 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 $rc = execute_agi( "GET DATA beep 15000 8"); 
$rc[result] = trim($rc[result]); 
$rc[result] = ltrim($rc[result]); 
if (substr($rc[result],4,4)<date("Y")) : 
$BADFLAG=1 ; 
endif ; 
if (substr($rc[result],4,4)>2020) : 
 $BADFLAG=1 ; 
endif; 
if (substr($rc[result],0,2)<01) : 
 $BADFLAG=1 ; 
endif ; 
if (substr($rc[result],0,2)>12) : 
 $BADFLAG=1 ; 
endif ; 
if ((substr($rc[result],0,2)<date("m"))&&(substr($rc[result],4,4)<date("Y"))) : 
 $BADFLAG=1 ; 
endif ; 
if (substr($rc[result],2,2)<01) : 
 $BADFLAG=1 ; 
endif ; 
if (substr($rc[result],2,2)>31) : 
 $BADFLAG=1 ; 
endif ; 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 97 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
if 
((substr($rc[result],0,2)<date("m"))&&(substr($rc[result],2,2)<date("d"))&&(substr
($rc[result],4,4)<date("Y"))) : 
 $BADFLAG=1 ; 
endif ; 
if ($BADFLAG) 
 $BADFLAG=0; 
else $BADFLAG=1; 
 $ngaythang = $rc[result]; 
 } 
 $rc[result] = 0; 
 while ( !$rc[result] ) 
 { 
 $rc = execute_agi( "STREAM FILE nhapmsbh \"0123456789\" "); 
 if ( !$rc[result] ){ 
 $rc = execute_agi( "GET DATA beep 15000 4"); 
 $msbh = $rc[result]; 
 $row=mysql_query("select mabh from mabaihat where 
mabh='$msbh'"); 
 $rows = mysql_fetch_array($row); 
 if($rows){ 
 $rc[result]=1; 
 } 
 else $rc[result]=0; 
 } 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 98 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 } 
 $rc[result] = 0; 
// if ( !$rc[result] ) 
// $rc = execute_agi( "STREAM FILE loighiam"); 
 if ( !$rc[result]) 
 $rc = execute_agi( "RECORD FILE /var/lib/asterisk/sounds/do-
an/$wtime.$ngaythang.$sogoi gsm \"0123456789\" -1"); 
 // At this point we have a millitary time in the $wtime variable 
 if ( $parm_chan_ext ) 
 { 
 $wakefile = "$parm_temp_dir/$wtime.$chan.$sta.call"; 
 $callfile = "$parm_call_dir/$wtime.$chan.$sta.call"; 
 } 
 else 
 { 
 $wakefile = "$parm_temp_dir/$wtime.$ngaythang.$sogoi.call"; 
 $callfile = "$parm_call_dir/$wtime.$ngaythang.$sogoi.call"; 
 } 
 if ($parm_debug_on) 
 fputs( $stdlog, "Wakeup File [$wakefile]\n" ); 
 // Open up a wakeup file to write it out. 
 $wuc = fopen( $wakefile, 'w'); 
 if ( $wuc ) 
 { 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 99 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 // Delete any old Wakeup call files this one will override 
 for ($i=0; $i < $outc; $i++ ) 
 { 
 if( file_exists( "$parm_call_dir/$out[$i]" ) ) 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "Unlinking Old File [$parm_call_dir/$out[$i]]\n" ); 
 unlink( "$parm_call_dir/$out[$i]" ); 
 } 
 } 
 if ( $parm_chan_ext ) 
 fputs( $wuc, "channel: $chan/$sta\n" ); 
 else 
 fputs( $wuc, "channel: SIP/$sogoi\n" ); 
 fputs( $wuc, "maxretries: $parm_maxretries\n"); 
 fputs( $wuc, "retrytime: $parm_retrytime\n"); 
 fputs( $wuc, "waittime: $parm_waittime\n"); 
 fputs( $wuc, "callerid: $parm_wakeupcallerid\n"); 
 fputs( $wuc, "Extension: 10\n"); 
 fputs( $wuc, "context: guiqua\n"); 
 fputs( $wuc, "Set: MSG=" . $wtime . "." . $ngaythang . "." . $sogoi . 
"\n" ); 
 fputs( $wuc, "Set: MABH=" . $msbh . "\n" ); 
 fclose( $wuc ); 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 100 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 $w = getdate(); 
 $w['hours'] = substr( $wtime, 0, 2 ); 
 $w['minutes'] = substr( $wtime, 2, 2 ); 
 $w['day'] = substr( $ngaythang, 2, 2 ); 
 $w['mon'] = substr( $ngaythang, 0, 2 ); 
 $w['year'] = substr( $ngaythang, 4, 4 ); 
 $time_wakeup = mktime( substr( $wtime, 0, 2 ), substr( 
$wtime, 2, 2 ), 0, substr( $ngaythang, 0, 2 ), substr( $ngaythang, 2, 2 ), substr( 
$ngaythang, 4, 4 )); 
 $time_now = time( ); 
 if ($parm_debug_on) 
 fputs( $stdlog, 'time_wakeup=' . date('l dS \of F Y h:i:s A', 
$time_wakeup) . " ($time_wakeup) | time_now=" . date('l dS \of F Y h:i:s 
A',$time_now) . " ($time_now)\n" ); 
 if ($parm_debug_on) 
 fputs( $stdlog, 'Setting WAKEUP file to =' . date('l dS \of F Y h:i:s A', 
$time_wakeup) . " - $time_wakeup\n" ); 
 touch( $wakefile, $time_wakeup, $time_wakeup ); 
 rename( $wakefile, $callfile ) 
 } 
 else 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "Error opening file [$wakefile]\n" ) 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"\" "); 
 if ( !$rc[result] ) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 101 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 $rc = execute_agi( "STREAM FILE goodbye \"\" "); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "HANGUP"); 
 exit; 
 } 
 if ( $cidn && $parm_chan_ext == 0 ) 
 { 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"\" "); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"\" "); 
 if ( !$rc[result] ) 
 $rc = execute_agi( "SAY DIGITS $sogoi \"\" ") 
 } 
 say_wakeup( $wtime ); 
 $rc[result] = 0; 
// } 
 break; 
 if ( !$rc[result] ) 
 $rc = execute_agi( "STREAM FILE auth-thankyou \"\" "); 
 if ($parm_debug_on) 
 fclose($stdlog); 
 exit; 
} 
// ---------------------------------------------- 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 102 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
// This will say military time in AM/PM format 
function say_wakeup( $wtime ) 
{ 
 GLOBAL $stdin, $stdout, $stdlog, $parm_debug_on; 
 $pm = 0; 
 if ($wtime > 1159 ) 
 { 
 $wtime -=1200; 
 $pm = 1; 
 } 
 if ($wtime <= 59 ) 
 $wtime += 1200 
 if ( strlen( $wtime ) == 3 ) 
 $wtime = '0' . $wtime; 
 $h = substr( $wtime, 0, 2 ); 
 $h1 = substr( $wtime, 0, 1 ); 
 $h2 = substr( $wtime, 1, 1 ); 
 $m = substr( $wtime, 2, 2 ); 
 $m1 = substr( $wtime, 2, 1); 
 $m2 = substr( $wtime, 3, 1); 
 if ($parm_debug_on) 
 fputs( $stdlog, "Wakeup time is set to $wtime\n" ); 
 $rc = execute_agi( "STREAM FILE rqsted-wakeup-for \"\" "); 
 if ( !$rc[result] ) 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 103 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 { 
 if ( $h1 == 0 ) 
 $rc = execute_agi( "SAY NUMBER $h2 \"\""); 
 else 
 $rc = execute_agi( "SAY NUMBER $h \"\""); 
 if ( !$rc[result] ) 
 { 
 if ($m == 0 ) 
 $rc = execute_agi( "STREAM FILE digits/oclock \"\" "); 
 else 
 { 
 if ( $m1 == 0 ) 
 { 
 $rc = execute_agi( "STREAM FILE digits/oh \"\" "); 
 $rc = execute_agi( "SAY NUMBER $m2 \"\" "); 
 } 
 else 
 $rc = execute_agi( "SAY NUMBER $m \"\""); 
 } 
 if ( !$rc[result] ) 
 { 
 if ( $pm ) 
 $rc = execute_agi( "STREAM FILE digits/p-m \"\" "); 
 else 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 104 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 $rc = execute_agi( "STREAM FILE digits/a-m \"\" "); 
 } 
 } 
 } 
} 
//-------------------------------------------------- 
// This function will send out the command and get 
// the response back 
function execute_agi( $command ) 
{ 
 GLOBAL $stdin, $stdout, $stdlog, $parm_debug_on; 
 fputs( $stdout, $command . "\n" ); 
 fflush( $stdout ); 
 if ($parm_debug_on) 
 fputs( $stdlog, $command . "\n" ); 
 $resp = fgets( $stdin, 4096 ); 
 if ($parm_debug_on) 
 fputs( $stdlog, $resp ); 
 if ( preg_match("/^([0-9]{1,3}) (.*)/", $resp, $matches) ) 
 { 
 if (preg_match('/result=([-0-9a-zA-Z]*)(.*)/', $matches[2], $match)) 
 { 
 $arr['code'] = $matches[1]; 
 $arr['result'] = $match[1]; 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 105 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
 if (isset($match[3]) && $match[3]) 
 $arr['data'] = $match[3]; 
 return $arr; 
 } 
 else 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "Couldn't figure out returned string, Returning 
code=$matches[1] result=0\n" ); 
 $arr['code'] = $matches[1]; 
 $arr['result'] = 0; 
 return $arr; 
 } 
 } 
 else 
 { 
 if ($parm_debug_on) 
 fputs( $stdlog, "Could not process string, Returning -1\n" ); 
 $arr['code'] = -1; 
 $arr['result'] = -1; 
 return $arr; 
 } 
} 
?> 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 106 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
4.5 Kết quả thực nghiệm 
Hình 4.11 Các SIP đăng ký vào server 
Hình 4.12 Agents login vào hệ thống 
Hình 4.13 Thuê bao gọi đến tổng đài 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 107 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.14 Nhấn phím 1 đến quà tặng âm nhạc 
Hình 4.15 Nhập mã số bài hát 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 108 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.16 Nhập số điện thoại đƣợc tặng 
Hình 4.17 Nhập giờ phút gửi bài hát 
Hình 4.18 Nhập ngày tháng năm gửi bài hát 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 109 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.19 Để lại lời nhắn 
Hình 4.20 Nhấn phím 0 gặp nhân viên tƣ vấn 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 110 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.21 Kết thúc cuộc gọi sau 30s không nhận đƣợc phím nhấn 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 111 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
Hình 4.22 Tổng đài gọi đến số điện thoại đƣợc yêu cầu 
Hình 4.23 Trả lời và nhận quà tặng từ tổng đài 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 112 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
KẾT LUẬN 
Asterisk là một phần mềm mã nguồn mở nhỏ gọn, linh hoạt, mạnh mẽ nhƣng 
cũng không kém phần phức tạp. Đồ án này mới chỉ đề cập đến hai chức năng đƣợc 
sử dụng chủ yếu của Asterisk là Chuyển Mạch Mềm (SoftSwitch) và Lập trình Ứng 
dụng trên nền Asterisk sử dụng giao diện lập trình Asterisk. Do khuôn khổ của đồ 
án nên còn nhiều vấn đề khác mà em chƣa thể trình bày. 
Các kết quả đã đạt đƣợc trong đồ án tốt nghiệp này: 
Làm chủ đƣợc hệ thống Linux - Asterisk: cài đặt, cấu hình, quản trị. 
Xây dựng đƣợc ứng dụng là dịch vụ quà tặng âm nhạc 
Hệ thống đảm bảo chất lƣợng cuộc gọi tốt và ổn định trong mạng LAN 
Tuy nhiên đồ án chỉ dừng lại ở việc test với các Softphone trong cùng một mạng 
LAN nên chất lƣợng tốt và ổn định, còn chƣa thực hiện đối với mạng PSTN nên 
chƣa đánh giá đƣợc chất lƣợng cuộc gọi trong trƣờng hợp này. 
HƯỚNG PHÁT TRIỂN 
Hoạt động với mạng PSTN 
Xây dựng thêm các dịch vụ mới nhƣ tra cứu thông tin chứng khoán,Tỷ giá đô 
la, dự báo thời tiết… 
 Nghiên cứu các cơ chế bảo mật cho Asterisk, xây dựng hệ thống điện thoại 
Internet đảm bảo an toàn 
 Tìm hiểu cách nâng cao hiệu năng và chất lƣợng cho hệ thống VoIP nhằm 
đáp ứng đƣợc số lƣợng ngƣời dùng nhiều hơn nữa. 
 Nghiên cứu điện thoại qua Internet: nghiên cứu, cài đặt, quản trị… 
PHỤ LỤC 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 113 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
DANH MỤC CÁC THUẬT NGỮ VÀ TỪ VIẾT TẮT 
1. QoS Quality of Service 
2. Codec COder/DECoder 
3. IAX Inter Asterisk eXchange 
4. PBX Private Branch Exchange 
5. PSTN Public Switched Telephone Network 
6. TDM Time Division Multiplexing 
7. VoIP Voice over Internet Protocol 
8. PCM Pulse Code 
9. RTP Real-time Transport Protocol 
10. RTCP Real Time Control Protocol 
11. SCCP Signaling Connection Control Part 
12. RTSP Real Time Streaming Protocol 
13. SIP Session Initiation 
14. NGN Next Generation Network 
15. IVR Interactive Voice Response 
16. AGI Asterisk Gateway Interface 
17. API Application Programming Interface 
18. NAT Network Address Translator 
19. PRI Primary Rate ISDN 
20. ACD Advanced Call Distribution 
21. AMP Asterisk Management Platform 
22. ATA Analog Terminal Adaptor 
23. CDR Call Detail Records 
24. CGI Control Gate Interface 
25. CRM Customer Relationship Management 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 114 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
26. MGCP Media Gateway Control Protocol 
27. NAT Network Address Translator 
28. POTS Plain Old Telephone Service 
29. PRI Primary Rate ISDN 
30. RADIUS Remote Authentication Dial In User Service 
31. SER SIP Express Route 
Tài liệu tham khảo 
Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk Trang 115 
Chương IV : Xây dựng trung tâm quà tặng âm nhạc trên nền Asterisk 
[1] RFC 3261 SIP : Session Initiation Protocol 
[2] RFC 3550 RTP : Real-time Transport Protocol 
[3] RFC 3605 RTCP : Real-time Control Protocol 
[4] Jonathan Davidson, Jame Peter, Manoj Bhatia, Satish Kalodindi, Sudipto 
Mukherjee 
“ Voice over IP Fundamentals, Second Edition ” 
Cisco.Press.Voice.over.IP.Fundamentals.2
nd
.Edition.Jul.2006.chm 
[5] Protocol of VoIP :  
[6] Wiley Publishing, Inc- VoIP for Dumies - by Timothy Kelly 
[7] Building Telephony Systems With Asterisk- David Gomillion Barrie 
Dempster 
[8] Asterisk - The future of Telephony - 2nd Edition-O’reilly Publisher 
[9] Đồ án tốt nghiệp mạng thế hệ mới NGN cua Đỗ Hoàng Tiến-ĐTVT3-K45-
ĐHBKHN 
[10] Một số tài liệu tiếng Việt khác về công nghệ VoIP, điện thoại Internet, 
Mạng thế hệ mới, Asterisk… 
[11]  
[12]