ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

บทความเกี่ยวกับ PHPAGI ซึ่งจะทำให้เราเขียน PHP สั่งงาน Asterisk ได้ตามปรารถนา

Moderator: jubjang

ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

โพสต์โดย nuiz » 07 มี.ค. 2011 12:05

ผมจะแนะนำฟังชั่นๆหนึ่งใน phpagi ครับ ฟังก์ชั่นนี้จะช่วยให้รับข้อมูลจากยูสเซอร์เข้ามาสู่ระบบ แล้วเราก็เอาข้อมูลนี้ไปทำงานอื่นต่อไป

ในระบบ IVR ทั่วๆไปที่โต้ตอบกับผู้ใช้งานได้ ก็จะต้องให้ผู้ใช้งานกดปุ่มบนแป้นโทรศัพท์เพื่อเลือกตัวเลือกที่ได้ยิน เข้าสู่เมนูที่ต้องการ หรือไม่ก็ป้อนข้อมูลของตัวเองเข้าไป เช่น เบอร์โทรศัพท์ หมายเลขบัตรประชาชน รหัสประจำตัวนักเรียน นักศึกษา หมายเลขบัตรเครดิต วันเดือนปีเกิด เป็นต้น

ใน phpagi มีฟังก์ชั่น get_data() ซึ่งจะเข้ามาทำหน้าที่เล่นไฟล์เสียงที่เราต้องการให้ยูสเซอร์ได้ยิน แล้วก็รับค่าที่ยูสเซอร์กด ครับ

รูปแบบฟังก์ชั่น

get_data($filename, $timeout, $max_digits);

$filename คือไฟล์เสียงที่จะเล่นให้ยูสเซอร์ได้ยิน เช่น "กรุณากดเลขบัตรประชาชนหรือหมายเลขบัตรเครดิต"
$timeout คือ timeout หน่วย millisecond ที่ยูสเซอร์ต้องกด ต้องกดตัวเลขให้ทันภายในเวลานี้ ถ้าไม่ทันจะถือว่า timeout
$max_digits คือจำนวนหลักสูงสุดที่ฟังก์ชั่นนี้จะรับ เช่น ถ้าใส่ 8 พอยูสเซอร์กดครบ 8 ก็จะถือว่าสิ้นสุดแล้ว แต่ถ้าเราไม่ใส่ค่า $max_digits คือปล่อยไว้ว่างๆ ฟังก์ชั่นนี้ก็จะยอมให้ยู
สเซอร์กดไปได้เรื่อยๆ กี่หลักก็ได้ และพอยูสเซอร์เลิกกดและครบเวลา $timeout แล้วถึงจะเอาค่าไปทำงานอย่างอื่นต่อไป

ผมมีข้อแนะนำอย่างนี้นะครับสำหรับค่า $max_digits นี้ คือว่าถ้าข้อมูลที่ลูกค้ากดมีจำนวนหลักที่แน่นอน เช่น 1 - 9 มีแต่ 1 หลัก ก็ใส่ค่า $max_digits เป็น 1 ถ้ามี 4 หลักก็ใส่เป็น 4 แต่ถ้ามีจำนวนหลักที่ไม่แน่นอนเช่น ใส่บัตรประชาชนก็ได้ ซึ่งมี 13 หลัก หรือบัตรเครดิตก็ได้ ซึ่งมี 16 หลัก หรือวันเดือนปีเกิดก็ได้ ซึ่งมี 8 หลัก (ddmmyyyy) ก็ใส่ค่า $max_digits ไว้เป็น 16 หลัก ซึ่งถ้าลูกค้ากดเลขบัตรประชาชน เขาก็จะกดแค่ 13 หลัก และจะรอจนครบ $timeout

มาดูการใช้งานกันครับ

$prompt = $agi-> get_data("please-enter-your-birthday", 5000, 8);
$digits = $prompt['result'];

please-enter-your-birthday เป็นชื่อไฟล์เสียงที่เราอัดไว้ก่อนแล้ว ไฟล์นี้จะอยู่ที่ไดเร็คตอรี่ /var/lib/asterisk/sounds
5000 คือ 5 วินาที ยูสเซอร์ต้องกดภายใน 5 วินาที
8 คือ 8 หลัก พอครบ 8 หลักก็ถือว่าสิ้นสุดการป้อนข้อมูล
ข้อมูลที่ลูกค้ากด จะเก็บไว้ในตัวแปร $digits เราก็เอาค่าตัวแปรนี้ไปทำงานอย่างอื่นต่อไป เช่น เช็คว่าเป็นวันเดือนปีเกิดที่ถูกต้องหรือไม่ และมีอยู่ในฐานข้อมูลแล้วหรือยัง ประมาณนี้ครับ

