Chức năng hội thoại cho phép nhiều người có thể cùng nhau trao đổi nói chuyện với nhau, nơi mà mọi người cùng gọi đến để trao đổi nói chuyện gọi là phòng hội thoại “room”, Asterisk cho phép tạo ra nhiều phòng hội thoại “room” tuỳ vào nhu cầu người sử dụng. Trong hệ thống điện thoại truyền thống PSTN để có thể sử dụng được tính năng này chúng ta phải trả tiền còn đối với Asterisk là miễn phí. Để sử dụng hội nghị, thuê bao nội bộ cần bấm số 555, nghe thông báo mời nhập mật
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 122 -
khẩu (600), sau khi nhập mật khẩu đúng sẽ nghe lời gọi cảm ơn và bây giờ thuê bao có thể tham gia hội nghị.
Hình 5.26: Mô hình thực hiện hội nghị
Để cấu hình thực hiện một phòng hội thoại “room” chúng ta lần lượt cấu hình như sau:
* File /etc/asterisk/meetme.conf: tạo ra phòng hội thoại “room”
conf => 600 ; tạo phòng hội nghị 600
hoặc
conf => 600,12345; 600 là tên phòng , 12345 là mật khẩu đăng nhập
* File /etc/asterisk/extentions.conf: khai báo phòng hội thoại “room” trong kế hoạch dialplan để cho mọi người có thể gọi đến. Sử dụng câu lệnh có cấu trúc như sau:
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 123 -
MeetMe([confno][,[options][,pin]])
Trong đó:
Confno con số của phòng hội thoại nếu thông số này không khai báo thì khi đăng nhập hệ thống sẽ yêu cầu nhập vào.
Pinsố mật khẩu đăng nhập.
Options là thông số lựa chọn không có hoặc có nhiều thông số kết hợp với nhau để xác định một số chức năng hoạt động của phòng hội thoại, các chức năng có thể liệt kê ra như sau:
'm' – Người tham gia hội thoại chỉ nghe không được nói chuyện. 't' – Người hội thoại chỉ nói không được nghe.
'i' – Phát thông báo có người kết nối hay rời khỏi hàng đợi.
'p' – Thuê bao có thể rời khỏi phòng hội thoại bằng cách nhấn phím #. 'X' – Thuê bao có thể thoát khỏi phòng hội thoại bằng cách nhập vào extention hợp lệ tại ngữ cảnh ${MEETME_EXIT_CONTEXT }, nếu biến này không
được thiết lập thì sử dụng extention trong ngữ cảnh hiện tại.
'd' – Thêm động vào phòng hội thoại không cần thiết lập số Pin. 'D' – Thêm động vào phòng hội thoại phải cần thiết lập số Pin. 'e' – Chọn phòng hội thoại trống đầu tiên.
'E' – Chọn phòng hội thoại trống đầu tiên không cần số Pin. 'v' – Hội thoại với chếđộ Video.
'r' – Nếu chức năng này được chọn thì cuộc đàm thoại trong phòng hội thoại sẽ được thu âm với định dạng tập tin ${MEETME_RECORDINGFORMAT} và lưu vào vị trí ${MEETME_RECORDINGFILE}.
'q' – Không phát âm thanh khi có thuê bao vào/rời khỏi phòng hội thoại. 'C' – Khi thuê bao vào phòng hội thoại sẽđược thông báo có bao nhiêu thuê bao đang trong phòng.
'M' – Thiết lập thông số này để phát ra âm nhạc khi trong phòng hội thoại chỉ có một người.
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 124 -
'w' – Đợi cho đến khi thuê bao “Chủ” đến phòng hội thoại. 'b' – Chạy AGI script để thiết lập biến
{MEETME_AGI_BACKGROUND},script mặc định là conf-background.agi 's' – Vào menu (user and administrator) khi nhấn phím *.
'a' – Thiết lập chếđộ Admin. 'A' – Thiết lập chếđộ “Chủ” .
'P' – Luôn luôn hỏi số Pin ngay cả đã chỉ định trong đối số hàm ứng dụng meetme().
Các Biến sử dụng trong hàm ứng dụng Meetme()
${MEETME_RECORDINGFILE} – Tập tin thu âm cuộc hội thoại ( option 'r' ).
${MEETME_RECORDINGFORMAT} – Định dạng tập tin thu âm(gsm, wav, ...).
${MEETME_EXIT_CONTEXT} – Ngữ cảnh thoát ra từ phòng hội thoại. ${MEETME_AGI_BACKGROUND} – AGI script .
${MEETMESECS} – Số giây thuê bao trong phòng hội thoại.
Dưới đây là nội dung file cấu hình với ngữ cảnh Meetme:
[Meetme] exten => 999,1,Answer exten => 999,2,Wait(1) exten => 999,3,Authenticate(600) exten => 999,4,MeetMe(600) exten => 999,5,Playback(conf-thereare)
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 125 -
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 126 -
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 127 -
Hình 5.27: Các bản tin khi thực hiện chức năng hội nghị
5.8.8 DND (Do not Disturb - Dịch vụ chống làm phiền )
Dịch vụ này có thể cho phép thuê bao không nhận tất cả các cuộc gọi đến khi thuê bao kích hoạt dịch vụ, khi đó tất cả các cuộc gọi đến thuê bao sẽ được chuyển đến voicemail. Để kích hoạt dịch vụ, thuê bao bấm số *113, nghe phát thông báo “Bạn đã kích hoạt dịch vụ chống làm phiền”. Để hủy dịch vụ DND, thuê bao chỉ cần bấm lại số *113, nghe phát thông báo “Bạn đã hủy dịch vụ chống làm phiền”.
Việc cấu hình chi tiết được thực hiện trong file etc/asterisk/extensions.conf với ngữ cảnh DND.
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 128 -
[DND] ;Dịch vụđã kích hoạt? exten => *113,1,gotoif($[${DB(dnd/${CALLERID(num)})} = 1]?dn1:dn) ;Kích hoạt dịch vụ exten => *113,n(dn),set(DB(dnd/${CALLERID(num)})=1) exten => *113,n,Answer exten => *113,n,playback(dnd-o); phát lời gọi exten => *113,n,playback(auth-thankyou) exten => *113,n,Hangup;Hủy kết nối exten => *113,n(dn1);Answer exten => *113,n,set(DB(dnd/${CALLERID(num)})=0);Hủy dịch vụ exten => *113,n,playback(dnd-no);phát lời gọi exten => *113,n,playback(auth-thankyou) exten => *113,n,Hangup
5.8.9 DISA (Direct Inward System Access)
Dịch vụ cho phép thuê bao ở ngoài có thể sử dụng các dịch vụ mà thuê bao nội bộ trong mạng có thể có. Đây là một tính năng vượt trội của asterisk so với giá thành của nó. Ví dụ như một người ở nhà và muốn làm việc với đối tác ở nước ngoài, nhưng đây là công việc của công ty và anh ta muốn sử dụng đường line điện thoại công ty để giao dịch. Đối với asterisk, sử dụng giải pháp DISA có thể giải quyết vấn đề này một cách dễ dàng. Như vậy người này có thể sử dụng cuộc gọi tính cước nội hạt đối với anh ta nhưng vẫn có thể gọi ra quốc tế.
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 129 -
Hình 5.28: Mô hình thực hiện dịch vụ DISA
Ví dụ một người có số điện thoại ở nhà là 8991717, gọi đến công ty có 2 line điện thoại đăng ký trên tổng đài PSTN có số là 8991768 và 8982525, giả sử người đó gọi đến số 8991768 để sử dụng dịch vụ DISA, người đó sẽ thực hiện như sau:
- Thuê bao nghe lời chào từ tổng đài asterisk, bấm 000 để sử dụng dịch vụ DISA, sau đó nhập mật khẩu để xác nhận.
- Nếu mật khẩu đúng, tổng đài sẽ phát âm mời gọi để thuê bao có thể thực hiện cuộc gọi quốc tế hay liên tỉnh thông qua line còn lại có số là 8982525. Như vậy người gọi đã sử dụng được dịch vụ DISA như mong muốn.
Việc cấu hình trong file /etc/asterisk/extensions.conf được thực hiện thông qua ngữ cảnh custom-disa như sau:
[custom-disa] exten => s,1,Answer exten=> s,2,wait(2)
exten => s,3,Authenticate(700) exten => s,4,DISA(no-password,out)
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 130 -
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 131 -
Hình 5.29:Các gói tin khi thực hiện dịch vụ DISA
5.8.10 Asterisk RealTime Architecture
Như chúng ta đã biết để cấu hình hệ thống Asterisk chúng ta thực hiện trên các tập tin dạng text như sip.conf, iax.conf. extentions.conf... sau đó để tập tin cấu hình có hiệu lực chúng ta cần phải phải thực hiện dòng lệnh CLI>reload
Một nhu cầu thực tế là khi cấu hình hệ thống asterisk, chẳng hạn như cho người sử dụng khai báo một thuê bao online mà không cần phải reload lại hệ thống asterisk thì thực hiện như thế nào.?
Thế là kiến trúc thời gian thực (Asterisk RealTime Architecture) ra đời nhằm đáp ứng nhu cầu thực tế trên và tất nhiên còn nhiều điều thú vị nữa chúng ta hãy cùng nhau khám phá.
Kiến trúc thời gian thực thay vì lưu tập tin cấu hình trên tập tin dạng text thì được lưu vào database ví dụ như Mysql. Kiểu kiến trúc thời gian thực đáp ứng nhu cầu user lớn vì không cần nạp tất cả user cùng một lúc ngay khi khởi động asterisk, tiết kiệm chi phí tài nguyên hệ thống rất nhiều.
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 132 -
Asterisk không nạp danh sách các Sip peer/Sip User vào bộ nhớ. Khi có một cuộc gọi tới( incoming call) một extension do Asterisk quản lý được Asterisk tìm kiếm trong bảng( có chức năng tương tự SIP.conf) của Database đã được định hướng trong file SIP.conf.
Asterisk sẽ nạp cả dòng (record) chứa extension vào bộ nhớ. Đồng thời tiếp tục thực hiện hàm ứng dụng application đã được khai báo trong bảng chứa dialplan, được định hướng trong file extension.conf và file sip.conf. Cuộc gọi được thiết lập.
Khi một trong 2 bên truyền thông phát ra lệnh hangup thì Asterisk sẽ phát tín hiệu kết thúc kênh truyền thông giữa 2 thiết bị đầu cuối và xóa Record đã nạp vào bộ nhớ. Như vậy, Asterisk tra cứu Extension theo kiểu thời gian thực trái với trước kia là nó load tất cả các extension trong file sip.conf vào bộ nhớ.
Để thực hiện được dịch vụ này, ta phải tiến hành cài đặt và cấu hình Asterisk-addons.1.4.x và Mysql server. Đây là dịch vụ cộng thêm không có sẵn trong asterisk phải cài đặt thêm và chúng ta cần có một chương trình cơ sở dữ liệu để lưu các dữ liệu đáp ứng thời gian thực của asterisk, ở đây chúng ta dùng mysql. Các bước tiến hành cài đặt được tiến hành như sau:
Bước 1: download gói Asterisk-addons.1.4.x tại http://asterisk.org và untar vào thư mục /usr/src
Để đảm bảo gói Addon được cài đặt đúng, ta thực hiện lệnh #ln –s /usr/src/asterisk-1.4.x /usr/src/asterisk
Chuyển đường dẫn vào thư mục asterisk-addons1.4.x và tiến hành cài đặt #cd /usr/src/asterisk-addons1.4.x
#make clean #make install
Bước 2: kiểm tra xem đã cài đặt Mysql server chưa, nếu chưa thì tiến hành
download và cài đặt Mysql server và các thư viện kèm theo: libdbi-dbd-mysql, mysql-connector-odbc-3.51.12-2.2, mysql-libs, mysql, mysql-server, mysql-devel
Bước 3: cấu hình các file trong thư mục asterisk:
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 133 -
[general] dbhost = localhost dbname = asterisk dbuser = root dbpass = 123 dbport = 3306 dbsock = /var/lib/mysql/mysql.sock * File /etc/asterisk/extconfig.conf:
sipusers => mysql, asterisk,sip_buddies sippeers => mysql, asterisk,sip_buddies extensions => mysql, asterisk,extensions
* File /etc/asterisk/sip.conf [general] rtcachefriends=yes * File /etc/asterisk/extensions.conf [default] switch => Realtime/default@extensions
Bước 4: tạo database và các bản tương ứng:
-Khởi động mysql : /etc/rc.d/init.d/mysqld start
-SET lại password cho truy cập tới Mysql cho user root: SET PASSWORD FOR root@localhost = ‘123’
-Đăng nhập vào mysql : mysql –u root –p 123
-Tạo cở sở dữ liệu mới : creat database asterisk; use asterisk;
- Tạo ra các bảng để chứa cơ sở dữ liệu : create tables Sip_buddies và Iax_buddies
CREATE TABLE ` Sip_buddies ` ( `id` int(11) NOT NULL auto_increment, `name` varchar(80) NOT NULL default '', `canreinvite` char(3) default 'yes',
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 134 -
`context` varchar(80) default NULL, `dtmfmode` varchar(7) default NULL, `host` varchar(31) NOT NULL default '', `port` varchar(5) NOT NULL default '', `secret` varchar(80) default NULL,
`type` varchar(6) NOT NULL default 'friend', `username` varchar(80) NOT NULL default '', PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`), KEY `name_2` (`name`)
) TYPE=MyISAM ROW_FORMAT=DYNAMIC; CREATE TABLE ` Iax_buddies ` (
`id` int(11) NOT NULL auto_increment, `name` varchar(80) NOT NULL default '', `canreinvite` char(3) default 'yes',
`context` varchar(80) default NULL, `dtmfmode` varchar(7) default NULL, `host` varchar(31) NOT NULL default '', `port` varchar(5) NOT NULL default '', `secret` varchar(80) default NULL,
`type` varchar(6) NOT NULL default 'friend', `username` varchar(80) NOT NULL default '', PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`), KEY `name_2` (`name`)
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 135 -
Bước 5: ta có thể tạo được user thông qua database của asterisk bằng cách thêm dữ liệu vào table Sip_buddies và Iax_buddies
INSERT INTO Sip_buddies (
name,canreinvite,context,dtmfmode,host,port,type,username,secret) VALUES ('105','no','default','rfc2833','dynamic','yes',’friend’, '105','105'); INSERT INTO Iax_buddies (
name,canreinvite,context,dtmfmode,host,port,type,username,secret) VALUES ('305','no','default','rfc2833','dynamic','yes',’friend’, '305','305');
Bước 6: kiểm tra user vừa tạo bằng lệnh select table
| id | name | canreinvite | context | dtmfmode | host | port | secret | type | username | +----+---+---+---+---+---+---+---+---+--- +
| 1 | 105 | no | default | rfc2833 | dynamic | yes | 105 | friend | 105 |
| 1 | 305 | no | default | rfc2833 | dynamic | yes | 305 | friend | 305 | +----+---+---+---+---+---+---+---+--- +
Như vậy ta đã tạo được thuê bao 105 và 305 mà không cần cấu hình trong các file asterisk và cũng không cần reload lại hệ thống
5.8.11 CDR (Call Detail Record)
Asterisk hỗ trợ việc lưu trữ các thông tin cuộc gọi trong cơ sở dữ liệu để tiện việc tra cứu . Cũng như ta có thể so sánh các thông tin này với hóa đơn hàng tháng của công ty điện thoại gởi cho ta . Nó cho phép ta phân tích lưu lượng thoại trong công ty , tìm ra 10 số phone thường gọi nhất , xem thời gian của các cuộc gọi , so sánh với thời gian trung bình trong các cuộc gọi . Nhờ vậy, ta hoàn toàn có thể phát hiện được việc liệu nhân viên công ty có sử dụng điện thoại một cách hoang phí trong giờ làm việc hay không . Việc sử dụng CDR có thể sử dụng database Mysql
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 136 -
để lưu các nhật ký cuộc gọi. Việc cài đặt và cấu hình CDR được cấu hình theo các bước sau:
Bước 1: cấu hình trong file /etc/asterisk/cdr_mysql.conf
[global] hostname=localhost dbname=asterisk password=123 passworduser=asterisklog uniqueid=yes
Bước 2: tạo bảng `table cdr` lưu trữ database chi tiết cuộc gọi ở mysql và
reload lại asterisk:
CREATE TABLE `cdr` (
`id` int(11) NOT NULL auto_increment,
`calldate` datetime NOT NULL default '0000-00-00 00:00:00', `clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '', `dst` varchar(80) NOT NULL default '', `dcontext` varchar(80) NOT NULL default '', `duration` int(11) NOT NULL default '0', `billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '', PRIMARY KEY (`id`);
ALTER TABLE `cdr` ADD INDEX ( `calldate` ); ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );
Bước 3: Sử dụng ngôn ngữ lập trình PHP tạo giao diện web kết nối với
database asterisk để truy xuất dữ liệu. Tạo một file asterisk.php ở /usr/local/apache2/htdocs. Đoạn code thực hiện như sau:
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 137 -
<?php
echo"<image src='http://192.168.1.3/asterisk.gif '>"; ?>
<html> <head>
<title>Asterisk with CDR</title> <style> .title { FONT-WEIGHT: bold; FONT-SIZE: 30px; COLOR: #003063; } </style> </head> <body>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TR>
<TD vAlign=top class=title align=center> *** CHI TIẾT CUỘC GỌI *** </TD> </TR> </table> <? $dbuser = 'root'; $dbhost = 'localhost';
SVTH: NGUYỂN THANH HIẾU GVHD: Ths. PHẠM THỊ XUÂN PHƯƠNG NGUYỄN THANH PHƯỚC - 138 -
$dbpass = '123'; $dbname = 'asterisk'; $dbtable = 'cdr';
$mysql_link = mysql_connect('localhost','root','123');
$column = mysql_list_fields($dbname, $dbtable, $mysql_link); $sql = "SELECT * FROM $dbtable";