Dialplan (دایل پلن) در استریسک، ستون فقرات سیستم و چیزی شبیه به یک زبان برنامه‌نویسی است. Dialplan نقاط ضعف PBX های سنتی یا همان سانترال های قدیمی و آنالوگ را برطرف کرده  است. ما می‌توانیم DialPlan را به عنوان  دسته‌ای از قوانین تعریف کنیم که به IP-PBX یا مرکز تلفن ویپ می‌گوید چه کاری را باید انجام دهد یا چگونه شماره‌هایی که توسط کاربر  شماره‌گیری شده را، مورد بررسی و  کنترل قرار دهد. همچنین Dialplan ،اطلاعات هر شماره‌ای که شماره‌گیری می‌شود  را می‌خواند  و سپس تصمیم می‌گیرد که این شماره‌ها می‌توانند به سیستم وارد شوند یا از سیستم خارج شوند. اساساً ،شماره‌هایی که توسط کاربر گرفته می‌شود،  ابتدا در Dialplan (دایل پلن) تجزیه و تحلیل می‌شود ، اگر  شماره به درستی گرفته شده باشد و شرایط ارسال را  داشته باشد، dialplan به داخلی می‌فرستد. از این رو قادر است توابع خاصی را در مرکز تلفن ویپ اجرا کند .

مفاهیم اصلی در Dialplan (دایل پلن)

Dialplan  عموما بر اساس یک پرونده یا فایل اصلی  موسوم به extensions.conf  نوشته می‌شود، که در دایرکتوری / etc / asterisk . قرار دارد.

برخی از قوانین وجود دارد که برای تعریف طرح شماره‌گیری باید رعایت شود، بطور مثال :

X : عددی بین 0 تا 9 را نشان می‌دهد

Z : عددی بین 1 تا 9 را نشان می‌دهد

N : عددی بین 2 تا 9 را نشان می‌دهد

. : وقتی در الگو یک نقطه یا همان “دات” وجود دارد ، معنای آن این است که هر تعدادی عدد می‌تواند بعد از نقطه باشد.

| : به این معنی که عدد قبل از نماد | حذف خواهد شد

[ ] : اگر می‌خواهید شماره خود را انتخاب کنید ، به عنوان مثال [1356] به معنی عددی بین 1 ، 3 ، 5 و 6 است. یا [3-7] اعداد بین 3 تا 7 است

مثلاً:

 9 | X |  به این معنی است که اعداد را با 9 شروع کنید ، 9 را بگیرید و بقیه اعداد را وارد کنید.

ZX  به معنای شماره‌های است که طول آن‌ها 2 رقم است و رقم اول آن بین 1 تا 9 و عدد دوم آن بین 0 تا 9 است.

NX به این معنی یک شماره 3 رقمی  است و رقم اول بین 2 تا 9 است و بقیه می‌تواند هر عددی باشد.

3 بخش اصلی Dialplan زمینه‌ها یا کانتکست ، افزونه‌ها و اولویت‌ها  هستند.

دایل پلن نویسی در استریسک

زمینه یا Context در ویپ چیست؟

Context  بخشی است که در آن افزونه‌ها را گروه‌بندی می‌کنیم ، هر دستگاه پروتکل IAX 2 یا SIP ، یا ورودی zap  در این قسمت پیکربندی می‌شود. زمینه‌ها راهی برای دسته‌بندی  یا نشانه‌گذاری است که ما از دستگاه به آن ارجاع می‌دهیم و آن را انجام می‌دهیم. طریقه نوشتن معمول  آن در یک کروشه است ، چیزی شبیه به این: [Context].

به عنوان مثال ، اگر دستگاه ما که از طریق پروتکل SIP کار می‌کند ، نشان می‌دهیم که هنگام شماره‌گیری ، آن را به صورت[global] در Dialplan ارسال شده است.باید در نظر گرفت که در صورتی که دستگاهی زمینه خاصی را مشخص نکرده باشد ، تمام نشانه‌های آن مستقیماً به یک زمینه عمومی به نام [default] هدایت می‌شوند.

Extension اکستنشن در ویپ چیست؟

یک جریان تماس در استریسک نامی دارد که با آن قابل‌دسترس است .به آنExtension می‌گویند. اکستنشن ها یا افزونه‌ها  به شرح زیر پیکربندی می‌شوند:

exten => کاربرد یا اپلیکیشن، اولویت ، افزونه