ข้อดีของพร้อมท์เสียงในฟังก์ชั่น get_data() นะครับ คือ ยูสเซอร์กดปุ่มได้เลยไม่ต้องรอให้พูดจบ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 6993
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

โพสต์โดย sitt01 » 20 เม.ย. 2011 22:26

ผมพอลองใช้กับ hard phone แล้วมันเบิ้ลตัวเลขครับ เช่ากด 210 ที่ได้คือ 221100 ต้องแก้ตรงไหนตรับ แต่ soft phone ไม่เป็น
ข้อดีของการเป็นคนทำคอมพิวเตอร์ คือ ทำยังไงคอมพิวเตอร์ก็จะไม่เจ๊ง ถ้าไม่ไปยุ่งกับ Hardware อย่างมากก็แค่เสียเวลาลง โปรแกรมใหม่ แต่อย่างว่ายิ่งลงบ่อยเท่าไรก็ยิ่งขำนาญเท่านี้น
sitt01
Gold Member
 
โพสต์: 316
ลงทะเบียนเมื่อ: 17 ม.ค. 2011 14:19

Re: ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

โพสต์โดย nuiz » 20 เม.ย. 2011 22:53

เป็นปัญหาจากการเซ็ต dtmf ครับ ใน asterisk และ hardphone ลองแบบอื่นดู มีอยู่ 3 แบบใน asterisk ได้แก่ rfc2833, info, inband ไม่ก็เซ็ตเป็น auto เลย
ส่วนใน hardphone ก็เลือกทีละอย่างครับ ต้องมีอย่างนึงที่เวอร์คๆ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 6993
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

โพสต์โดย sitt01 » 02 มิ.ย. 2011 16:09

ถามเพิ่มเติม ครับ
แล้วถ้า user ไม่กดข้อมูล จนครบเวลาที่กำหนดแล้ว ให้ วางสายเลย หรือให้พูดข้อความซ้ำเพื่อให้ user กดใหม่ต้องทำยังไง
ขอบคุณ ครับ
ข้อดีของการเป็นคนทำคอมพิวเตอร์ คือ ทำยังไงคอมพิวเตอร์ก็จะไม่เจ๊ง ถ้าไม่ไปยุ่งกับ Hardware อย่างมากก็แค่เสียเวลาลง โปรแกรมใหม่ แต่อย่างว่ายิ่งลงบ่อยเท่าไรก็ยิ่งขำนาญเท่านี้น
sitt01
Gold Member
 
โพสต์: 316
ลงทะเบียนเมื่อ: 17 ม.ค. 2011 14:19

Re: ฟังก์ชั่น get_data() รับค่า dtmf digits จากยูสเซอร์

โพสต์โดย nuiz » 02 มิ.ย. 2011 17:40

ใช้ loop ของ php เข้ามาช่วยครับ อันที่ใช้บ่อยที่สุดคือ for loop แบบนี้
เดิม

$prompt = $agi-> get_data("please-enter-your-birthday", 5000, 8);
$digits = $prompt['result'];

ตัวเลข 5000 นั่นคือรอ 5 วินาทีนะครับ

ใหม่

โค้ด: เลือกทั้งหมด
for ($i=0; $i<3; $i++) {
     $prompt = $agi-> get_data("please-enter-your-birthday", 5000, 8);
     $digits = $prompt['result'];
     if ($digits > 0) {
        //ยูสเซอร์กด
        $this->goto_other_function($agi, $digits);
     }
     //ยูสเซอร์ไม่กด วนใหม่
}

//วนครบ 2 รอบแล้ว ก็ยังไม่กดอีก ตัดสาย
if ($digits < 0) {
    $agi-> stream_file("googbye");
    $agi-> hangup;
}


ซึ่งถ้ายูสเซอร์กดเลข ก็จะไปทำงานตามฟังก์ชั่น goto_other_function พร้อมส่งข้อมูลไปด้วย แต่ถ้ายูสเซอร์ไม่กดไรเลย ก็จะวนมาที่พร้อมท์อีก ถ้าวนครบแล้วก็จะบอกว่า goodbye แล้วจบโปรแกรม

จะเห็นว่ามันคือ php เลย และส่วนที่จะโต้ตอบกับลูกค้า มันก็คือตัวแปรและค่าตัวแปร
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 6993
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33


ย้อนกลับไปยัง PHPAGI - Where PHP Connects To Asterisk

ผู้ใช้งานขณะนี้

่กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 1 ท่าน