VoIPدانشنامهشبکه و اینترنت

آموزش Dial Plan در استریسک

Dial Plan چیست؟

یکی از جذاب ترین قسمت های استریسک جایی است که جریان تماس ساخته می شود، هر تماسی که برقرار می شود و به هر قسمتی که می خواهد برود باید در DialPlan دارای مسیر تعیین شده باشد. DialPlan ساختاری گام به گام دارد که در ادامه با آن آشنا خواهیم شد.

مفاهیم اولیه Dial Plan

به صورت پیش فرض فایل تنظیمات dial plan برای پیکربندی extensions.conf نام دارد و می توان آن را در مسیر etc/asterisk یافت. البته بسته به نحوه نصب کردن استریسک ممکن است محل فایل تنظیمات در جای دیگری باشد.

Dial Plan از چهار مفهوم کلی شامل contexts, extensions, priorities و applications تشکیل شده است که در ادامه به تمامی آن ها خواهیم پرداخت و سپس شما را با چگونگی ایجاد آن ها آشنا خواهیم کرد.

Context

Dial Plan ها به قسمت هایی به نام context تقسیم می شوند، context ها extension ها را با استفاده از اسامی مختلف دسته بندی می نمایند. (بهتر است context ها را گروهی از extension ها با اهدافی مجزا در نظر بگیریم). درواقع context ها مانع تداخل و یا تاثیر گذاری قسمت های مختلف یک Dial Plan بر یکدیگر می شوند. extension های تعریف شده در یک context کاملا مجزا از extension های دیگر در سایر context ها می باشند.

برای درک بهتر مثالی را بیان می کنیم: دو شرکت مستقل A و B را در نظر می گیریم که از یک سیستم مشترک Asterisk استفاده می نمایند و هرکدام منوی صوتی منحصر به فرد خود را داراست، با قرار دادن منوی صوتی هرکدام از شرکت ها در context مربوط به خودش هنگامی که مخاطبین هریک از این شرکت ها با آن تماس می گیرند به منوی صوتی مخصوص آن شرکت متصل می شوند با فشار دکمه ی ۰ به منشی مربوطه ی همان شرکت متصل می شوند. درواقع extension صفر (۰) با دو کاربرد جداگانه در Dial Plan یک سیستم واحد تعریف گردیده است.

Context ها با قراردان نام آن بین “[ ]” (brackets) مشخص می گردند. می توان از حروف کوچک یا بزرگ، اعداد و “–“یا “_” جهت نام گذاری اعداد استفاده نمود. برای مثال کانتکست تماس های ورودی:

[incoming]

همچنین تعداد کاراکتر های یک Context می تواند حداکثر ۸۰ حرف باشد. تمام فرمان هایی که پس از معرفه Context قرار می گیرند جزیی از همان Context می باشند و در پایان، کانتکست بعدی بلافاصله بعد از آخرین extension در کانتکست جاری تعریف خواهد شد. در ابتدای Dial Plan دو کانتکس خاص با اسامی [globals] و [general] وجود دارد که در کانتکست general تنظیمات عمومی Dial Plan و در globals تنظیماتی نظیر متغیر های محلی تعریف می گردند. این بدان معناست که از اسامی این دو کانتکست نمی توانیم برای تعریف کانتکست های خود استفاده نماییم. در ادامه بیشتر در مورد این دو کانتکست توضیح خواهیم داد.

یکی از کاربردهای کانتکست زمانی می باشد که یک channel (کانال تماسی) در سیستم تعریف نماییم، بدین صورت که یکی از پارامتر های کانال اسم context خواهد بود. به عبارت دیگر کانتکست نقطه شروع یک channel در Dial Plan می باشد.

مهمترین کاربرد دیگر context مقوله تامین امنیت می باشد. در واقع با استفاده صحیح از context می توانیم دسترسی و امکانات خاصی را روی سیستم به گروهی از کاربران بدهیم در حالی که این امکانات برای سایرین در دسترس نمی باشد مانند دسترسی جهت تماس راه دور یا خارج از کشور. بنابر این اگر Dial Plan به درستی طراحی نگردد، این امکان وجود دارد که به صورت ناخواسته به دیگران اجازه دهیم تا از سیستم تلفنی ما سو استفاده نمایند.

Extension