افزونه‌ها می‌توانند یک عدد یا یک نام باشند.

  همان طور که اشاره شد، یک جریان تماس در استریسک نامی دارد که با آن قابل‌دسترس است،  به آن نام Extension می‌گویند.

برای تعریف یک  اکستنشن، این کار با قرار دادن کلمه “exten =>” انجام می‌شود (مثال exten => 111).

همان طور که قبلاً اشاره کردیم ، باید به یاد داشته باشیم که مفهوم نشانه‌گذاری به لطف استریسک نه تنها به نویسه‌های عددی محدود می‌شود ، بلکه به نویسه‌های الفبایی گسترش می‌یابد ، بنابراین افزونه ، exten => doe نیز می‌تواند یک افزونه معتبر در نظر گرفته شود.

نحو صحیح این خواهد بود:

exten => <extension_marking>, <priority>, <application>

اولویت

اولویت ، همان طور که از نامش مشخص است ، به ما می‌گوید که میزان اهمیت آن چقدر است و برای ترتیب اجرای دستورها استفاده می‌شود.

یک Extension ، به نوعی مانند یک زبان اسکریپت نویسی ، می‌تواند چندین توابع یا برنامه‌ها را به طور متوالی اجرا کند. به عبارت دیگر به شکل “الگوریتم” از یک ترتیب ثابت پیروی  می‌کند و  این کار را از طریق اولویت‌هایی به ترتیب عددی (1 ، 2 ، 3) انجام می‌دهد ،  مثلاً می‌توانیم یک تماس برگشتی به یک شمارنده داخلی نیز برقرار کنیم تا “به طور خودکار” افزایش می‌یابد

