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 แทนครับ
** เครื่องที่ลง AsteriskNow, FreePBX, Elastix ไม่ต้องติดตั้ง phpagi นะครับ เพราะว่ามีในเครื่องอยู่แล้ว เรียกใช้งานได้เลย รายละเอียด phpagi ใน AsteriskNow, FreePBX, Elastix **
เกริ่นมาพอสมควรแล้ว มาติดตั้งกันดีกว่าครับ ชื่อไฟล์ไม่จำเป็นต้องเอาตามผมนะครับ ตั้งชื่อได้ตามต้องการ แต่อย่างงเองหล่ะกัน
เว็บไซต์ http://phpagi.sourceforge.net/
1. ดาวน์โหลด
- โค้ด: เลือกทั้งหมด
wget http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-examples-2.20.tgz/download?use_mirror=nchc
wget http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-2.20.tgz/download?use_mirror=nchc
2. แตกไฟล์
- โค้ด: เลือกทั้งหมด
tar xzvf phpagi-2.20.tgz -C /tmp
cd /tmp/phpagi-2.20
3. เพิ่ม user/pass ในไฟล์ /etc/asterisk/manager.conf
- โค้ด: เลือกทั้งหมด
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
timestampevents = yes
displayconnected = yes
allowmultiplelogin = yes
[phpagi]
secret=password
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
write = originate,system,call,log,verbose,command,agent,user
4. รีโหลด asterisk manager
- โค้ด: เลือกทั้งหมด
asterisk -rx "manager reload"
5. ก๊อบไฟล์คอนฟิก phpagi
- โค้ด: เลือกทั้งหมด
cp docs/phpagi.example.conf /etc/asterisk/phpagi_220.conf
6. แก้ไขไฟล์คอนฟิกที่จะเชื่อมกับ asterisk
- โค้ด: เลือกทั้งหมด
vi /etc/asterisk/phpagi-2.20.conf
- โค้ด: เลือกทั้งหมด
[phpagi]
debug=true
error_handler=true
admin=errors@mydomain.com
hostname=sip.mydomain.com
tempdir=/tmp/
[asmanager]
server=localhost
port=5038
username=phpagi
secret=password
[fastagi]
setuid=true
basedir=/var/lib/asterisk/agi-bin/
[festival]
text2wave=/usr/bin/text2wave
[cepstral]
swift=/opt/swift/bin/swift
voice=David
บรรทัด debug=true ขณะที่ phpagi ทำงานจะมีข้อความ debug เกิดขึ้นบน asterisk console ครับ เหมาะกับการ debug หาปัญหา ถ้าไม่ได้ต้องการ debug ก็ให้เซ็ตเป็น false ครับ เวลาที่เราแก้ไขข้อมูลในไฟล์นี้ ไม่ต้อง reload asterisk นะครับ มันไม่เกี่ยวกัน และถ้าเราแก้ไขข้อมูลในไฟล์นี้ จะมีผลเฉพาะการเรียก phpagi ครั้งใหม่เท่านั้น ไอ้ที่เรียกใช้งานไปแล้วและกำลังทำงานอยู่ จะไม่มีผลอะไร
บรรทัด [festival] เซ็ตบอก phpagi ว่าเวลาเราใช้คำสั่ง text2wave ใน script ให้มันไปเรียกใช้ไฟล์ /usr/bin/text2wave ซึ่ง text2wave เป็นโปรแกรมอ่านตัวหนังสือ (ภาษาอังกฤษ ตามที่เราเขียน) เป็นเสียง
ติดตั้งโปรแกรม Festival บน CentOS
7. ก๊อปไฟล์
- โค้ด: เลือกทั้งหมด
mkdir /var/lib/asterisk/agi-bin/libs_phpagi_220
cp phpagi.php phpagi-fastagi.php phpagi-asmanager.php /var/lib/asterisk/agi-bin/libs_phpagi_220
8. แก้ไขไฟล์คอนฟิก php.agi
- โค้ด: เลือกทั้งหมด
cd /var/lib/asterisk/agi-bin/libs_phpagi_220
แก้ไขไฟล์ phpagi.php ระบุ path และไฟล์คอนฟิก
- โค้ด: เลือกทั้งหมด
vi phpagi.php
if (!class_exists('AGI_AsteriskManager'))
{
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'phpagi-asmanager.php');
}
define('AST_CONFIG_DIR', '/etc/asterisk/');
define('AST_SPOOL_DIR', '/var/spool/asterisk/');
define('AST_TMP_DIR', AST_SPOOL_DIR . '/tmp/');
define('DEFAULT_PHPAGI_CONFIG', AST_CONFIG_DIR . '/phpagi_220.conf');
9. แก้ไขไฟล์ phpagi-fastagi.php
บรรทัดแรก แก้เป็น #!/usr/bin/php -q
หรือลบทิ้ง
10. ติดตั้ง phpagi example files
- โค้ด: เลือกทั้งหมด
tar xzvf phpagi-examples-2.20.tgz -C /opt
เป็นตัวอย่างการใช้งานนะครับ ลองดูว่าเราจะเอา phpagi ไปทำอะไรได้บ้าง
11. ตัวอย่างการใช้งาน 1
ไฟล์ /var/lib/asterisk/agi-bin/myfirstagi.php
- โค้ด: เลือกทั้งหมด
#!/usr/bin/php -q
<?php
include ("libs_phpagi_220/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 แล้วสายก็จะตัดไปครับ
12. ตัวอย่างการใช้งาน 2
มาดูอีกตัวอย่างนึงครับ เป็น agi ที่เมื่อเราโทรเข้าไปแล้ว จะได้ยินเสียง beep จากนั้นภายใน 5 วินาทีให้เรากดตัวเลขอะไรก็ได้จำนวน 10 หลัก ถ้ากดไม่ถึง 10 หลักต้องกด # จะมีเสียงบอกตัวเลขที่เรากด วน 3 รอบ แล้วออก
ไฟล์ /var/lib/asterisk/agi-bin/get_and_say_digits.php
- โค้ด: เลือกทั้งหมด
#!/usr/bin/php -q
<?php
require("libs_phpagi_220/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
13. แนะนำเพิ่มเติม
ตอนเขียน 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/libs_phpagi_220/phpagi.php");
รวมทั้งไดเร็คตอรี่ libs_phpagi_220 ด้วยนะครับ มันไม่จำเป็นต้องเป็นชื่อนี้ และก็ไม่จำเป็นต้องอยู่ที่ /var/lib/asterisk/agi-bin
ลองฝึกเขียนดูแล้วเอา script หรือ function มาแชร์ด้วยก็ดีครับ ขอบคุณล่วงหน้าคร๊าบบ
บทความที่เกี่ยวข้อง
การติดตั้งและใช้งาน phpagi บนเครื่อง Elastix
เทคนิคการใช้งานคำสั่ง NoCDR ใน Asterisk Dial Plan