หน้า 1 จากทั้งหมด 1

การติดตั้งและใช้งาน phpagi บนเครื่อง Elastix

โพสต์โพสต์แล้ว: 23 ธ.ค. 2016 21:46
โดย nuiz
มาถึงตอนนี้ผมเชื่อว่าหลายท่านคงได้ประยุกต์ใช้งาน phpagi กันเป็นที่เรียบร้อยแล้ว แต่สำหรับท่านที่เพิ่งเข้ามาศึกษา Asterisk/Elastix ผมขอแนะนำ phpagi ตัวนี้ครับ เป็นแล้วจะเขียนสั่งงาน Asterisk ได้ง่ายมาก เอา Asterisk ไปประยุกต์ใช้งานต่างๆได้มากมายเลยทีเดียว

สำหรับเครื่องที่ลง 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