(1, 2, n + 1 (3), n + 1 (4) 


اولین اولویت همیشه باید شماره 1 باشد.

اجرای دستور bake ، چیزی شبیه به این است:

exten => 111،1 ، Programa_Temperatura ()

exten => 111،2 ، Programa_Tiempo ()

exten => 111،3 ، Encender_Horno ()

اما اگر شمارنده‌ای را که قبلاً در مورد آن صحبت کردیم اعمال کنیم:

exten => 111,1, Program_Temperature ()
exten => 111, n ,
Program_Time () exten => 111, n , Start_Oven ()

با استفاده از نسخه استریسک ، 1.8 ، به بعد برای جلوگیری از تکرار مداوم “exten => extension” ، یک نحو جدید  به صورت same => معرفی شده است که بسیار ساده‌تر  است،

exten => 111,1, Program_Temperature ()
same => n, Program_Time ()
same => n, Turn on_Oven ()

برچسب های Dialplan (دایل پلن)

مفهوم برچسب‌ها این است که همراه با اولویت‌ها می‌توانیم به آن‌ها نامی اختصاص دهیم و  در صورت نیاز می‌توانیم به طور مستقیم  به آن‌ها مراجعه کنیم.

به عنوان مثال ، اگر افزونه‌ای با اولویت‌های زیاد داشته باشیم:

exten => 111،1 ،

exten => 111 ، n ،

……

exten => 111 ، n ،

exten => 111 ، n ،

برنامه نویسی ویپ

برنامه یا اپلیکیشن

برنامه نیز،  تابعی است که به شما امکان می‌دهد یک کار خاص را انجام دهید. به مثال زیر توجه کنید:

exten => 100, 1, Dial (SIP / softphone)

 در واقع افزونه 100 ، با سطح اولویت 1 عملکرد Dial () را با یک پروتکل SIP که مربوط به برخی از تلفن‌های نرم‌افزاری است ، اجرا می‌کند.

شماره گیری در دایل پلن Dialplan

هنگامی که ما در مورد شماره‌گیری صحبت می‌کنیم ، یعنی شماره‌گیری روی تلفن یا هر نوع دستگاهی علاوه بر شماره‌گیری کلاسیک از صفر تا 9،  شامل موارد حرف الفبایی نیز می‌شود:. پس از اتمام علامت‌گذاری ، بسته به نحوه تعریف کانالی که دستگاه SIP ، IAX و غیره به آن اشاره می‌کند ، به عنوان “ورودی” متن مربوطه وارد می‌شود. در این زمینه ، ورودی از طریق اسکریپت اجرا می‌شود.

 افزونه‌های ویژه یا Extension در ویپ

چهار نوع افزونه استاندارد وجود دارد که برای قالب‌بندی مختلف مورد استفاده قرار می‌گیرد

افزونه start (s)  افزونه‌ای است که در صورتی که آن را به یک زمینه خاص بفرستیم، تماس معمولاً به آن می‌رود.

  افزونه  invalid (i) به  افزونه‌ای اشاره دارد که وجود ندارد.

افزونه relative timeout (t) ، پایان نسبی زمان را اطلاع‌رسانی می‌کند.،  و هنگامی که با زمان تعیین‌شده برای برنامه‌ای مطابقت داشته باشد، اجرا می‌شود.

absolute timeout (T) افزونه  ، پایان زمان مطلق است و با تابع Timeout به کار می‌رود.

برنامه hangup extension (h) ، معمولاً برای باز تولید پیامی مانند “متشکریم که با ما تماس گرفتید” ، استفاده می‌شود.

مدیریت متغیرها در ویپ

مانند هر زبان برنامه‌نویسی در این مورد  نیز وجود مکانیزمی برای ذخیره متغیرها ضروری است. متغیرها می‌توانند انواع مختلفی از اطلاعات را ذخیره کنند و عمدتاً برای ساده‌سازی کد یا خوانایی بیشتر از آن‌ها استفاده می‌شود

چهار نوع متغیر وجود دارد:

متغیرهای کانال

متغیرهای جهانی

متغیرهای محیطی

متغیرهای مشترک

متغیرهای کانال در Dialplan (دایل پلن)

متغیرهای کانال،  مشابه متغیرهای محلی یک تابع  هستند که فقط در همان کانال اجرا می‌شوند.

به عنوان مثال ، اگر بخواهیم متغیر COUNTER را  برابر عدد 5 تعیین کنیم ،: Set (COUNTER = 5)به این شکل است:

 اگر بعداً بخواهیم به این متغیر دسترسی پیدا کنیم ، شکل دستور این گونه خواهد بود:

:

: $ {COUNTER}.  $ {<variable_name}

همچنین یک سری متغیرهای خاص در ارتباط با کانال‌ها و به صورت  از پیش تعریف‌شده توسط سیستم وجود دارد که متداول‌ترین آن‌ها عبارت‌اند از:

$ {DIALSTATUS}: : برای آگاهی از وضعیت تماس ، مقادیر احتمالی ANSWER  : پاسخ

BUSY : شلوغ

NOANSWER : بدون پاسخ

CANCEL : تماس لغو شده

: DONTCALL : تماس‌ها مسدود شده است ، گیرنده در وضعیت غیرقابل‌دسترسی است استفاده می‌شود

$ {CONTEXT}: نام زمینه را برمی‌گرداند.

$ {EXTEN}: تعداد افزونه کامل را در متن مورد نظر برمی‌گرداند.

$ {PRIORITY}: شماره اولویت در افزونه مورد نظر را برمی‌گرداند.

$ {CALLERID}: شناسه تماس‌گیرنده را نشان می‌دهد  که می‌تواند یک شماره یا رشته متنی باشد.

$ {CHANNEL}: نام کانال مورد نظر را برمی‌گرداند.

متغیرهای جهانی Dialplan (دایل پلن)

متغیرهایی هستند که  در هر زمینه ، کانال یا نمونه‌ای در طول اجرای طرح شماره‌گیری، قابل‌دسترسی هستند.

متغیرهای جهانی تحت یک زمینه خاص به نام [globals] تعریف می‌شوند که معمولاً درست در ابتدای فایل extensions.conf قرار می‌گیرند.

به عنوان مثال ، به جای استفاده از SIP / ext11 برای فراخوانی افزونه ext1 متصل به پروتکل SIP ، می‌توانیم در “globals” یک متغیر جهانی مانند این تعریف کنیم:

[globals]
EXT11 = SIP / ext11

و از آن لحظه به بعد ، وقتی می‌خواهیم به آن کانال مراجعه کنیم ، با متغیر $ {EXT11} تماس می‌گیریم. در واقع ، ما می‌توانیم چندین کانال را برای یک کاربرد خاص مانند فراخوانی همزمان چندین افزونه، با یک متغیر جهانی گروه‌بندی کنیم:

 [globals]
SALES = SIP / ext11 & SIP / ext12 & SIP / ext13 & SIP / ext14

سپس با استفاده از تابع Dial می‌توانیم همه آن افزونه‌ها  را همزمان و فقط با استفاده از متغیر فراخوانی کنیم:

exten => 111,1, Dial ($ {SALES})

متغیرهای مشترک در Dialplan (دایل پلن)

این متغیرها می‌توانند زیرمجموعه‌ای از متغیرهای محلی یا کانال در نظر گرفته شوند ، زیرا به نوعی ماهیت آن‌ها یکسان است ، اما به طور خاص توسط دو یا چند کانال قابل اشتراک هستند.

تعریف این متغیر و همچنین متغیرهای کانال از طریق Set است:

است

: Set (SHARED (COUNTER, SIP / ext11)).

بنابراین ، ما متغیر COUNTER را در کانال SIP / ext11 “می‌نویسیم ،  که در اجرای آن می‌تواند بسیار مشابه سایر متغیرها باشد.

متغیرهای محیطی در Dialplan (دایل پلن)

نوعی از متغیرها هستند که توسط سیستم استریسک بسیار کم استفاده می‌شوند زیرا از آن‌ها برای دسترسی به متغیرهای محیطی سیستم * NIX استفاده می‌شود. نحوه نوشتن آن‌ها بسیار ساده است

: $ {ENV (<variable_name>)}

انواع گیتوی های ویپ

الگوی افزونه

به طور منظم افزونه‌ها باید به معنای واقعی کلمه تعریف شوند، زیرا باید آنها را علامت گذاری کرد تا قابل دستیابی باشد. مکانیزمی برای ایجاد ارتباط بین یک علامت گذاری خاص و یک افزونه وجود دارد که یک الگوی کلی را تعریف می‌کند ، که می‌تواند ترکیبی از  چند افزونه  باشد.به منظور ایجاد یک الگو  کافی است یک زیر خط در مقابل  نام افزونه ایجاد شود.  

exten => _1X

در این مثال ، ما می‌گوییم که تمام علامت های دو رقمی ، با شروع از 1 ، از این الگو وارد شوند.

امکاناتی که الگوها ارائه می‌دهند به نوع نوشتاری  آنها بستگی دارد:

X  :هر رقم از 0 تا 9

Z : هر رقمی از 1 تا 9

N  : هر رقمی از 2 تا 9

[…]: هر رقمی که در براکت باشد ، مثال: [126] ، مطابقت 1 ، 2 یا 6 را دارد.

[ab]  : هر رقمی در آن فاصله “a” و “b” دو باشد ، مثال: [2-4] تصادفات 2 ، 3 یا 4 خواهد بود
!: (**********)

 . : هر رقم در هر ترکیب و مقدار، از جایی که نقطه قرار داده شده است. این گزینه یکی از مواردی است که می‌تواند امنیت DialPlan را به خطر بیندازد. زیرا کاملا تصادفی است.

مثال :

اگر

“exten => _123. ،”

را قرار دهیم و 1-2-3 را علامت بزنیم ، از طریق آن  افزونه وارد نمی‌شود، زیرا حداقل یک رقم دیگر طول می‌کشد . از طرف دیگر ، اگر “exten => _123 !، …” را قرار دهیم و 1-2-3 را علامت گذاری کنیم ،  زمانی  که الگو به درستی انجام شود، از طریق این  افزونه وارد می‌شود.

همه این امکانات را می‌توان در هر معیاری ترکیب کرد ، به عنوان مثال:

“exten => _XZN [14] [5-9]. ،”

فرض کنید ما می‌خواهیم برای برقراری تماس های خروجی با خطوط ثابت  ایران ، از مکالمه با شماره های نرخ ویژه جلوگیری کنیم ، که معمولاً با استفاده از 0 در رقم دوم و جدا از هم تعریف می‌شود. ما می‌دانیم که همه تلفن های ثابت ملی با 9 شروع می‌شوند.

exten => _9ZXXXXXXX, 1, Dial (SIP / operator / $ {EXTEN})

ما از متغیر کانال $ {EXTEN} برای راه اندازی دستگاه اپراتور مرتبط با کانال SIP استفاده می‌کنیم ، و یک تماس با استفاده از برنامه Dial برای هر شماره ثابت ملی تعیین می کنیم.

چه اتفاقی می‌افتد اگر مثلاً دو  افزونه زیر را داشته باشیم و ترکیب را 1-2-3 مشخص کنیم؟

1. exten => _1X3,1, NoOp () 2. exten => 123,1, NoOp ()

در این حالت ، از طریق گزینه دوم وارد می‌شود ، زیرا افزونه به معنای واقعی کلمه با شماره گیری مطابقت دارد.

درج در Dialplan

عمل درج چیزی در متن یا بخشی از برنامه شماره گیری، در Dialplan امکان پذیر است. که بسیار شبیه به Include اکثر زبانهای برنامه نویسی موجود هستند. دو راه وجود دارد: یا کل کانتکست را  وارد کنید یا آن را فراخوانی کنید که بسیار شبیه به قابلیت ارث بری در زبان‌های برنامه نویسی است. مانند :

include => <name_of_context_to_include>

به عنوان مثال ، فرض کنید که ما سه  کانتکست داریم: [MANAGEMENT] ، [MANAGER] ، [REST].

ساختار با Include به شرح زیر است:

File: /etc/asterisk/extensions.conf

[rest]
exten => 111,1, Dial (SIP / ext111) [manager]
include => rest [management]
include => manager

باید در نظر بگیریم که هنگام گنجاندن، این امکان را داریم که دو افزونه دقیقاً یکسان وجود داشته باشد. در این حالت ، استریسک با دنبال کردن ترتیب خواندن فایل ، اولین مطابقت را برای یک افزونه خاص حفظ می‌کند. اگر  کانتکستی را که باید به آن هدایت شود مشخص نکنیم، به طور پیش فرض، افزونه ‌ای  انتخاب می‌کند که در ابتدا فراخوانی می‌شود. شما می‌توانید یک  File  را هم اضافه کنید که عمدتا به این منظور که Dialplan را “مدولار” کنند از آن بهره می‌گیرند.

. include, “#include file.conf”

به عنوان مثال ، اگر بخواهیم یک  IVR (پاسخ صوتی تعاملی ، یک سیستم کلاسیک برای تعامل با تماس گیرنده) بسازیم ، ایده خوبی است که با فراخوانی ivr-extensions یک  افزونه خاص در یک فایل خاص ایجاد کنید. به عنوان مثال و در این افزونه  منحصراً متن [ivr]  بسیار مناسب است.

درباره استریسک

مبادله بین مراکز

یک سطح پیشرفته تر از “گنجاندن” وجود دارد  که فقط بین سیستم های استریسک  است و با استفاده از پروتکل IAX کار می‌کند. البته نمی‌توان آن را نوعی درج یا گنجاندن در نظر گرفت ، به نوعی می‌توان آن را “مبادله” دانست. هنگامی که جریان متوالی شماره گیری به این مرحله رسید، ما تماس را به یک کانتکست خاص  هدایت می‌کنیم. این نوع “درج” دارای بالاترین اولویت است. در صورت وجود عبارات “switch” در هر دو طرف ( در هر دو دستگاه) ، با اشاره به دو کانتکست مجاور ، حلقه های بی نهایت بوجود می‌آیند ، که به طور بالقوه برای ثبات سیستم ما “خطرناک” هستند.

دستور Switch به شرح زیر است:

switch => IAX2 / <user>: <password> @ <server_ip> / <target_context>

اصطلاحات و اپراتورها

در یک زبان از نوع اسکریپت، باید براساس امکان انجام اقدامات اساسی مانند مدیریت حلقه ها  و عبارات  شرطی  وجود داشته باشئد و البته این ساختارهای برنامه نویسی برای موثر بودن به عنصری به نام “Expressions” نیاز دارند:

 اصطلاحات حسابی: جمع (+) ، تفریق (-) ، ضرب (*) ، تقسیم (/) و تقسیم باقسمانده (٪)

مقایسه: برابر (=) ، متفاوت (! =) ، بزرگتر از (>) ، بزرگتر یا برابر با (> =) ، کمتر از (<) ، کمتر از یا برابر با (<=)

منطقی: AND (&) :، OR (|)

File: /etc/asterisk/extension.conf

[general]
exten => 111,1, Set (counter = 1)
same => n, NoOp (If we add one to the counter, $ [$ {counter} +1])
same => n, Set (counter = $ [ $ {counter} +1])
same => n, NoOp (Now if we have definitely increased the counter $ {counter})

Dialplan  تصویری

Dialplan یک سیستم است که امکان مدیریت برنامه های شماره گیری استریسک در حالت تصویری را فراهم می‌کند. از طریق یک رابط ، استفاده از اشیا، ، عملیات کشیدن و رها کردن و یک الگوی از پیش پیکربندی شده Visual Dialplan به شما امکان می‌دهد جریان ورودی و خروجی مرکز PBX استریسک را برقرار کنید. این برنامه اجازه می‌دهد تا به راحتی با استفاده از رابط های گرافیکی با تلفن گویا و صف، پیام صوتی ارتباط برقرار می‌کنند، شماره گیری های پیچیده ایجاد کنید. همچنین می‌توانید قبل از صادر کردن ، شماره آزمایشی را تست و تأیید کنید.