Asterisk มีจุดแข็งมากเรื่อง voicemail เวลาเราสร้าง account แล้วก็จะสามารถใช้งานระบบรับฝากข้อความได้เลยทันที
แต่ระบบผมนั้น การมาสร้าง account เป็นเรื่องที่เป็นไปไม่ได้ เนื่องจากผมมี Asterisk Server หลายตัว และมอง Asterisk ทำหน้าที่เพียงแค่เชื่อมต่อเป็นหลัก ดังนั้นจึงต้องเขียนเป็นแบบ dynamic คือไม่สนใจเรื่อง account ใน Asterisk (อันที่จริงจะไม่มีการสร้าง account ใดใดเพื่อใช้งานเลย) โดยที่ระบบ voicemail จะต้องสามารถเก็บบันทึกไฟล์เสียงได้ และส่งไฟล์เสียงไปเก็บไว้ที่ใดที่หนึ่ง เช่นเดียวกับการเข้ามาตรวจสอบข้อความเสียง ระบบต้องสามารถไปดึงไฟล์เสียงจาก server อื่น มาได้ (อาจเป็น ftp, samba)
ก่อนอื่นมาดูคำสั่งสำหรับฝากข้อความเสียงก่อน นั่นคือคำสั่ง VoiceMail()
1.2: VoiceMail([flags]boxnumber[@context][&boxnumber2[@context]][&boxnumber3])
1.4: VoiceMail(boxnumber[@context][&boxnumber2[@context]][&boxnumber3],[flags])
งานแบบนี้ จริงๆ ก็ไม่ได้ยากอะไร(สำหรับบางคน?) อันที่จริง แค่เขียน AGI scripts รอเมื่อเกิด signals ไม่รับสาย (busy) หรือ ปลายทางไม่รับโทรศัพท์ (no answer) ก็ให้เล่นเข้าสู่ IVR แนะนำการบันทึกเสียง ระบบบันทึกเสียง และนำไปเก็บยังแหล่งเก็บข้อมูล หรืออาจมีการส่ง sms ไปแจ้งเตือนว่า มี voicemail ใหม่ ใน inbox ในส่วนของการเข้าระบบตรวจสอบ voicemail ก็เป็น IVR เช่นกัน งานก็ทั่วๆไปเช่น กด 1 เพื่อฟังข้อความ กด 4 ฟังข้อความต่อไป กด 5 ฟังอีกครั้ง กด 7 ลบข้อความ อะไรอย่างนี้
ถ้าเขียนเองก็จบ แต่ก็อยากใช้ระบบ voicemail ของ Asterisk อยู่นี่นา... ทำไงดี?
ตอนนี้สรุปก่อนว่า ผมมีสองทางเลือก
1. ทำระบบ Voicemail เอง
2. ใช้ระบบของ Asterisk Voicemail
1. ทำระบบ Voicemail เอง
อะไรนะ!!?? ทำเองเหรอ ตลกล่ะ งานแบบนี้ งาน common น่าจะมีคนทำบ้างแล้ว หลังจากค้นๆ ดู ก็พบว่ามี project ที่ชื่อว่า Magic VoiceMail พัฒนาโดยคุณ hoowa.sun (คนจีน) ซึ่งเค้าได้เขียนข้อดีของ Magic VoiceMail ไว้ว่า มันปรับแก้ไขได้ง่ายกว่า app_voicemail.c
(app_voicemail.so) และยังง่ายต่อการทำงานกับความหลากหลายภาษา (ภาษาจีน
ภาษาญีปุ่น ภาษาไทย..) ได้อีกด้วย (ก็แหงล่ะ interpreter นี่ สะดวกกว่า
ไม่ต้องมานั่ง compile ให้ยุ่งยาก เสียเวลา)
ที่ไม่ชอบใจคือ
1. agi scripts นี้เขียนด้วย PERL ไม่ได้บอกว่า PERL ไม่ดี แต่ผมไม่ชอบให้ระบบหนึ่งๆ มีหลายภาษา
2. ใส่ comment ให้ด้วยภาษาจีน ที่จริงไม่สำคัญเท่าไหร่ แค่เขียนทำให้มันดูมีข้อเสียเอยะๆ
เคยแก้ script ที่คนญี่ปุ่นเขียน ตัวแปร comment และอื่นๆ ที่พอจะเป็นภาษาญี่ปุ่นได้ ใช้ญี่ปุ่นหมด พาลนึกว่ามาแก้โปรแกรมที่ถูก obfucation ชาตินิยมจริงๆ
มีข้อเสีย 2 ข้อเอง.... เพียงพอให้ผมเขียนเองไหม?
2. ใช้ระบบของ Asterisk Voicemail
โดยปกติ Asterisk จะเก็บ voicemail ไว้ที่ /var/spool/asterisk/voicemail/<account>/<inbox>/
ดังนั้นถ้าผมชี้ให้ filesystem มอง /var/spool/asterisk/voicemail/ ไปยัง network file system (NFS, Samba) ก็น่าจะเอา voice ไปเก็บที่ server อื่นได้โดยง่าย
และโดยปกติแล้วระบบ VoiceMail ของ Asterisk จะมีการตรวจสอบ account และ password ซึ่งต้องมีการสร้างเอาไว้ล่วงหน้า เสียก่อน ซึ่งขัดกับแนวคิดของผม ที่ไม่ต้องการให้ asterisk มี account ใดๆ เลย ดังนั้นในกรณีนี้ผมต้องปรับแต่ง macro ซึ่งอาจจะไปดึง user/password ของผู้ใช้ ผ่านทาง AGI แทน
เหตุที่ไม่ต้องการให้ ให้ asterisk มี account ใดๆ เพราะต้องการลดการ config asterisk มากที่สุด ตลกไหม หากต้องมาสร้าง account ให้กับ asterisk server ทุกๆ เครื่อง (ถ้ามี 4 เครื่องไม่ตายเหรอ) ฮั่นแน่ รู้นะ จะให้ผมใช้อีกเครื่องจัดการเรื่อง account ใช่ไหม ไม่เอาหรอกครับ ถ้า server นี้ล่มล่ะ ทุกอย่างก็ล่มหมดสิ
Asterisk Server ทั้งหมด (1 Server / 4xE1) ทำงานได้เหมือนกัน เครื่องไหนล่ม ก็ล่มไป ยังมีอีก 3 เครื่องที่ใช้งานได้ และถ้าหาก Asterisk Server ล่ม ผมต้องสามารถ setup กลับได้ ภายใน 30 นาที (ทั้ง format ทั้ง config อะไรทั้งหมด) นี่จริงเป็นเหตุผลว่า ทำไมผมไม่อยากไปปรับแต่ง หรือมีเงือนไขกับ asterisk ให้มากนัก
แต่ถึงกระนั้นมันก็เลี่ยงไม่ได้ ระบบผมยังต้องมีการปรับแต่งการทำงานของ dialplans, มี custom AGI อยู่ดี รวมไปถึงกรณีของ Voicemail ด้วย หากใช้ระบบของ asterisk เอง ผมต้องปรับแต่งระบบ VoiceMail ของ Asterisk เช่นกัน ขัดกับแนวคิดของผมอยู่ แต่ทำไงได้ ถ้าอยากใช้ ก็ต้องทำ
ถามว่า ทำไมถึงอยากใช้ ระบบ Voicemail ของ Asterisk นักล่ะ? ก็เพราะว่า ระบบ voicemail ของ asterisk นั้น advance ดี feature เยอะ กลายเป็นว่า boss อยากให้เอาบางส่วนออก แต่ถ้าอย่างนั้นต้อง recompile และปรับแต่ง source code อีก โชคดีว่า Asterisk ยังมี config ให้เป็นบางส่วน แต่ก็ไม่ทั้งหมด ก็เอาเป็นว่าปรับอะไรได้ก็ปรับให้แล้วกัน
สรุปว่า ผมเลือกใช้ระบบ Voicemail ของ Asterisk ไปก่อน ถ้ามันยุ่งยากนักไว้ค่อยทำ voicemail เองก็ได้
Links
voip-info: Asterisk Voicemail
voip-info: คำสั่ง VoiceMail() เอาไว้สำหรับฝากข้อความเสียง
voip-info: คำสั่ง VoiceMailMain() เอาไว้สำหรับการเข้ามาตรวจสอบ voicemail box
Magic VoiceMail
vmspool_manager
Asterisk voicemail database
Asterisk Voicemail ODBC Storage
Centralizing Asterisk Voicemail Services