معمولا در دنیای ارتباطات، کلمه Extension به یکسری مشخصه های عددی اشاره می کند که به یک خط خاص اختصاص داده شده اند و در نهایت موجب به صدا در آمدن زنگ یک تلفن می شوند. اما در Asterisk یک Extension دارای کاربردهای بیشتری می باشد. بدین صورت که یک سری مراحل واحد را تعریف می نماید (هر مرحله شامل یک Application می باشد) که طی آن استریک تماس را پردازش می نماید. در هر Context بر حسب نیاز می توانیم به هر تعداد که می خواهیم Extension تعریف نماییم. هرگاه یک Extension اجرا می گردد (بتوسط یک تماس ورودی یا با شماره گیری ارقام از روی یکی از Channel ها) استریسک مراحلی را که برای آن Extension تعریف شده اند را دنبال می نماید. درواقع Extension ها نحوه پردازش تماس را در طول مسیری که در Dial Plan طی می کنند را مشخص می کنند. به هرحال همچنان می توانیم از همان حالت سنتی Extension ها برای اختصاص به یک تلفن به عنوان شماره آن بهره بگیریم ( به عنوان مثال Extension شماره ۱۵۳ می تواند زنگ تلفن SIP را که روی میز آقای John قرار دارد را به صدا در آورد).

Extension ها بتوسط کلمه exten بهمراه یک فلش <= مشخص می گردند:

exten =>

این مشخصه با اسم یا شماره Extension ادامه می یابد. هرگاه که با سیستم های تلفن سنتی سروکار داریم تنها این شماره ها هستند که به آن ها فکر می کنیم تا بتوانیم بتوسط آن ها به یک تلفن مشخص زنگ بزنیم. اما در استریسک Extension ها چیزی بیشتر از یک شماره می باشند. به عنوان مثال Extension ها می توانند ترکیبی از اعداد و حروف باشند که در ادامه به هردوی آن ها خواهیم پرداخت.

اختصاص دادن اسم (یا حروف) به Extension به نوبه خود یک انقلاب در صنعت تلفن به حساب می آید. تصور کنید بجای شماره تلفن یک شخص بتوانید از طریق یک اسم یا آدرس ایمیل وی با تلفن او تماس بگیرید. این یکی از مزایایی است که Asterisk را بسیار قدرتمند و قابل انعطاف ساخته است.

یک Extension از سه قسمت تشکیل شده است:

اسم (name) یا شماره (number)

اولویت (priority) (هر Extension می تواند دارای چندین مرحله باشد شماره هر مرحله priority یا اولویت آن می باشد)

برنامه (application) یا دستور (command) که یک سری پردازش یا اقداماتی را بر روی تماس صورت می دهد.

این سه قسمت با , (commas) از هم جدا می شوند:

exten => name,priority,application()

در اینجا می توانیم یک نمونه ساده از یک extension را مشاهده کنیم:

exten => 123,1,Answer()

در مثال فوق اسم (name) اکستنشن ۱۲۳ ، اولویت (priority) آن ۱ و برنامه آن ()Answer می باشد. در ادامه به priority و application می پردازیم.

Priority

هر extension می تواند شامل چندین مرحله باشد که به آن ها اولویت (priority) می گوییم. هر priority به صورت پی در پی شماره گذاری و با عدد یک شروع می شود که هرکدام یک application خاص را اجرا می نماید. به عنوان مثال در ادمه می بینیم که extension زیر در priority شماره ۱ به تماس پاسخ می دهد و در priority شماره ۲ آن را خاتمه می دهد.

exten => 123,1,Answer()

exten => 123,2,Hangup()

اولویت های بدون شماره (Priotities Unnumbered) :

در ورژن های قدیمی استریسک شماره گذاری priority ها برخی اوقات مشکلاتی را ایجاد می کرد برای مثال یک extension را در نظر بگیرید که دارای تعداد ۱۵ اولویت باشد حال اگر نیاز به اضافه کردن یک مرحله جدید در اولویت شماره ۲ باشیم، می بایست شماره تمامی اولویت های بعدی را به صورت دستی تصحیح نماییم. در واقع استریسک نمی توانست این ضعف در شماره گذاری را به خودی خود حل و فصل نماید در نتیجه debug کردن آن نیز خسته کننده و بی معنی می نمود.

با آمدن ورژن ۱.۲ استریسک این مشکل برطرف گردید. در این ورژن اولویت n که به معنی next می باشد معرفی گردید. درواقع هرگاه استریسک با شماره اولویت n برخورد می کند به شماره اولویت قبلی نگاه می کند و آن را با عدد ۱ جمع می زند. در نتیجه این امر باعث سهولت ایجاد تغییرات در Dial Planمی گردد و دیگر نیازی به شماره گذاری مجدد اولویت ها پس از ایجاد تغییرات نمی باشد. جهت درک بهتر به مثال زیر توجه نمایید:

