3. Ngày giao nhiệm vụ luận văn:
6.2.2. Kết hợp giữa AGI và Web Service trong tổng đài Asterisk
Mô hình sau đây biểu diễn cách kết hợp giữa AGI và Web Service trong tổng đài Asterisk.
Hình 6.4 Kết nối giữa Asterisk và Web Service
Mọi thông điệp của cuộc gọi từ Asterisk đến Proxy bao gồm hai thành phần: AGIRequest và AGIChannel. AGIRequest sẽ chứa các thông tin của cuộc gọi nhƣ: caller name/ number, context of the call, feed setings…AGIChannel đƣợc sử dụng khi kết nối với Asterisk kết thúc ( call termination, tranfer mode…). Sau đó Proxy se gửi một HTTP yêu cầu đến web service với URL đã đƣợc set. Web Services sẽ trả lời tùy thuộc vào yêu cầu đƣợc gửi tới: cuộc gọi sẽ kết thúc, bị chuyển hoặc nhận đƣợc một thông báọ.. Và thông điệp từ Web Services đƣợc định dạng theo kiểu XML. Từ đây chúng ta có thể dùng PHP-XML để xử lý tệp XML trả về các thông số cần thiết để xử dụng với mục đích của chúng tạ
- 46 -
Tài liệu tham khảo
[1] Lê Quốc Toàn, Sách Asterisk tiếng việt
[2] Jim Van Megglen and Leif Madsen and Jared Smith (2007). Asterisk: the future of telephonỵ ÓReilly Media, Inc
[3] David Gomillion and Barie Dempster (2009). Building feature- rich telephony systems with Asterisk. Packt Publishing Ltd
[4] Flavio Ẹ Goncalves (2010). Getting Started with Asterisk. V.Office Networks
[5] Paul Mahle(2004). VoIP Telephony with Asterisk. Signate, LLC
[6] Nir Simionovich (2009), Asterisk Gateway Interface 1.4 and 1.6 Programming. Packt Publishing [7] http://www.voip-infọorg [8] http://phpagịsourceforgẹnet [9] http://www.php.net [10] http://www.w3schools.com [11] http://www.wikipediạorg [12] http://mỵoperạcom/asteriskvn/blog/ [13] http://tutorial.phpvn.org/ [14] http://vnvoip.info/
- 47 -
Phụ lục 1:
Cài đặt Asterisk
Cài đặt Asterisk
Để cài đặt Asterisk, đầu tiên chúng ta cần phải cài đặt hệ điều hành linux trên máy tính của mình. Có thể cài hệ điều hành Linux Fedora , CentOS, Redhat, hoặc Ubuntụ Ở đây nhóm chọn hệ điều hành Ubuntu làm nền tảng cho hệ thống tổng đài Asterisk
Download các gói phần mềm DAHDI, lipri, Asterisk Ađons và Asterisk theo link: http://www.asterisk.org/downloads
- Giải nén chúng vào thƣ mục /usr/src/asterisk
Cài đặt gói DAHDI:
$ cd /usr/src/asterisk/dahdi $ make clean;make install
Cài đặt gói Libpri:
$ cd /usr/src/asterisk/libpri $ make clean;make install
Cài đặt gói Asterisk:
Cài đặt các gói phụ trợ
$ apt-get install cvs build-essential automake autoconf bison flex libtool libncurses5-dev libssl-dev php5 php5-cli php5-curl php5-gd php5-mysql mysql-server php-pear php-db curl sox apache2 subversion libssl-dev libmysqlclient15-dev libcurl4-gnutls-dev libxml2 libxml2- dev
- 48 - Cài đặt Asterisk
$ cd /usr/src/asterisk/asterisk $ ./configure
$ make clean;make install
Sau khi cài đặt thành công ta thực hiện tiếp 2 lệnh sau:
$ make samples ; Tạo ra những file cấu hình sẵn
$ make config ; Chạy cùng hệ thống khi khởi động
Cài đặt gói Asterisk Ađons:
$ cd /usr/src/asterisk/asterisk_ađons $ ./configure
$ make clean;make install $ make samples
$ make config
Cài đặt Softphone
Softphone đƣợc sử dụng ở đây là phần mềm X-Lite, 3CX và ZoiperFreẹ Các phần mềm này có thể dể dàng đƣợc tìm thấy trên internet.
- 49 -
Phụ lục 2:
Các lệnh tham khảo trong AGI
Answer
- Cấu trúc: array, answer()
- Chức năng: Trả lời các kênh
- Kết quả: -1: Lỗi
0: Thành công
- Ví dụ: $agi answer();
Exec
- Cấu trúc: array, exec (string $application, mixed $options)
- Chức năng: Thực hiện những ứng dụng đặc biệt của Asterisk, kèm theo là những lựa chọn cụ thể cho từng ứng dụng
- Kết quả: -2: không có ứng dụng này
Value: Trả về kết quả cho ứng dụng này
- Ví dụ: $agi->exec("musiconhold","1") : Thực hiện musiconhold với tính chất ứng với mục [1] trong musiconhold.conf
$agi exec("Dial","sip/101"): Thực hiện cuộc gọi đến điện thoại 101 Get_data
- Cấu trúc: array, get_data (string $filename, [integer $timeout = NULL], [integer $max_digits = NULL])
- Chức năng: phát ra một file audio và nhận một DTMF, file audio đƣợc mặc định nằm trong /var/lib/asterisk/sounds, nếu sau khi file âm thanh phát xong, ngƣời dùng không nhấn một digit nào thì sau một khoảng thời gian $timeout câu lệnh này sẽ kết thúc, $max_digits là số digits tối đa đƣợc nhấn.
- Kết quả: Kí tự nhận đƣợc từ ngƣời sử dụng
[„result‟]: lƣu giữ kí tự
- 50 - $chedo=$cdo['result'];
Ngƣời dùng nhấn kí tự sau tiếng „beep‟, kí tự đƣợc lƣu giữ trong [„result‟]. Sau lệnh $chedo=$cdo['result'], kí tự đƣợc lƣu trong biến $chedọ
Say_digits
- Cấu trúc: array, say_digits (integer $digits, [string $escape_digits = ''])
- Chức năng: Đọc tuần tự từng digit nhận đƣợc, trong quá trình đọc các digits, nếu nhƣ một trong các escape_digits đƣợc nhấn thì việc đọc sẽ dừng lại
- Kết quả: -1: Nếu nhƣ bị lỗi
0 : quá trình đọc hoàn tất mà không bị ngắt bởi một escape_digit nào Value: hiển thị mã ASCII của escape_digit đƣợc nhấn
- Ví dụ: $agi->say_digits("123456","*#1")
Hệ thống sẽ đọc từng số 1,2,3,4,5,6. Trong quá trình đọc, nếu nhƣ một trong 3 digits *, # hoặc 1 đƣợc nhấn thì việc đọc sẽ dừng lạị
Say_number
- Cấu trúc: array, say_number (integer $number, [string $escape_digits = '']) - Chức năng: Đọc một số nhận đƣợc, trong quá trình đọc các digits, nếu nhƣ
một trong các escape_digits đƣợc nhấn thì việc đọc sẽ dừng lại - Kết quả: -1: Nếu nhƣ bị lỗi
0: Quá trình đọc hoàn tất mà không bị ngắt bởi một escape_digit nào Value: hiển thị mã ASCII của escape_digit đƣợc nhấn
- Ví dụ: $agi->say_digits("123456","*#1")
Hệ thống sẽ đọc số 123456. Trong quá trình đọc, nếu nhƣ một trong 3 digits *, # hoặc 1 đƣợc nhấn thì việc đọc sẽ dừng lạị
Stream_file
- Cấu trúc: array, stream_file (string $filename, [string $escape_digits = ''], [integer sample_offset])
- Chức năng: Phát một audio file $filename, audio file này sẽ đƣợc dừng lại nếu nhƣ trong quá trình phát một trong các $escape_digits đƣợc nhấn. Nếu sample_offset đƣợc sử dụng, hệ thống sẽ thực hiện độ lệch thời gian khi phát audio file
- Kết quả: -1: Nếu nhƣ bị lỗi
0: hoàn tất công việc phát audio file mà không bị ngắt bởi một escape_digit nào
- 51 -
Value: hiển thị mã ASCII của escape_digit đƣợc nhấn - Ví dụ: $agi->stream_file("baothuc0","*#1","2000");
Hệ thống sẽ phát file "baothuc0". Trong quá trình phát, nếu nhƣ một trong 3 digits *, # hoặc 1 đƣợc nhấn thì việc phát sẽ dừng lại, "2000" ứng với độ lệch thời gian khi bắt đầu phát file "baothuc0"
Text2wav
- Cấu trúc: array, text2wav (string $text, [string $escape_digits = ''], [integer $frequency = 8000])
- Chức năng: đọc một file text đƣợc đƣa vào, việc đọc này sẽ đƣợc dừng lại nếu nhƣ trong quá trình đọc một trong các $escape_digits đƣợc nhấn
- Kết quả: 0: hoàn tất công việc phát đọc file text mà không bị ngắt bởi một escape_digit nào
Value: hiển thị mã ASCII của escape_digit đƣợc nhấn Get_variable
Trong phiên bản Asterisk nhóm đang sử dụng, lệnh Get_variable không thực hiện đƣợc. Tuy nhiên, việc lấy giá trị các biến có thể thực hiện đƣợc khi gọi AGI script Ví dụ: Để lấy đƣợc giá trị là số điện thoại của máy gọi vào tổng đài, ta thực hiện nhƣ sau:
exten => 222,n,AGI(baothuc.php,${CALLERID(num)})
Sau đó, trong AGI script,$argv[1] sẽ lƣu giá trị số điện thoại của máy gọi vào tổng đài
Time()
- Chức năng: đƣợc sử dụng để xác định thời gian, đƣợc tính theo giây và theo
kiểu 24h
- Ví dụ: $time_now = time( );
Getdate()
- Chức năng: Xác định ngày, tháng, năm
- Ví dụ: $w = getdate();
$day=$w['mdaý];
$month=$w['mon'];
$year=$w['year'];
Sau các lệnh này, $day sẽ lƣu giá trị ngày, $month sẽ lƣu giá trị tháng, $year sẽ lƣu giá trị năm
- 52 -
Phụ Lục 3:
Các lệnh đƣợc sử dụng với MySQL
Mysql_connect
- Cấu trúc: resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]])
- Chức năng: Lệnh này sẽ trả về một pointer kết nối vào database
- Ví dụ:
$username = "root"; user name để vào MySQL $password = "123456"; password để vào MySQL $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
printf ( "Connected to MySQL"); mysql_close($dbh);
Sau khi thực hiện các lệnh trên, chúng ta sẽ thấy đƣợc “Connected to MySQL” trên Asterisk. Nếu nhƣ không thể kết nối vào MySQL thì kiểm tra lại username, password và hostname
mysql_select_db
- Cấu trúc: bool mysql_select_db ( string database_name [, resource
link_identifier])
- Chức năng: Để đăng nhập vào và thay đổi một database cụ thể, ta thêm lệnh
mysql_select_db() vào script của mình
- 53 - $username = "root";
$password = "123456"; $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db("test",$dbh)
or die("Could not select first_test");
Sau lệnh này ta đã có thể thực hiện các công việc trong database test Mysql_query
- Cấu trúc: resource mysql_query ( string query [, resource link_identifier [, int result_mode]])
- Chức năng: sau khi đã đăng nhập vào đƣợc database, lệnh này đƣợc dùng để
thực hiện sự truy vấn trong databasẹ Các kiểu đơn giản nhất của truy vấn chính là INSERT, UPDATE hay DELETE database, các kiểu truy vấn này không trả về kết quả sau khi truy vấn mà đơn giản chỉ là thêm vào, thay đổi hoặc xóa thông tin trong databasẹ
- Ví dụ:
$username = "root"; $password = "123456"; $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db("test",$dbh) or die("Could not select first_test");
if (mysql_query("insert into Diem_thi values('1','Tran Thai
Baó,'5','6','7','18')")) {
print "successfully inserted record"; }
- 54 - {
print "Failed to insert record"; }
mysql_close($dbh);
Sau khi thực hiện xong chƣơng trình này thì table Diem_thi trong database test sẽ đƣợc thêm một hàng mới với các giá trị: '1','Tran Thai Baó,'5','6','7','18'.
Đối với các kiểu truy vấn có thể trả về giá trị, ví dụ nhƣ SELECT, ta phải dùng thêm hàm fetch để biết đƣợc kết quả sau khi truy vấn.
Mysql_fetch_array
- Cấu trúc: array mysql_fetch_array ( resource result [, int result_type])
- Chức năng: Đƣợc dùng để trả về kết quả sau khi đã truy vấn. Chúng ta có thể dùng $row[0] cho trƣờng thứ nhất, $row[1] cho trƣờng thứ hai hoặc sử dụng $row["Sbd"], $row["Ho_va_ten"]. Chúng ta sử dụng MYSQL_ASSOC cho chuỗi kết hợp với database, MYSQL_NUM cho chuỗi dạng số hoặc MYSQL_BOTH cho cả haị
- Ví dụ:
$username = "root"; $password = "123456"; $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db("test",$dbh) or die("Could not select first_test");
$aaa = mysql_query("SELECT Sbd,Ho_va_ten,Toan,Ly,Hoa,Tong FROM Diem_thi");
while ($row = mysql_fetch_array($aaa,MYSQL_NUM)) {
- 55 -
printf("Sbd: %s Ho_va_ten: %s Toan:%s Ly:%s Hoa:%s Tong:%s\n", $row[0], $row[1],$row[2],$row[3],$row[4],$row[5]);
}
Sau chƣơng trình này, Asterisk sẽ hiển thị kết quả Sbd, Ho_va_ten, Ly, Hoa, Tong của toàn bộ table Diem_thi của database test. Hoặc ta có thể làm nhƣ sau đối với chuỗi kết hợp với database:
$username = "root"; $password = "123456"; $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db("test",$dbh) or die("Could not select first_test");
$aaa = mysql_query("SELECT Sbd,Ho_va_ten,Toan,Ly,Hoa,Tong FROM Diem_thi");
while ($row = mysql_fetch_array($aaa,MYSQL_ASSOC)) {
printf("Sbd: %s Ho_va_ten: %s Toan:%s Ly:%s Hoa:%s Tong:%s\n", $row["Sbd"],$row["Ho_va_ten"],$row["Toan"],$row["Ly"],$row["Hoa"],$ro w["Tong"]);
- 56 - Phụ lục 4: File cấu hình hệ thống Extensions.conf [local] exten => _1XX,1,Dial(SIP/${EXTEN}) exten => _1XX,n,hangup() exten => 222,1,Answer() exten => 222,n,AGI(baothuc.php,${CALLERID(num)}) exten => 222,n,hangup() Sip.conf [101] username=101 type=friend secret=101 context=local host=dynamic nat=yes allow=all [102] username=102 type=friend secret=102 context=local
- 57 - host=dynamic nat=yes allow=all [103] username=103 type=friend secret=103 context=local host=dynamic nat=yes allow=all [104] username=104 type=friend secret=104 context=local host=dynamic nat=yes allow=all [105] username=105 type=friend secret=105 context=local host=dynamic nat=yes allow=all [106] username=106
- 58 - type=friend secret=106 context=local host=dynamic nat=yes allow=all AGI script Dịch vụ báo thức #!/usr/bin/php5 -q <?php require 'phpagịphp'; $agi = new AGI();
// Nơi file wakeup call tạm thời được tạo $parm_temp_dir = '/tmp';
// Nơi file wakeup call sau khi tạo xong được sử dụng để gọi lại $parm_call_dir = '/var/spool/asterisk/outgoing';
// Số lần gọi lại
$parm_maxretries = 3;
// thời gian rung cho mỗi lần gọi $parm_waittime = 60;
// Thời gian giữa các lần gọi $parm_retrytime = 60;
// Caller ID hiển thị trên máy được báo thức $parm_wakeupcallerid = 'bao thuc';
//Sử dụng playback để phát file nhạc báo thức $parm_application = 'playback';
//file nhạc báo thức $parm_data = 'baothuc8';
$agi->answer();
- 59 -
// Nhập số điện thoại cần được báo thức $agi->stream_file("baothuc0"); $sdt = $agi->get_datắbeep',3000, 4); $cidn=$sdt['result']; While($cidn<=100 || $cidn>=107) { $agi->stream_file("sdt0"); $sdt = $agi->get_datắbeep',3000, 4); $cidn=$sdt['result']; } // Nhập giờ báo thức $agi->stream_file("baothuc1"); $rc = $agi->get_datắbeep',3000, 4); $wtime = $rc['result']; while($wtime<=0 || $wtime >=2359) { $agi->stream_file("baothuc2"); $rc = $agi->get_datắbeep',3000, 4); $wtime = $rc['result']; }
//phát lại thông tin: số điện thoại và giờ báo thức $agi->stream_file("baothuc3"); $agi->say_digits($cidn); $agi->stream_file("baothuc4"); $h = substr( $wtime, 0, 2 ); $h1 = substr( $wtime, 0, 1 ); $h2 = substr( $wtime, 1, 1 ); $m = substr( $wtime, 2, 2 );
- 60 - $m1 = substr( $wtime, 2, 1); $m2 = substr( $wtime, 3, 1); if ( $h1 == 0 ) $agi->say_number($h2); else $agi->say_number($h); $agi->stream_file("baothuc5"); if ( $m1 == 0 ) $agi->say_number($m2); else $agi->say_number($m); $agi->stream_file("baothuc6"); $agi->stream_file("baothuc7");
// Tạo file wakeup và thêm thông tin vào
$wakefile = "$parm_temp_dir/$wtimẹext.$cidn.call"; $callfile = "$parm_call_dir/$wtimẹext.$cidn.call"; $wuc = fopen( $wakefile, 'w');
fputs( $wuc, "channel: Local/$cidn@local\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, "application: $parm_application\n"); fputs( $wuc, "data: $parm_data\n");
// Gán thời gian báo thức vào biến $time_wakeup $w = getdate();
- 61 -
$w['hours'] = substr( $wtime, 0, 2 ); $w['minutes'] = substr( $wtime, 2, 2 );
$time_wakeup = mktime( substr( $wtime, 0, 2 ), substr( $wtime, 2, 2 ), 0, $w['mon'], $w['mdaý], $w['year'] );
//Xác định thời gian hiện tại, nếu lớn hơn thời gian báo thức thì cộng thêm 1 ngày vào $time_wakeup
$time_now = time( );
if ( $time_wakeup <= $time_now ) $time_wakeup += 86400;
touch( $wakefile, $time_wakeup, $time_wakeup ); rename( $wakefile, $callfile );
?> Dịch vụ quà tặng âm nhạc: Amnhac.php #!/usr/bin/php5 -q <?php require 'phpagịphp'; $agi = new AGI();
// Lấy số điện thoại gọi vào $dthoai=$argv[1];
// Thông số cho cuộc gọi vào máy đƣợc nhận quà tặng $parm_temp_dir = '/tmp';
$parm_call_dir = '/var/spool/asterisk/outgoing'; $parm_maxretries = 3;
$parm_waittime = 60; $parm_retrytime = 60;
- 62 - // Nhập số điện thoại đƣợc nhận quà tặng
$agi->stream_file("amnhac0"); $sdt = $agi->get_datắbeep',3000, 4); $cidn=$sdt['result']; While($cidn<=100 || $cidn>=107) { $agi->stream_file("sdt0"); $sdt = $agi->get_datắbeep',3000, 4); $cidn=$sdt['result']; } // Nhập thời gian phát nhạc $agi->stream_file("amnhac1"); $rc = $agi->get_datắbeep',3000, 4); $wtime = $rc['result']; while($wtime<=0 || $wtime >=2359) { $agi->stream_file("amnhac2"); $rc = $agi->get_datắbeep',3000, 4); $wtime = $rc['result']; } // Nhập mã số bài hát $agi->stream_file("amnhac3"); $bhat = $agi->get_datắbeep',3000, 4); $baihat=$bhat['result']; while($baihat<=0 || $baihat >=11) {
- 63 - $agi->stream_file("amnhac4"); $bhat = $agi->get_datắbeep',3000, 4); $baihat = $bhat['result']; } // Nhấn số 1 để gửi lời nhắn $nhan=0; $agi->stream_file("amnhac12"); $nhan0 = $agi->get_datắbeep',3000, 4); $nhan=$nhan0['result'];
// Gửi lời nhắn và lƣu số hiệu lời nhắn vào loinhan.txt $filename = "/var/lib/asterisk/agi-bin/loinhan.txt"; $handle = fopen($filename, "r");
$sohieu = fread($handle, filesize($filename)); fclose($handle); $loinhan="loinhan$sohieu"; if($nhan==1) { $agi->stream_file("amnhac13"); $agi->record_file("$loinhan","wav","#"); $sohieu=$sohieư1; } $fp = fopen('/var/lib/asterisk/agi-bin/loinhan.txt', 'w'); fwrite($fp, $sohieu); fclose($fp);
// Phát lại thông tin: số điện thoại, thời gian phát nhạc, tên và ca sĩ trình bày bài hát
- 64 - $agi->stream_file("amnhac5"); $agi->say_digits($cidn); $agi->stream_file("amnhac6"); $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 ( $h1 == 0 ) $agi->say_number($h2); else $agi->say_number($h); $agi->stream_file("amnhac7"); if ( $m1 == 0 ) $agi->say_number($m2); else $agi->say_number($m); $agi->stream_file("amnhac8"); $username = "root"; $password = "123456"; $hostname = "localhost";
$dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL");
$selected = mysql_select_db("test",$dbh) or die("Could not select test");
- 65 -
$aaa = mysql_query("SELECT Ma_so, Bai_hat, Ca_si,Duong_dan FROM am_nhac");
$row_cnt=0;
while ($row = mysql_fetch_array($aaa,MYSQL_NUM)) { for( $cnt=0;$cnt<4;$cnt++) { $data[$row_cnt][$cnt]=$row[$cnt]; } $row_cnt++; } $Bai_hat=0; $Ca_si=0; $Duong_dan=0; for( $row_cnt=0;$row_cnt<10;$row_cnt++) { if($baihat==$data[$row_cnt][0]) { $Bai_hat=$data[$row_cnt][1]; $Ca_si=$data[$row_cnt][2]; $Duong_dan=$data[$row_cnt][3]; } } //printf("%s",$parm_data); $agi->stream_file("amnhac9"); $agi->text2wav($Bai_hat); $agi->stream_file("amnhac10"); $agi->text2wav($Ca_si); mysql_close($dbh);
- 66 -
// application cho cuộc gọi quà tặng là amnhac1.php với các thông số kèm theo $parm_application = "AGI";
$parm_data =
"amnhac1.php,$nhan,$dthoai,$Bai_hat,$Ca_si,$loinhan,$Duong_dan"; $agi->stream_file("amnhac11");
// Tạo file wakeup và thêm thông số vào
$wakefile = "$parm_temp_dir/$wtimẹext.$cidn.call"; $callfile = "$parm_call_dir/$wtimẹext.$cidn.call"; $wuc = fopen( $wakefile, 'w');
fputs( $wuc, "channel: Local/$cidn@local\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, "application: $parm_application\n"); fputs( $wuc, "data: $parm_data\n");
//fputs( $wuc, "directory: $parm_directory\n"); $w = getdate();
$w['hours'] = substr( $wtime, 0, 2 ); $w['minutes'] = substr( $wtime, 2, 2 );
$time_wakeup = mktime( substr( $wtime, 0, 2 ), substr( $wtime, 2, 2 ), 0, $w['mon'], $w['mdaý], $w['year'] );
$time_now = time( );
if ( $time_wakeup <= $time_now )
$time_wakeup += 86400; // Ađ One Day on
touch( $wakefile, $time_wakeup, $time_wakeup ); rename( $wakefile, $callfile );
- 67 -
Amnhac1.php
#!/usr/bin/php5 -q <?php
require 'phpagịphp'; $agi = new AGI(); $agi->answer();
//Lấy các thông số: số điện thoại, Bài hát, Ca sĩ, lời nhắn, đường dẫn từ