مقدمه

تحولات اخیردرحوزه مخابرات جهانی و جهت گیری آن به سمت ایجاد و توسعه سیستم های ارتباطی تحت شبکه تاثیرات بسزایی بر سیستم های تلفنی و روند پیشرفت آنها داشته است. امروزه شبکه های تلفنی مبتنی برسوئیچینگ مداری به سرعت در حال جایگزینی با شبکه های تلفنی IPBase هستند. در این میان راهکارهای بسیاری توسط شرکت های مختلف ارائه شده است. یکی از معروفترین آنها شرکت دیجیوم می باشد که راهکار متن باز استریسک را معرفی نموده است. همانطور که میدانید استریسک یکی از قدرتمندترین و محبوب ترین سافت سوییچ های متن باز موجود در دنیای مخابرات و IT می باشد. یکی از عمده ترین دلایل محبوبیت آن امکان برنامه نویسی به زبان های مختلف بر روی این سافت سوییچ و نسخه های متفاوت آن نظیر Asterisknow-TrixBox-Elastix می باشد. با توجه به این قابلیت، استریسک در سالهای اخیر مورد توجه مدیران IT سازمان های مختلف قرارگرفته است. زیرا امکان مدیریت و شخصی سازی سیستم تلفنی آن سازمان با استفاده از برنامه نویسی فراهم می باشد. در این مقاله به معرفی زبان های برنامه نویسی در استریسک می پردازیم.

مفاهیم برنامه نویسی استریسک

Dialplan: به عنوان زبان اصلی برنامه نویسی و قلب استریسک شناخته شده است واستریسک این زبان را در قالب فرمت text معرفی مینماید .

AGI: مخفف Asterisk Gateway Interface می باشد و استریسک این اجازه را می دهد که DialPlan نویسی را در محیطی غیر از فایل های متنی استریسک و در یک زبان برنامه نویسی انجام داد در این حال تماس (Channel) به آن زبان پاس داده می شود. برای زبان های گوناگون کتابخانه های ارتباط با استریسک نوشته شده است. از AGI معمولا برای ساخت IVR های اختصاصی و هوشمند استفاده می شود مثلا: تلفنبانک، ثبت اطلاعات، پیگیری تلفنی و …

AMI: مخفف Asterisk Management Interface می باشد و ا ستریسک این اجازه را می دهد که یک برنامه خارجی بر روی پورتی خاص به استریسک متصل شده و اطلاعات دریافت نماید و یا برخی دستوراتی را به استریسک ارسال نماید. از AMI معمولا برای ارتباط برنامه های دیگر همچون CRM ها به استریسک و یا ساخت برنامه های Monitoring ویا Managing استفاده می شود. از برنامه های معروف که از AMI استفاده می کنند: FOP, FOP2

Dialplan

  • DialPlan همان مسیر تماس Call Flow است.
  • هر تماسی که برقرار می شود باید یک مسیر تماس تعریف شده داشته باشد.
  • با DialPlan نویسی می توان امکانات قبلی استریسک را تغییر داد و یا امکان جدی نوشت.
  • با DialPlan نویسی می توان بر روی مسیر های تماس موجود تاثیر گذاشت و یا مسیر تماس جدیدی نوشت.
  • در حین DialPlan نویسی یا همان مسیر نویسی می توان از تمامی Application های استریسک استفاده نمود.

Context

  • Dial Planها به بخش های متفاوتی تقسیم می شوند که هر بخش Context نامیده می شود.
  • تمامی دستورالعمل های نوشته شده بعد از تعریف هر context بخشی از آن Context محسوب می شوند.
  • هر یک از contextها دارای اسامی منحص به فرد می باشند که این اسامی بین علامت [] قرارداده می شوند.
  • contextهابه دو صورت [globals] , [general]تعریف می شوند.

نام هر context می تواند عدد، حرف و یا ترکیبی از آنها باشد. بعنوان مثال: .[incoming][out-00].

 نکته: از نام گذاری context ها به صورت [general], [default], [globals] خودداری کنید.  نکته : در context ها می توانید با دستور include ،Goto،…contextهای دیگر را فراخوانی کنید.

شکل زیر ارتباط بین channel configuration و context ها در dialplan را از نقطه شروع نشان میدهد.