exten => 123,1,Answer()

exten => 123,n, do something

exten => 123,n, do something else

exten => 123,n,do something last

exten => 123,n,Hangup()

استریسک هرگاه که با اولویت n مواجه می شود آن را محاسبه می نماید، همچنین باید توجه داشته باشید که حتما همیشه باید اولویت شماره ۱ را تعریف نمایید اگر بجای اولویت ۱ از n استفاده نمایید متوجه خواهید شد که آن extension وجود نخواهد داشت.

برچسب های اولویت (Priority Lables) :

از استریسک ورژن ۱.۲ به بالا یکی از روش های معمول در مشخص سازی اولویت ها، اختصاص دادن یک برچسب متنی (lables text) به اولویت ها می باشد. این به شما اطمینان می دهد تا بتوانید با چیزی به غیر از یک شماره به آن رجوع کنید. معمولا از lable text ها در اولویت های بدون شماره (unnumbered priority) استفاده می شود. برای تخصیص برچسب متنی به یک اولویت بلافاصله پس از اولویت، برچسب متنی خود را در یک پرانتز () قرار می دهیم. مانند مثال زیر:

exten => 123(lable),Application()

یکی از اشتباهات رایجی که در جهت نوشتن برچسب ها رخ می دهد قرار دادن کاما , بین اولویت و ) می باشد. مانند:

exten => 123,(lable),Application()

Application

Application موتور محرک Dial Plan ها محسوب می شوند. هر Application یک عملیات خاصی را بر روی channel جاری اعمال می کند مانند پخش یک صدا، دریافت اعداد ورودی توسط کاربر، شماره گیری یک channel خاص، قطع تماس و بسیاری پردازش های دیگر. در مثال های فوق شما با دو برنامه ی ()Answer و ()Hangup آشنا شدید که در ادامه با نحوه ی کار کرد آن ها نیز آشنا خواهید شد.

برخی از Application ها مانند ()Answer و ()Hangup به هیچ دستورالعمل یا پارامتر خاصی جهت پردازش تماس نیاز ندارند در حالی که بسیاری از Application ها به پارامتر هایی نیاز دارند. این نوع از پارامتر ها argument نام دارند. Argument ها به Application ها واگذار می شوند تا چگونگی پردازش تماس را برای آن Application مورد نظر تعیین نمایند. برای تعریف argument در Application کافیست تا آن ها را بلافاصله بعد از اسم Application بین پرانتز () قرار دهیم و مقادیر آن را با کاما , از هم جدا کنیم.

پیاده سازی یک Dial Plan ساده

دیگر وقت آن رسیده که اولین Dial Plan خود را پیاده سازی کنیم. پس با یک مثال ساده شروع خواهیم کرد که در آن به تماس پاسخ داده می شود، یک فایل صوتی پخش می شود و سپس تماس قطع می گردد. از این مثال به جهت اشاره به مبانی بسیار مهم Dial Plan بهره می گیریم.

برای اینکه مثال ما به درستی عمل نماید در نظر می گیریم به صورت پیش فرض یک channel از نوع SIP یا IAX و یا DAHDI در سیستم ایجاد شده است و تمامی تماس های ورودی به این channel به Dial Plan در کانتکست [incoming] وارد می شوند. قبل از ادامه ابتدا باید با برخی دیگر از قسمت های Dial Plan آشنا شویم.

The “s” Extension

از آنجایی که این دقیقا همان چیزی است که ما در مثال از آن استفاده خواهیم کرد پس با آن آشنا می شویم. هنگامی که تماسی که مقصد مشخصی ندارد به یک context وارد می شود (برای مثال یک خط FXO در حال زنگ خوردن)، آن تماس به اکستنشن s ارسال می گردد. s مخفف کلمه start می باشد.

در مثال در سه مرحله بر روی تماس پردازش انجام خواهیم داد. ابتدا به آن پاسخ می دهیم، سپس یک فایل صوتی پخش خواهد شد و در انتها تماس قطع می گردد. در نتیجه به سه priority نیاز داریم. پس ما priority ها در کانتکست [incoming] به صورت زیر تعریف خواهیم کرد.

[incoming]

exten => s,1,application()

exten => s,n,application()

