یکی از قابلیت های موجود در Asterisk نوشتن AGI با استفاده از زبانهایی همانند: php, perl, Python و … میباشد. شما میتوانید با کمک گیری از این زبان ها، مدیریت تماس را از Dialplan گرفته و با توجه به پردازشی که میخواهید روی دادهها داشته باشید، خیلی سریعتر هدف خود را پیاده سازی کنید.
راه اندازی سیستم نظر سنجی با استفاده از AGI:
در این سناریو میخواهیم یک سیستم نظر سنجی بر روی Elastix پیاده سازی کنیم به این صورت که شخص بعد از اتمام تماس خود با اپراتور میتواند منتظر بماند تا وارد منوی دیگری شده و در آنجا نظر خود را نسبت به پاسخ گویی اپراتور اعلام کند.
- ابتدا یک صف بر روی الستیکس خود تعریف کرده.
- برای اینکه بتوانیم تنظیماتی را که از طریق محیط وب الستیکس قابل تنظیم شدن نیستند را خود اضافه کنیم باید مراحل زیر را انجام دهیم.
- ابتدا فایل etc/asterisk/queues_additional.conf/ را باز کرده و تمامی تنظیمات مربوط به صف خود را در فایل etc/asterisk/queues_custom.conf کپی کنید با این کار شما می توانید تنظیمات دلخواه خود را بر روی صف اعمال کنید.
تمامی فایلهای elastix که در نام آنها additional وجود دارد مانند queues_additional.conf بعد از اعمال تغییرات در محیط وب تنظیمات جدید بر روی آنها نوشته میشود به همین دلیل اضافه کردن پارامترهای خود در این فایل بعد از انجام تغییرات جدید از بین خواهند رفت. برای همین باید تنظیمات خود را در فایلهایی که custom در آنها وجود دارد کپی کنید و سپس تغییرات خود را بر روی آن اعمال کنید.
برای دریافت اطلاعات بیشتر از لینک زیر استفاده کنید.
http://www.freepbx.org/configuration_files
- سپس در فایل etc/asterisk/queues_custom.conf/ مقدار setinterfacevar را برابر با yes قرار دهید با این کار قبل از تماس با اپراتور متغیر های زیر تعریف خواهند شد.
MEMBERINTERFACE, MEMBERNAME, MEMBERCALLS, …
در واقع با داشتن این متغیر ها میتوانیم تماس گیرنده را از داخلی اپراتور مطلع ساخت و قبل تماس شماره داخلی را برای تماس گیرنده پخش کرد.
- تتظیمات مربوط به صف خود را میتوانید با توجه به نیاز خود تغییر دهید در زیر یک نمونه ساده تهیه شده است
[۱۰۰۰]
announce-frequency=0
announce-holdtime=no
announce-position=no
autofill=no
eventmemberstatus=no
eventwhencalled=no
joinempty=yes
leavewhenempty=no
maxlen=0
periodic-announce-frequency=0
queue-callswaiting=silence/1
queue-thereare=silence/1
queue-youarenext=silence/1
reportholdtime=no
retry=5
ringinuse=yes
servicelevel=60
strategy=ringall
timeout=15
weight=0
wrapuptime=0
member=Local/100@from-queue/n,0,100,SIP/100
member=Local/200@from-queue/n,0,200,SIP/200
; add this field for getting MEMBERINTERFACE variable and others
setinterfacevar = yes
- سپس فایل etc/asterisk/extensions_additional.conf/ را باز کنید و context مربوط به صف خود را پیدا کرده و آن را در فایل etc/asterisk/extensions_override_elastix.conf/ کپی کنید و تغییرات زیر را که با قلم تو پر نوشته شده را اضافه کنید.
[ext-queues]
include => ext-queues-custom
exten => 1000,1,Macro(user-callerid,)
exten => 1000,n,Answer
exten => 1000,n,Set(__BLKVM_OVERRIDE=BLKVM/${EXTEN}/${CHANNEL})
exten => 1000,n,Set(__BLKVM_BASE=${EXTEN})
exten => 1000,n,Set(DB(${BLKVM_OVERRIDE})=TRUE)
exten => 1000,n,ExecIf($["${REGEX("(M[(]auto-blkvm[)])” ${DIAL_OPTIONS})}” != “1″]?Set(_DIAL_OPTIONS=${DIAL_OPTIONS}M(auto-blkvm)))
exten => 1000,n,Set(__NODEST=${EXTEN})
exten => 1000,n,Set(MONITOR_FILENAME=/var/spool/asterisk/monitor/q${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
;exten => 1000,n,Queue(1000,t,,) –> this is default “notice the comment at the beginning”
exten => 1000,n,Queue(1000,c,,,,queue.py) ; change some Arguments
exten => 1000,n,AGI(voting.py) ; and finally add this
exten => 1000,n,Noop(Deleting: ${BLKVM_OVERRIDE} ${DB_DELETE(${BLKVM_OVERRIDE})})
exten => 1000,n,Set(__NODEST=)
exten => 1000,n,Goto()
exten => 1000*,1,Macro(agent-add,1000,)
exten => 1000**,1,Macro(agent-del,1000)
exten => *451000,1,Set(QUEUENO=1000)
exten => *451000,n,Goto(app-queue-toggle,s,start)
exten => h,1,Macro(hangupcall,)
option c باعث میشود تا بعد از قطع کردن تماس توسط اپراتور، تماس گیرنده به کار خود ادامه داده و دستور های بعدی در Dialplan اجرا شوند(در واقع exten h در context شما در نظر گرفته نمیشود).
queue.py نیز نام اسکریپتی است که به محض اتصال تماس با اپراتور اجرا خواهد شد.
voting.py نیز نام اسکریپتی است که بعد از قطع تماس توسط اپراتور اجرا خواهد شد.
- در مسیر var/lib/asterisk/agi-bin/ فایل queue.py را ایجاد کرده و به آن دسترسی اجرا شدن را بدهید.
chmod +x queue.py
این اسکریپت agi میتواند با هر زبان برنامه نویسی دیگری نوشته شود
محتویات فایل queue.py :
#!/usr/bin/env python from asterisk import agi agi = agi.AGI() agi.answer() member=agi.get_variable("MEMBERINTERFACE") if member: agi.verbose("talk to -> %s" % member) if '@' in member: num = int(member.split("/")[1].split('@')[0]) agi.appexec('Playback', 'the-operator') agi.say_number(num) else: num = int(member.split("/")[1]) agi.appexec('Playback', 'the-operator') agi.say_number(num)
برای استفاده از این اسکریپت باید pyst را بر روی سیستم خود داشته باشید.
http://sourceforge.net/projects/pyst/
در فایل بالا به محض برقراری ارتباط با اپراتور شماره اپراتور با تماس گیرنده اعلام میشود.
- حال برای سیستم نظر سنجی فایل voting.py را با دسترسی اجرا ایجاد کرده و محتویات زیر را درون آن بگذارید توجه داشته باشید این اسکریپت بعد از قطع تماس توسط اپراتور اجرا میشود.
البته قبل از این کار یک database برای سیستم نظر سنجی خود ایجاد و یک table ساده همانند زیر را در آن ایجاد کنید
CREATE TABLE IF NOT EXISTS `vote` ( `id` int(11) NOT NULL AUTO_INCREMENT, `vote` enum('satisfied','unsatisfied') NOT NULL, `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
محتویات فایل voting.py
#!/usr/bin/python import MySQLdb from asterisk import * a = agi.AGI() # Read(variable[,filename[&filename2[&...]][,maxdigits[,options[,attempts[,timeout]]]]]) a.appexec('Read', options='vote_variable,please-enter-your-vote, 1,,,10') vote = int(a.get_variable('vote_variable')) if vote == 1: vote_str = 'satisfied' elif vote == 2: vote_str = 'unsatisfied' else: vote_str = 'not valid' a.verbose(vote_str) if vote_str != 'not valid': con = MySQLdb.connect(host='localhost', db='voting', user='root', passwd='root') cur1 = con.cursor() cur1.execute('insert into vote (vote) value (%s)'% vote)
پایان