- vào file /var/www/html/admin/modules/votes/functions.inc.php
- sửa function fill_arr1() sửa dòng for ($i=1001;$i<=1007;$i++) for ($i=1001;$i<=1008;$i++) (giả sử ta thêm 1 dịch vụ mới trên node 1008 ta có thể tăng dần dần lên). - Sau đó ta vào table tbl_node thêm node_id 1008 vào table và save lại. - Sau đó vào web để edit node 1008 - Sau đó tiếp tục thêm các node con vào - Có thể thêm các module mới vào hệ thống trang web trong /var/www/html/admin/modules - Thêm các module trong đó, hiện tại đang active 3 module Basic, friendsclub, votes, việc active các module có thể làm trong database asterisk trong table modules set trường enable lên 1. - Cấu trúc của mỗi module bao gồm file module.xml : ví dụ:
votes Votes setup 0.1 Music Present
Collecting best songs and best singers.
Singers
Songs
WaitSongs
Nodes
Votes
Voicemails
reports release/votes-0.1.tgz http://www.áldkjf.com
Mỗi menuitems là 1 trang php có dạng page.”name”.php và các hàm sử dụng chung nằm trong file functions.inc.php
2. Thay đổi action trong database
Vào database asterisk dùng lệnh select: “select * from tbl_nodeaction WHERE node_id like "1008%"”
Sau đó có thể set các action phù hợp với các action trong file common.pm trong thư mục /var/lib/asterisk/agi-bin
3. Viết script trên server asterisk
Trong thư mục /var/lib/asterisk/agi-bin tạo file node_1008_c14.pl và file common14.pm
Nội dung file node_1008_c14.pl:
#!/usr/bin/perl
# ======================================================================
# ======================================================================
require "/var/lib/asterisk/agi-bin/Common14.pm"; # thay đổi trùng tên file library
my $TIME_STAMP = gmtime();
my $LOGFILE = "/tmp/node_1008.log"; # nơi chứa file log
# create new AGI object
my $agi = new AGI();
$agi->setcallback(\&userhangup);
my %input = $agi->ReadParse();
# Get so bi goi
my $cid=$input{'callerid'};
my $conn = clsDBConnection->new();
my $my_root_node=1008; # root node tùy từng dịch vụ là id của dịch vụ
my $debug= 0;# có ghi log lại hay ko, 1 là có , 0 là ko.
# query root node infor
my $sql = "SELECT node_id, p_node_id, description, prompt, prompt_text,autoexec,dtmfs"
. " FROM tbl_node where node_id=$my_root_node";
$conn->query($sql);
my ($id, $pid, $desc, $prompt, $prompt_text,$autoexec,$dtmfs) = $conn->{sth}->fetchrow_array();
# create root node
my $root_node = clsAANode->new($agi,$conn,$cid,$debug,$id, $pid, $desc, $prompt, $prompt_text,$autoexec,$dtmfs);
# run auto attendant scrip
execute_aa($root_node);
# Hangup call
$agi->hangup();
# Release all resources
$conn = undef;
# exit normally
exit 0;
sub execute_aa() {
my $node = shift;
return if(!defined($node));
# loading node actions
$node->load_node_actions();
my $next_node = undef;
my $count = 0;
do {
# run this node
$next_node = $node->run_node();
$count++;
} while(($next_node == $node) && ($count < debug ="="" usercode =" @_;" data =" shift;">>" . $LOGFILE or die "Can't open log file\n";
print LOG $TIME_STAMP . " -- " . $data . "\n";
close LOG;
}
Chỉ thay đổi các phần chữ màu đỏ mỗi khi khởi tạo dịch vụ mới.
Đối với file Common14.pm chỉ cần chú ý các phần sau:
package clsAANode;
# action definition
$ACT_NODE = 1;
$ACT_PLAY = 2;
$ACT_CODE = 3;
$ACT_SIGR = 4;
$ACT_MESG = 5;
$ACT_BACK = 6;
$ACT_RECO = 7;
$ACT_LIST = 8;
$ACT_LIST_CODE = 9;
$ACT_RECO1 = 10;
$ACT_RECO2 = 11;
$ACT_LIST_CODE1 = 12;
$ACT_LIST_CODE2 = 13;
$ACT_PLAY1 = 14;
$ACT_PLAY2 = 16;
$ACT_RECO3 = 15;
Phần này định nghĩa các action trong table tbl_nodeaction
sub new() {
my ($class,$agi,$conn,$callerid,$debug,$node_id, $p_node_id,$description, $prompt, $prompt_text,$autoexec,$dtmfs) = @_;
my $self = {};
$self->{agi} = $agi;
$self->{dbconn} = $conn;
$self->{cid} = $callerid;
$self->{debug} = $debug;
$self->{node_id} = $node_id;
$self->{p_node_id} = $p_node_id;
$self->{description} = $description;
$self->{prompt} = $prompt;
$self->{prompt_text} = $prompt_text;
$self->{autoexec} = $autoexec;
$self->{dtmfs} = $dtmfs;
$self->{node_actions} = undef;
$self->{sound_dir} = "/var/lib/asterisk/sounds/";
$self->{music_dir} = "/var/lib/asterisk/sounds/1900/music/";
$self->{record_dir} = "/var/lib/asterisk/sounds/1900/record/";
$self->{sound_dir_1900} = "/var/lib/asterisk/sounds/1900/sounds/";
$self->{child_dir} = "/var/lib/asterisk/sounds/1900/child_record/";
$self->{child_dir_hat} = "/var/lib/asterisk/sounds/1900/child_record/thi_hat/";
$self->{child_dir_kechuyen} = "/var/lib/asterisk/sounds/1900/child_record/ke_chuyen/";
$self->{child_dir_duyet} = "/var/lib/asterisk/sounds/1900/child_record/duyet_record/";
$self->{child_dir_vuihoc} = "/var/lib/asterisk/sounds/1900/child_record/VuiHoc/";
$self->{nums_of_aciton} = 0;
bless($self, $class);
}
Chỉ thay đổi các phần chữ màu xanh, định nghĩa các đường dẫn trong code.
sub run_action() {
if($act->{action} == $ACT_NODE) {
&log_to_file("action_value= $act->{action_value}") if ($self->{debug}==1);
my $new_node = create_node($self->{agi},$self->{dbconn},$self->{cid},$self->{debug},$act->{action_value});
return $new_node;
} elsif($act->{action} == $ACT_BACK) {
$new_node = $self->get_parent_node();
if(!defined($new_node)) {
return undef;
}
return $new_node;
}elsif($act->{action} == $ACT_PLAY) {
my $get_key=$self->music_play($dtmf); #hàm chạy action
&log_to_file("get_key = $get_key") if ($self->{debug}==1);
if ($get_key eq '9'){
&log_to_file("action_value= $act->{action_value}") if ($self->{debug}==1);
my $new_node = create_node($self->{agi},$self->{dbconn},$self->{cid},$self->{debug},$self->{node_id});
return $new_node;
}elsif ($get_key eq '*'){
&log_to_file("action_value= $act->{action_value}") if ($self->{debug}==1);
my $new_node = create_node($self->{agi},$self->{dbconn},$self->{cid},$self->{debug},1008);
return $new_node;
}
}
}
Cuối cùng ta chỉ cần implement hàm chạy action là được.
File common.pm là của phần music. File common1.pm là của phần kết bạn.
4. config asterisk để chạy dịch vụ:
vào thư mục: /etc/asterisk
chú ý các file: extensions.conf, sip.conf, unicall.conf.
trong file extensions.conf
[MT559_0]
exten => 0,1,AGI(node_0_c0.pl)
exten => h,1,hangup()
[MT559_1] # nhánh tổng đài 1900561599 và nhánh 1
exten => 1,1,AGI(node_1008_c14.pl)
exten => h,1,hangup()
Không có nhận xét nào:
Đăng nhận xét