{{ :extension.png?nolink&200 |

 از مهمترین پارامترهای مورد نیاز در تعریف channel و extension کانتکس ها می باشند.

در ادامه به توضیح بخش های مختلف یک context می پردازیم:

Variable

- همانند هر زبان برنامه نویسی در dialplanهم از متغیر ها برای بهبود بخشیدن برنامه استفاده میکنیم. - متغیرها دارای نام منحصر به فرد می باشند که اطلاعات را در خود ذخیره میکنند. Syntax آنها به صورت روبه رو می باشد. ${Name} - متغیر ها در dialplanبا حروف کوچک و بزرگ نوشته می شوند. - به طور کلی به چند گروه تقسیم می شوند:

1-متغیرهای اصلی(Global)

این نوع متغیرها در فایل extensions.conf یا globals_custom.conf به صورت کانتکس[global]تعریف می شوند. متغیرهای اصلی در dialplan در هر بخشی از برنامه می توانند فراخوانی شوند.

[globals]

gexten=SIP/222

2- متغیرهای کانال (Channel)

این گروه متغیرهایی هستند که صرفا مربوط به یک تماس خاص می باشند و فقط تا زمانی که آن تماس برقرار میباشد می توان از آن ها استفاده وآنها را فراخونی نمود.همانند CALLERID…. بالعکس متغیرهای اصلی را نمی توان در هر مکانی فراخوانی کرد.

این نوع متغیرها با استفاده از کامند ”Set()” اطلاعات کانال جاری را در خود ذخیره می کنند.

    exten => 301,1,Set(masoud=SIP/100)
          same =>n,Dial(${masoud})
          

تعداد زیادی از متغیرهای channel به صورت از پیش تعریف شده موجود می باشند. استریسک می تواندبعضی از متغیرهای از پیش تعریف شده را در dialplan فراخونی نماید. به این نوع متغیرها که به صورت منحصر به فرد وفقط با استفاده ازحروف بزرگ رزور شده اند متغیرهای سیستمی نیزگفتهمیشود.(در ادامه به چند نمونه از این متغیرها اشاره شده است. )

}$CALLERID(all)}, ${CALLERID(name)}, ${CALLERID(num)}, ${CHANNEL}, ${CONTEXT}, ${EPOCH}, ${EXTEN}, ${SIPUSERAGENT}, and ${UNIQUEID{

در این لینک لیستی کامل از متغیرهای سیستمی نمایش داده شده است

با ذکر مثال کاربرد استفاده از متغیرهارا درdial plan مشاهده خواهیم کرد: برای تعریف متغیر های اصلی همان طور که گفته شد در فایل extensions.confبه صورت زیر تعریف می کنیم:

 [globals]
 masoud=SIP/100
 ali=SIP/200
 reza=DAHDI/1
 

همچنین می توان در طول برنامه برای تعریف متغیرهای اصلی ازدستورSetGlobalVar استفاده کرد.

 [internal]
 exten => 123,1,SetGlobalVar(masoud=SIP/100)
  [lab] 
  exten => 4000,1,Answer 
  exten => 4000,n,Wait(1) 
  exten => 4000,n,Set(TIMEOUT(digit)=3) 
  exten => 4000,n,Set(TIMEOUT(response)=10) 
  exten => 4000,n,Background(custom/mainivr) 
  exten => 4000,n,WaitExten(,) 
  exten => 1,1,Goto(ext-603,s,1)
  exten => 2,1,Goto(day-audio,s,1)
  exten => 3,1,Goto(ext-doble,s,1)
  exten => i,1,Playback(invalid) 
  exten =>i,n,Hangup() 
  exten => t,1,Hangup()
  exten => hang,1,Playback(vm-goodbye) 
  exten =>hang,n,Hangup
   [ext-603]
   exten => s,1,Dial(${masoud},,r) 
   exten =>s,n,Hangup() 
   
  [day-audio]
   exten => s,1,Playback(custom/day) 
   exten =>s,n,Hangup()
    
  [ext-doble]
  exten => s,1,Dial(${ali}&${reza},10) 
  exten =>s,n,Hangup()
  
  

متغیر ${EXTEN}از جمله متغیر های پر کاربرد کانال می باشد. در حقیقت به شماره گرفته شده یا extensions گفته می شود. به مثال زیر توجه کنید:

   exten => _XXX,1,Answer()
  same =>n,SayDigits(${EXTEN}) 

بعد از گرفتن هر شماره 3 رقمی تابع SayDigitsآن را به صورت digitبرای کاربر می خواند.

${EXTEN:x} : از این syntax هنگامی که بخواهیم عددی را جدا کنیم استفاده می شود.

exten => _XXX,1,Answer()
same =>n,SayDigits(${EXTEN:1})

در این مثال رقم اول حذف و2 رقم آخر به صورترقم رقم یا در اصطلاح digit بیان می شود.

exten => _XXX,1,SayDigits(${EXTEN:-1))

در مثال بالا 2 رقم اول حذف وفقط رقم آخر به صورت digtiمی شود.

${EXTEN:x:y}: در این syntax ،X تعداد ارقامی است که می خواهیم از عدد جدا شود و y تعداد ارقام انتخاب شده می باشد.

به طور مثال در عدد94169671111 و ${EXTEN:1:3} خروجی 416 می باشد.

[outbound-local]
exten => _9NXXXXXX,1,Dial(DAHDI/g0/${EXTEN:1})
exten => _9NXXXXXX,2,Congestion( )
چاپ/برون‌بری