exten => s,n,application()

Application های Answer , Playback و Hangup

قبل از پرداختن به مثال بهتر است با نحوه ی کار Application هایی که می خواهیم از آن ها در مثال استفاده کنیم آشنا شویم. برنامه ()Answer جهت پاسخ به تماس ورودی که در حال زنگ خوردن است استفاده می شود(مانند وقتی که گوشی تلفن در حال زنگ خوردن را بر می داریم). برخی از برنامه ها جهت پردازش خود نیازی ندارند که ابتدا تماس پاسخ داده شود به هرحال پاسخ دادن به تماس قبل از انجام هرگونه عملیات یک روش بسیار مناسب می باشد. از آنجایی که قبلا توضیح داده شده ()Answer نیاز به هیچ argument ندارد.

از برنامه ی ()Playback برای پخش فایل های صوتی بر روی یک channel استفاده می شود. هنگامی که از برنامه ()Playback استفاده می شود کد های ورودی بتوسط فرد تماس گیرنده هیچ گونه کارایی نخواهند داشت. به صورت پیش فرض Asterisk دارای بسیاری از فایل های صوتی آماده می باشد که در دایرکتوری پیش فرض آن (var/lib/asterisk/sounds/) قرار دارند.

برای استفاده از ()Playback کافیست تا اسم فایل مورد نظر را بدون پسوند به عنوان argument برای این برنامه تعریف کنیم. در نظر داشته باشید که اگر مسیر فایل صوتی را مشخص نکنیم، برنامه ی ()Playback به صورت پیش فرض تنها فایل های دایرکتوری پیش فرض (var/lib/asterisk/sounds/) را جستجو می نماید. در غیر این صورت باید مسیر فایل را برای آن مشخص نمایید. برای مثال (Playback(filename فایل filename.wav را در دایرکتوری var/lib/asterisk/sounds/en/ پخش می نماید و (Playback(home/john/sounds/filename فایل صوتی filename.wav را از مسیر مشخص شده پخش خواهد نمود. حال اگر در دایرکتوری چندین فایل صوتی با اسم مشابه اما با پسوند های متفاوت وجود داشته باشد Asterisk بهترین گزینه را که بار کمتری را به CPU تحمیل می کند انتخاب خواهد کرد.

برنامه ()Hangup همانطور که از نامش پیداست باعث قطع شدن channel فعال می شود. معمولا از این Application در انتهای context و هنگامی که می خواهیم تماس را قطع کنیم و از عدم ادامه تماس در Dial Plan اطمینان حاصل نماییم استفاده می گردد.

اولین Dial Plan

در این بخش می خواهیم با استناد به آموزش هایی که در بالا بیان شد اولین مثال Dial Plan را پیاده سازی کنیم. اولین مثال ما بر مبنای عبارت Hello World می باشد.

در priority اول به تماس پاسخ داده خواهد شد، دوم یک فایل صوتی به نام hello-world پخش می شود و در آخرین اولویت تماس قطع می گردد.

[incoming]

exten => s,1,Answer()

exten => s,n,Playback(hello-world)

exten => s,n,Hangup()

به سادگی می توانید خطوط مثال بالا را در فایل تنظیمات Dial Plan واقع در مسیر extensions.conf قرار دهید. با اینکه مثال فوق بسیار ساده است اما به خوبی مفاهیم context, extension, priority و application را بیان می کند. تا به اینجا شما مفاهیم پایه ایی Dial Plan را فرا گرفته اید.

ایجاد یک Dial Plan فعل و انفعالی (Interactive)

طرح تماسی که در قسمت قبل ساختیم یک Dial Plan ایستا (static) می باشد و همیشه عملیات یکسانی را بر روی تمامی تماس ها انجام می دهد. حال می خواهیم Dial Plan خود را بر اساس یک سری مراحل منطقی ایجاد کنیم تا سیستم بتواند بر اساس داده های ورودی توسط فرد تماس گیرنده عملیات های مختلفی را بر روی تماس انجام دهد از این رو ابتدا می بایست با تعدادی دیگر از application ها آشنا شویم.

برنامه های Background, WaitExten و Goto

یکی از application های کلیدی جهت ساخت Dial Plan های فعل و انفعالی برنامه Background می باشد. این برنامه مانند Playback یک فایل صوتی را پخش می کند اما بر خلاف آن هرگاه که تماس گیرنده کلیدی را بر روی تلفن خود فشار می دهد یا مجموعه ای از شماره ها را در حال پخش فایل صوتی می گیرد ادامه پخش فایل متوقف می شود و extension مربوط به شماره وارده توسط تماس گیرنده در context جاری اجرا می گردد. برای مثال اگر تماس گیرنده کلید ۵ را بر روی تلفن خود شماره گیری کند Asterisk پخش فایل صوتی را متوقف خواهد کرد و کنترل تماس را به priority شماره ۱ از extension شماره ۵ خواهد سپرد.

بیشترین کاربرد برنامه Background جهت ایجاد منو های صوتی (voice menu) می باشد که auto-attendants یا phone trees نیز نامیده می شوند. دستورالعمل نوشتاری Background کاملا مشابه Playback می باشد:

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

در نسخه های قدیمی استریسک اگر برنامه Background به پایان یک فایل صوتی می رسید و بعد از آن هیج priority دیگری در context وجود نداشت، استریسک منتظر ورودی کدها توسط تماس گیرنده می شد که در حال حاضر دیگر به این صورت کار نمی کند بلکه اگر شما می خواهید منتظر ورود کلید ها بعد از اتمام پخش فایل صوتی توسط کاربر باشید، می توانید از برنامه WaitExten استفاده نمایید. در حقیقت این application منتظر می ماند تا فرد تماس گیرنده کدهای DTMF را وارد کند. برنامه WaitExten می بایست بلافاصله بعد از Background در priority بعد از آن قرار گیرد. مانند مثال زیر:

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten()

آگر می خواهید برنامه WaitExten برای مدت زمان معینی (به غیر از زمان پیش فرض خود) به انتظار بپردازد، به سادگی میزان زمان مورد نیاز را با واحد ثانیه به عنوان یک argument به این برنامه ارجاء دهید:

exten => 123,n,WaitExten(5)

هر دو برنامه ی Background و WaitExten به فرد تماس گیرنده این اختیار را می دهد تا وی بتواند کد های DTMF را وارد نماید سپس استریسک در context جاری اقدام به جستجوی یک extension که باDTMF وارد شده مطابقت داشته باشد می نماید. اگر استریسک مطابقتی را پیدا کند جهت پردازش های بعدی تماس را به آن extension ارسال می کند. حال با اضافه نمودن چند خط جدید به مثال خود به آن می پردازیم:

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten()

exten => 2,1,Playback(digits/2)

exten => 3,1,Playback(digits/3)

exten => 4,1,Playback(digits/4)

اگر با داخلی ۱۲۳ در مثال فوق تماسی برقرار شود، یک متن صوتی که شامل واژه “main menu” می باشد پخش می شود و سپس منتظر دریافت ورودی می ماند. اگر یکی از کد های ۲, ۳ و یا ۴ وارد شوند استریسک کد وارد شده را برای فرد تماس گیرنده بازخوانی می نماید. حال اگر کد های دیگری نظیر ۵ را وارد نمایید چیز دیگری که شما انتظارش را دارید رخ نخواهد داد.

همچنین ممکن است استریسک در طی مسیر تماس در context با یک مطابقت دوگانه سروکار پیداکند. برای مثال با اضافه نمودن اکستنشن ۱ به مثال فوق به شرح آن می پردازیم:

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten()

exten => 1,1,Playback(digits/1)

exten => 2,1,Playback(digits/2)

exten => 3,1,Playback(digits/3)

exten => 4,1,Playback(digits/4)

در این مثال خواهیم دید، هنگامی که اکستنشن ۱۲۳ شماره گیری می شود اگر در منوی صوتی “main menu” عدد ۱ شماره گیری شود، مانند مثال قبل استریسک به سرعت عدد ۱ را بازخوانی نخواهد کرد. تاخیر ایجاد شده به این دلیل است که عدد ۱ در این context یک اکستنشن مبهم (ambiguous) برای استریسک به حساب می آید. زیرا در این مرحله استریسک نمی داند که آیا فرد تماس گیرنده می خواهد تنها عدد ۱ را شماره گیری نماید یا می خواهد با ادامه شماره گیری عدد ۱۲۳ را شماره گیری کند. بنابراین استریسک مقداری مکث می کند تا در یابد تماس گیرنده باز هم کدی (برای مثال کد ۱۲۳ در مثال بالا( را وارد می کند یا خیر. در این فاصله زمانی اگر کدی وارد نشود time out رخ خواهد داد و سرانجام استریسک تماس را به اکستنشن ۱ ارسال می کند.

قبل از اینکه ادامه بدهیم مروری می کنیم به آنچه تا به حال در مثال انجام داده ایم. اگر فردی با dial plan طراحی شده در مثال تماسی حاصل کند، یک پیغام خوش آمد برای وی پخش خواهد شد و اگر کلید ۱ را فشار دهد عدد یک، کلید ۲ را فشار دهد عدد دو و به همین ترتیب تا عدد ۴ برای وی بازخوانی خواهد شد. حال می خواهیم بر پویایی dial plan بیافزاییم برای این امر از برنامه Goto استفاده می کنیم و برای مثال می خواهیم پیغام خوش آمد گویی بعد از بازخوانی اعداد در مثال فوق تکرار شود.

همانطور که از نام برنامه Goto پیداست، باعث می شود تا تماس به قسمت دیگری از dial plan ارجاع داده شود. نحوه نگارش این برنامه بدین گونه است که می بایست نام context مقصد، extension و priority به عنوان یک argument به برنامه ارجاع داده شوند، مانند:

exten => 123,n,Goto(context,extension,priority)

حال این برنامه را در dial plan خود به کار میبریم:

[incoming]

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten()

exten => 1,1,Playback(digits/1)

exten => 1,n,Goto(incoming,123,1)

exten => 2,1,Playback(digits/2)

exten => 2,n,Goto(incoming,123,1)

دو خط اضافه شده جدید، کنترل تماس را بعد از بازخوانی اعداد وارد شده به اکستنشن ۱۲۳ بر میگرداند. حال اگر جزئیات برنامه Goto را بررسی کنیم، متوجه خواهیم شد می توانیم یک، دو و یا هر سه argument را به این برنامه ارجاع دهیم. اگر تنها یک argument باشد استریسک آن را به عنوان priority مقصد، اگر دو argument باشد به ترتیب آن ها را به عنوان extension و priority در context جاری در نظر می گیرد. در مثال فوق برای درک بهتر هر سه argument را ارجاع دادیم در حالی که ارجاع extension و priority به تنهایی تاثیر مشابهی دارد.

رفع و رجوع Invalid Entries (ورودی های نا معتبر) و (Time Out)

در ادامه می خواهیم منوی صوتی (voice menu) خود را تکمیل نماییم. برای این کار می خواهیم از extension های منحصر بفردی استفاده نماییم از این رو ابتدا به اکستنشنی نیاز داریم تا بتواند ورودی های نامعتبر را پردازش کند که با مثالی به آن می پردازیم؛ اگر در مثال فوق تماس گیرنده، یک ورودی نامعتبر مانند عدد ۹ را وارد نماید استریسک تماس را به اکستنشن خاص i ارسال می کند. دوم اینکه به اکستنشنی نیاز داریم که بتواند در مواقعی که تماس گیرنده هیچ کلیدی را در بازه زمانی time out (به صورت پیش فرض ۱۰ ثانیه) شماره گیری نمی نماید تماس را کنترل کند بنابراین اگر ورود digit ها بتوسط فرد تماس گیرنده پس از ()WaitExten بیش از حد به طول بینجامد، استریسک تماس را به اکستنشن t ارسال خواهد کرد. در مثال زیر خواهیم دید dial plan که در مراحل قبل ایجاد نمودیم با اضافه نمودن این extension های خاص به چه صورت خواهد بود:

[incoming]

exten => 123,1,Answer()

exten => 123,n,Background(main-menu)

exten => 123,n,WaitExten()

exten => 1,1,Playback(digits/1)

exten => 1,n,Goto(incoming,123,1)

exten => 2,1,Playback(digits/2)

exten => 2,n,Goto(incoming,123,1)

exten => 3,1,Playback(digits/3)

exten => 3,n,Goto(incoming,123,1)

exten => 4,1,Playback(digits/4)

exten => 4,n,Goto(incoming,123,1)

exten => i,1,Playback(pbx-invalid)

exten => i,n,Goto(incoming,123,1)

exten => t,1,Playback(vm-goodbye)

exten => t,n,Hangup()

به کارگیری از اکستنشن های خاص i و t باعث پویاتر شدن dial plan شده اند اما dial plan ما هنوز تکمیل نشده است و محدود می باشد، زیرا فرد تماس گیرنده از بیرون هیج راهی برای برقراری ارتباط با یک فرد حاضر در سیستم تلفنی ما را ندارد. برای انجام این کار می بایست با application دیگری به نام Dial آشنا شویم.

برنامه ()Dial

یکی از قابلیت های ارزشمند استریسک توانایی آن در برقراری ارتباط بین تماس های مختلف می باشد. علی الخصوص این امر در مواقعی که تماس هایی با متد های مختلف برقرار می گردند کارایی خود را نشان می دهد. به عنوان مثال، ممکن است فرد A بخواهد از طریق خطوط آنالوگ PSTN با فرد B که در مکان جغرافیایی دیگری حضور دارد و از تلفن IP استفاده می کند تماس برقرار کند. خوشبختانه استریسک قسمت سخت کار را جهت برقراری ارتباط بین تکنولوژی های مختلف تماس انجام داده است و تنها کاری که شما می بایست انجام دهید، اینست که نحوه کار با برنامه ()Dial را بیاموزید.

دستورالعمل استفاده از ()Dial اندکی پیچیده تر از آن چیزی است که تا به حال آن را فرا گرفته اید. اما نگران نباشید، این برنامه می تواند تا چهار argument را بپذیرد. اولین آن ها مقصد تماس می باشد که از تکنولوژی تماس یک / و نقطه ی پایانی (endpoint) یا منبع (resource) می باشد تشکیل شده است. تکنولوژی های مرسوم شامل: DAHDI (برای خطوط آنالوگ و E1)، SIP و IAX می باشند.

exten => 123,1,Dial(Technology/Resource,timeout,options,URL)

برای مثال فرض می کنیم می خواهیم با یک نقطه پایانی DAHDI که به یک کانال FXS از نوع آنالوگ متصل می باشد و با DAHDI/1 مشخص شده تماس بگیریم، پارامتر ها به این ترتیب خواهند بود: تکنولوژی DAHDI و منبع ۱ خواهند بود. به همین ترتیب برای تماس با یک دستگاه SIP (تعریف شده در فایل sip.conf) مقصد تماس SIP/Jane و برای تماس با یک دستگاه IAX (تعریف شده در فایل iax.conf) مقصد IAX/Fred خواهد بود. حال اگر بخواهیم با شماره گیری اکستنشن ۱۲۳ در dial plan استریسک باعث به صدا درآمدن زنگ کانال DAHDI/1 شود می بایست اکستنشن زیر را در dial plan اضافه کنیم:

exten => 123,1,Dial(DAHDI/1)

همچنین می توانیم با چندین کانال به صورت همزمان ارتباط برقرار کنیم، این کار را با به هم پیوستن مقصدهایمان از طریق کاراکتر & انجام می دهیم. به صورت زیر:

exten => 123,1,Dial(DAHDI/1&DAHDI/2&SIP/Jane)

در مثال فوق برنامه ()Dial زنگ تلفن تمامی مقصد های تعریف شده را به صورت همزمان به صدا در می آورد و ارتباط تماس ورودی (فرد تماس گیرنده) را با کانالی که زودتر به تماس پاسخ دهد، برقرار می نماید. اگر برنامه ()Dial نتواند با هیچ کدام از مقاصد تعریف شده ارتباط برقرار کند، استریسک دلیل عدم برقراری تماس با مقاصد تعریف شده را در یک متغیر (variable) به نام DIALSTATUS قرار می دهد و سپس به مسیر خود در dial plan بر حسب priority های تعریف شده آن extension ادامه می دهد.

همچنین برنامه ()Dial این امکان را به ما می دهد تا بتوانیم بدون تعریف یک end point در فایل های channel (مانند sip.conf, iax.conf و h323.conf) با آن تماس برقرار کنیم. نحوه نگارش آن به صورت زیر می باشد:

exten => 123,1,Dial(technology/user[:password]@remote_host[:port][/remote_extension])

برای مثال، جهت برقرای تماس با سرور demo شرکت Digium با استفاده از پروتکل IAX2 می توانید به روش زیر اقدام کنید:

exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)

نحوه نگارش برنامه ()Dial جهت شماره گیری بر روی channel های DAHDI اندکی متفاوت است، فرمت کامل آن بدین صورت می باشد:

Dial(DAHDI/[gGrp]channel_or_group[/remote_extension])

جهت برقراری تماس با شماره ۱-۸۰۰-۵۵۵-۱۲۱۲ از طریق channel شماره ۴ DAHDI, می توانید به مثال زیر توجه کنید:

exten => 501,1,Dial(DAHDI/G4/18005551212)

دومین argument که در برنامه ()Dial وجود دارد timeout می باشد که بلافاصله پس از Technology/Resource تعریف می گردد و با یک , از آن جدا می شود. اگر timeout برای برنامه ()Dial تعریف شده باشد، این برنامه تلاش می کند تا در بازه زمانی تعریف شده در timeout که به ثانیه می باشد با شماره مقصد تماس برقرار کند و پس از آن به priority بعدی در extension جاری می رود. حال اگر timeout تعریف نگردد، ()Dial تا زمانی که channel مقصد به تماس پاسخ دهد یا تماس گیرنده تماس را قطع نماید، جهت برقراری تماس تلاش می کند. برای درک بهتر یک timeout با زمان ۱۰ ثانیه را در مثال زیر به کار می بریم:

exten => 123,1,Dial(DAHDI/1,10)

اگر به تماس قبل از زمان ۱۰ ثانیه پاسخ داده شود، channel ها به یکدیگر ارتباط داده می شوند و dial plan کار خود را به درستی انجام داده است و اگر در این بازه زمانی تماس پاسخ داده نشود، خط مقصد مشغول باشد یا معتبر نباشد، استریسک دلیل عدم پاسخ گویی را درون یک متغیر (variable) به نام DIALSTATUS قرار می دهد و به مسیر خود به priority بعدی در extension جاری ادامه می دهد. برای مثال:

exten => 123,1,Dial(SIP/101,10)

exten => 123,n,Playback(vm-nobodyavail)

exten => 123,n,Hangup()

همانطور که در مثال فوق ملاحظه می کنید، اگر پس از ۱۰ثانیه به تماس پاسخ داده نشود فایل صوتی vm-nobodyavail برای تماس گیرنده پخش خواهد شد.

سومین argument که در برنامه ()Dial وجود دارد، option می باشد که ممکن است شامل یک یا چند کاراکتر باشد که در صورت تعریف شدن می توانند باعث تغییر عملکرد برنامه ()Dial شوند. از آنجایی که لیست option های موجود جهت توضیح در این مقوله طولانی می باشد، تنها به یکی از پر کاربرد ترین آن ها که گزینه m می باشد می پردازیم. اگر گزینه m را به عنوان سومین argument به برنامه ()Dial ارجاع دهید، فرد تماس گیرنده در هنگام زنگ خوردن خط مقصد، بجای شنیدن صدای بوق زنگ (ringing tone) برای وی آوای انتظار پخش خواهد شد. برای اضافه کردن گزینه m در مثال خود، خط اول را به شکل زیر تغییر می دهیم:

exten => 123,1,Dial(SIP/101,10,m)

exten => 123,n,Playback(vm-nobodyavail)

exten => 123,n,Hangup()

حال dial plan خود را با extension های جدید به نحوی تغییر می دهیم تا افرادی که از بیرون تماس می گیرند، بتوانند با John و Jane ارتباط برقرار کنند:

[incoming]

exten => s,1,Answer()

exten => s,n,Background(enter-ext-of-person)

exten => s,n,WaitExten()

exten => 1,1,Dial(SIP/Jane,10)

exten => 1,n,Playback(vm-nobodyavail)

exten => 1,n,Hangup()

exten => 2,1,Dial(SIP/John,10)

exten => 2,n,Playback(vm-nobodyavail)

exten => 2,n,Hangup()

exten => i,1,Playback(pbx-invalid)

exten => I,n,Goto(incoming,s,1)

exten => t,1,Playback(vm-goodbye)

exten => t,n,Hangup()

در برنامه ()Dial چهارمین و آخرین گزینه URL می باشد. اگر channel مقصد از دریافت URL پشتیبانی کند، URL تعریف شده بر روی آن channel ارسال می شود، برای مثال اگر یک IP-Phone این قابلیت را داشته باشد، URL ارسال شده بر روی صفحه گوشی نمایش داده می شود. همچنین اگر از softphone استفاده شده باشد URL ارسالی به صورت pop up بر روی صفحه نمایش ظاهر می گردد. البته از این argument به ندرت استفاده می شود.

به این نکته توجه داشته باشید که argument های دوم، سوم و چهارم به صورت خالی (blank) نیز می توانند به کار گرفته شوند، برای مثال ممکن است بخواهید یک option را بدون درنظر گرفتن timeout مشخص نمایید، برای این کار argument مربوطه را به صورت خالی رها می کنیم. مانند مثال زیر:

exten => t,1,Dial(SIP/Jane,,m)

نمایش بیشتر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا