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

เทคนิคการเขียน Asterisk Dialplan ให้เชื่อมต่อกับ MySQL

โพสต์โพสต์แล้ว: 14 ธ.ค. 2019 20:24
โดย nuiz
เป็นครั้งแรกเลยครับที่ผมเขียน Dialplan ติดต่อกับ MySQL โดยตรง ปกติจะเขียนแบบใช้ PHP AGI Script ติดต่อกับ MySQL อีกทีนึง เคสนี้พอดีว่าเป็นขั้นตอนที่ไม่ซับซ้อน แค่เช็คว่ามีข้อมูลหรือไม่มีเท่านั้นเองก็เลยลองเขียนดูครับ มาดูคำสั่งใน Dialplan ที่ใช้ติดต่อกับ MySQL กันครับ

1. คำสั่ง Connect ดาต้าเบส
โค้ด: เลือกทั้งหมด
MySQL(Connect connid dbhost dbuser dbpass dbname)

เป็นคำสั่ง Connect ฐานข้อมูลครับ dbhost, dbuser, dbpass, dbname คือ Host ที่เก็บดาต้าเบส User เข้าดาต้าเบส Password เข้าดาต้าเบส และชื่อดาต้าเบสตามลำดับครับ ส่วน connid คือ Connection Identifier ครับ

ซึ่งเมื่อ Asterisk สร้างการเชื่อมต่อกับ MySQL แล้ว ถ้าเชื่อมต่อสำเร็จ ค่า Connection Identifier เช่น 1 หรือ 2 หรือ 3 หรือ .... จะถูกเก็บอยู่ในตัวแปร ${connid} นี้ แต่ถ้าเชื่อมต่อไม่สำเร็จ ค่า ${connid} จะว่างเปล่าแบบนี้ครับ ${connid}=""

2. คำสั่ง Query ดาต้าเบส
โค้ด: เลือกทั้งหมด
MySQL(Query resultid ${connid} query-string)

เช่น MySQL(Query resultid ${connid} SELECT phone FROM phonelist WHERE phone=${ARG2})
รันคำสั่ง MySQL query โดยสร้างการเชื่อมต่อด้วย Connection identifier ${connid} ผลลัพธ์จากการ Query เก็บใน ${resultid}

3. คำสั่ง Fetech ข้อมูลในดาต้าเบส
เป็นคำสั่งที่ดึงค่าออกมาครับ ซึ่งเวลาเรา Query ดาต้าเบส เราจะได้ข้อมูลแบบ Array มา คำสั่ง Fetch จะดึงค่าจาก Array ออกมาให้เราเลยครับ
โค้ด: เลือกทั้งหมด
MySQL(Fetch fetchid ${resultid} var1\var2\...\varN)

ผลจากการ Select ถ้ามีข้อมูลใน row ค่า ${fetchid} จะถูกเซ็ตเป็น 1 และ row 1 row จะถูก fetch จากผลลัพธ์ซึ่งถูกเก็บอยู่ใน ${resultid} ค่าที่คืนกลับมาจะอยู่ใน ${var1}, ${var2},...${varN} ตามลำดับ ถ้ามีค่าเดียวก็จะมีแค่ตัวแปร ${var1} อย่างเดียวครับ

ถ้าผลจากการ Select ไม่มี row ใดเลย ค่า ${fetchid} จะถูกเซ็ตเป็น 0 และ ${var1}, ${var2},...,${varN} จะไม่มีค่า

4. คำสั่ง Nextresult
โค้ด: เลือกทั้งหมด
MySQL(Nextresult resultid ${connid})

ถ้าการ Query ให้ค่ามากกว่า 1 ผลลัพธ์ มันจะเก็บอยู่ใน next result ซึ่งถูกเซ็ตอยู่ใน ${resultid} มีประโยชน์ในการทำงานแบบ stored procedures

** คำสั่งนี้ผมไม่ค่อยเข้าใจเท่าไหร่ครับ แปลมาจากเว็บของ Asterisk ยังไม่เคยใช้งานคำสั่งนี้เลย **

5. คำสั่ง Clear ข้อมูลผลลัพธ์
เคลียร์ผลลัพธ์ที่เก็บไว้ในหน่วยความจำ เป็นการปล่อยหน่วยความจำให้ว่างครับ คำสั่งคือ
โค้ด: เลือกทั้งหมด
MySQL(Clear ${resultid})


6. คำสั่ง Disconnect ดาต้าเบส
ตัดการเชื่อมต่อกับ MySQL เสร็จงานแล้วเราต้อง Disconnect ครับ ไม่งั้น MySQL ก็จะมี Session ค้างมากมายจนอาจจะรับงานใหม่ไม่ได้อีก คำสั่งคือ
โค้ด: เลือกทั้งหมด
MySQL(Disconnect ${connid})


ตัวอย่างการใช้งานครับ
มาลองดูตัวอย่างการใช้คำสั่ง MySQL ใน Asterisk Dialplan กันครับ ตัวอย่างนี้ผมจะ Query ข้อมูลในดาต้าเบส asterisk เทเบิล queues_config ว่ามี queue เบอร์ 1000 อยู่มั๊ย ถ้ามีก็ส่งเสียง beep 1 ครั้ง

[check-queues]
exten => _X.,1,MySQL(Connect connid localhost root 123456 asterisk)
exten => _X.,n,MySQL(Query resultid ${connid} SELECT extension FROM queues_config WHERE extension=${EXTEN})
exten => _X.,n,MySQL(Fetch fetchid ${resultid} queue)
exten => _X.,n,MySQL(Clear ${resultid})
exten => _X.,n,MySQL(Disconnect ${connid})
exten => _X.,n,ExecIf($["${fetchid}" = "1"]?Playback(beep))

ถ้าค่า ${fetchid} เป็น 1 แสดงว่ามีเบอร์นั้นๆใน Queue ก็จะมีเสียง beep ออกมา

บทความที่เกี่ยวข้อง
เทคนิคการแก้ปัญหาเมื่อ Asterisk ฟ้อง No RTP Engine
เทคนิคการติดตั้ง Asterisk-GUI เพื่อคอนฟิก Asterisk
การเขียน Dialplan เพื่อโอนสายไปยังเบอร์อื่นตามเงื่อนไขการโทร
เทคนิคการดาวน์โหลดไฟล์เสียง mp3 จากเว็บ TTS (ใหม่)
เทคนิคการติดตั้ง Asterisk 16.x + DAHDI 2.11.1 บน CentOS 7
เปิดบริการ อบรม Issabel/FreePBX/Elastix ด้วยคอร์สพิเศษ ให้ติดตั้ง คอนฟิกคล่อง ใช้งานคล่อง ได้ใน 3 วัน
วิธีการติดตั้ง Issabel บน CentOS 7
ตัวอย่างการใช้งาน Action URL บน Grandstream IP Phone
รวมเทคนิคการใช้งาน RasPBX - Asterisk on Raspberry Pi