สำหรับเครื่องที่ลง AsteriskNow, FreePBX, Elastix จะมี phpagi ติดตั้งอยู่เรียบร้อยแล้วนะครับ เพราะว่า FreePBX ที่ Elastix เอามาใช้นั้น ก็มีการใช้ phpagi ด้วย
ที่ไดเร็คตอรี่ /var/lib/asterisk/agi-bin จะมีไฟล์ phpagi.php และ phpagi-asmanager.php
ที่ไดเร็คตอรี่ /etc/asterisk มีไฟล์ phpagi.conf
1. phpagi คืออะไร
phpagi เป็น php class ซึ่งจะช่วยให้เราการเขียนแอปพลิเคชั่นมาสั่งงาน Asterisk ได้ง่ายและสะดวกมากขึ้น โดยเราเขียน php script ขึ้นมาส่วนหนึ่งก่อน แล้วเรียกใช้ class ที่ phpagi มีมาให้แล้วมาเสริมที่เราเขียน ถ้ายังไม่มีก็เขียนเติมเพิ่มได้อย่างไม่มีที่สิ้นสุด จากนั้นเราก็เขียน dialplan สั่ง Asterisk ให้ดึง php script ไปทำงาน
Asterisk จะเรียก script ไปทำงานผ่านกระบวนการที่เรียกว่า Asterisk Gateway Interface (AGI) ครับ โดยใช้คำสั่ง DeadAGI หรือ AGI ก็ได้
ยกตัวอย่างเช่น ผมเขียน php script ขึ้นมาไฟล์นึง ตั้งชื่อว่า mrnuiz.php ข้างในไฟล์นี้ก็เป็น php script ทั้งที่ผมคิดขึ้นมาเองและส่วนหนึ่งก็เรียกใช้ class ที่ phpagi มีมาให้แล้ว ผมเอาไฟล์ mrnuiz.php ไปวางไว้ที่ /var/lib/asterisk/agi-bin จากนั้นผมเขียน Dialplan บอก Asterisk ว่าถ้ามีคนกดเบอร์ 100 ให้เรียกไฟล์ mrnuiz.php ไปทำงาน
exten => 200,1,DeadAGI(mrnuiz.php)
exten => 200,n,Hangup
เท่านี้เองครับ หลายท่านคงจะใช้งาน AGI เป็นกันแล้วนะครับ ส่วนผมเพิ่งกำลังจะเริ่มเพราะตัวเองเขียน php ไม่เป็นเลย แต่กำลังศึกษาอยู่
ปล. คำสั่ง DeadAGI ใช้กับ Asterisk 1.2 ครับ ส่วน Asterisk 1.4 ใช้ DeadAGI หรือ AGI ก็ได้ (ถ้าใช้ DeadAGI มันจะแค่เตือน แต่ก็ยังทำงานได้) ส่วน Asterisk 1.6+ จะใช้ AGI แทนครับ
2. ข้อมูลในไฟล์ /etc/asterisk/manager_custom.conf
มีข้อมูลด้านล่างนี้เรียบร้อยแล้วนะครับ เราจะใช้ข้อมูลนี้ให้ phpagi เชื่อมต่อกับ Asterisk
- โค้ด: เลือกทั้งหมด
[phpagi]
secret = phpagi
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,log,verbose,command,agent,user,config,command,reporting,originate
3. ข้อมูลในไฟล์ /etc/asterisk/phpagi.conf
- โค้ด: เลือกทั้งหมด
[phpagi]
debug=false
error_handler=false
[asmanager]
server=localhost
port=5038
username=phpagi
secret=phpagi
[fastagi]
setuid=true
basedir=/var/lib/asterisk/agi-bin/
[festival]
text2wave=/usr/src/festival/bin/text2wave
tempdir=/var/lib/asterisk/sounds/tmp/
บรรทัด debug=true ขณะที่ phpagi ทำงานจะมีข้อความ debug เกิดขึ้นบน asterisk console ครับ เหมาะกับการ debug หาปัญหา ถ้าไม่ได้ต้องการ debug ก็ให้เซ็ตเป็น false ครับ เวลาที่เราแก้ไขข้อมูลในไฟล์นี้ ไม่ต้อง reload asterisk นะครับ มันไม่เกี่ยวกัน และถ้าเราแก้ไขข้อมูลในไฟล์นี้ จะมีผลเฉพาะการเรียก phpagi ครั้งใหม่เท่านั้น ไอ้ที่เรียกใช้งานไปแล้วและกำลังทำงานอยู่ จะไม่มีผลอะไร
ลองดูว่าเราจะเอา phpagi ไปทำอะไรได้บ้าง
4. ตัวอย่างการใช้งาน 1
ไฟล์ /var/lib/asterisk/agi-bin/myfirstagi.php
- โค้ด: เลือกทั้งหมด
#!/usr/bin/php-cgi -q
<?php
include ("phpagi.php");
$agi = new AGI();
$agi->answer();
$a = 11;
$b = 10;
$sum = $a+$b;
$agi->say_number($sum);
?>
- โค้ด: เลือกทั้งหมด
chmod +x /var/lib/asterisk/agi-bin/myfirstagi.php
ส่วนไฟล์ /etc/asterisk/extensions.conf ก็ประมาณนี้ครับ
- โค้ด: เลือกทั้งหมด
[from-internal]
exten => 000,1,Answer
exten => 000,n,AGI(myfirstagi.php)
exten => 000,n,Hangup
แล้วก็รีโหลด dialplan ครับ
- โค้ด: เลือกทั้งหมด
asterisk -rx "dialplan reload"
เวลาเรากดโทรไปที่เบอร์ 000 ก็จะมีเสียง twenty one แล้วสายก็จะตัดไปครับ
5. ตัวอย่างการใช้งาน 2
มาดูอีกตัวอย่างนึงครับ เป็น agi ที่เมื่อเราโทรเข้าไปแล้ว จะได้ยินเสียง beep จากนั้นภายใน 5 วินาทีให้เรากดตัวเลขอะไรก็ได้จำนวน 10 หลัก ถ้ากดไม่ถึง 10 หลักต้องกด # จะมีเสียงบอกตัวเลขที่เรากด วน 3 รอบ แล้วออก
ไฟล์ /var/lib/asterisk/agi-bin/get_and_say_digits.php
- โค้ด: เลือกทั้งหมด
#!/usr/bin/php-cgi -q
<?php
require("phpagi.php");
$agi = new AGI();
$agi->answer();
$try = 3;
for ($i=0; $i<$try; $i++) {
$result = $agi->get_data('beep', 5000, 10);
$keys = $result['result'];
$agi->stream_file("you-entered");
$agi->say_digits($keys);
}
$agi->stream_file('thanks-for-using');
?>
ใน code นะครับ beep, you-entered, thanks-for-using เป็นชื่อไฟล์เสียงครับ (ไม่ต้องใส่นามสกุล) อยู่ในไดเร็คตอรี่ /var/lib/asterisk/sounds หรือไม่ก็อยู่ใน /var/lib/asterisk/sounds/en มีมาตั้งแต่ตอนติดตั้ง Asterisk แล้ว มันอาจจะอยู่ในแพ็กเกจ asterisk-core-sounds หรือ asterisk-extra-sound ก็ได้ (ไม่แน่ใจครับ) ยังไงลองเช็คกับบทความเกี่ยวกับ Asterisk Core Sounds หรือ Asterisk Extra Sound นี้ก็ได้
ส่วนไฟล์ /etc/asterisk/extensions.conf
- โค้ด: เลือกทั้งหมด
exten => 001,1,Answer
exten => 001,n,AGI(get_and_say_digits.php)
exten => 001,n,Hangup
6. แนะนำเพิ่มเติม
ตอนเขียน Dialplan นะครับ ถ้าไฟล์ php scripts ไม่ได้อยู่ในไดเร็คตอรี่ /var/lib/asterisk/agi-bin เราต้องระบุ path ให้ถูกต้องด้วยนะครับ เช่นไฟล์ /tmp/agi-test/get_and_say_digits.php ให้ระบุแบบนี้
- โค้ด: เลือกทั้งหมด
exten => 001,1,AGI(/tmp/agi-test/get_and_say_digits.php)
และก็ในไฟล์ get_and_say_digits ให้แก้ไขบรรทัด require ระบุ path ของไฟล์ phpagi.php ให้ถูกต้องด้วยครับ ไม่งั้นมันจะไม่เวอร์ค
- โค้ด: เลือกทั้งหมด
require("/var/lib/asterisk/agi-bin/phpagi.php");
ลองฝึกเขียนดูครับ
บทความที่เกี่ยวข้อง
การติดตั้งและใช้งาน phpagi บนเครื่อง Asterisk