سیر تکاملی API برای توسعه ایزابل ، الستیکس و …

  وقتی که Asterisk برای اولین بار در سال 1999 ایجاد شد ، طراحی این محصول بیشتر بر روی سیستم های تلفنی Stand-alone متمرکز بود که شما می توانستی

CVE-2018-1000188
CVE-2018-1000161
CVE-2018-1002100

 

وقتی که Asterisk برای اولین بار در سال ۱۹۹۹ ایجاد شد ، طراحی این محصول بیشتر بر روی سیستم های تلفنی Stand-alone متمرکز بود که شما می توانستید با پیکربندی فایل های با پسوند conf. سیستم تلفنی خود را راه اندازی کنید. کنترل تماس ها نیز از طریق فایل های مخصوص با پسوند conf. انجام می شد به عنوان مثال فایل extention.conf به عنوان “dialplan” شناخته می شد. اسکریپت های dialplan برای Asterisk مشخص می کردند که چه برنامه هایی بر روی تماس اجرا شوند و تصمیمات منطقی را براساس آنچه کاربران از طریق تلفنهایشان انجام می دادند، اتخاذ می کرد. این مدل برای مدت زمان طولانی به خوبی کار کرد و نسبت به نمونه مشابه در آن زمان انعطاف پذیرتر بود .همچنین تعداد زیادی از برنامه های dialplan یک طیف وسیعی از قابلیت های مناسب را ارائه می دادند .
برنامه های dialpaln با زبان برنامه نویسی C نوشته شده اند. چون این برنامه ها به طور مستقیم بر روی Asterisk عمل می کنند ، به طور باورنکردنی قدرتمند هستند . آنها به کانال های تماس ، Media ، Bridge ، Endpoint ها و همه ی Object هایی که Asterisk برای ارتباط تلفنی از آنها استفاده می کند ، دسترسی دارند. این ماژول در عین دارا بودن قابلیت های زیاد ، برای پاسخگویی به نیازهای بعضی از کسب و کارها مناسب نبودند. در گذشته اگر قابلیتی مورد نیاز شما بود و در برنامه های dialplan وجود نداشت شما فقط یک راهکار داشتید : نوشتن یک Patch با زبان برنامه نویسی C (احتمالا با اضافه کردن یک پارامتر به برنامه و تنظیم عملکرد آن) و ارسال آن به پروژه ی خود. اگر شما نمی توانستید که قابلیت مورد نظر را با زبان برنامه نویسی C بنویسید شما واقعا به دردسر می افتادید.

ورود AMI و AGI به Asterisk
مدت طولانی از پروژه Asterisk نگدشته بود که دو API به این پلتفرم اضافه شد.
یکی AGI(Asterisk Gateway Interface) و دیگری AMI(Asterisk Manager Interface) . این دو رابط هدف های مجزا و متنوعی داشتند :
AGI مشابه CGI در آپاچی است این ماژول یک رابط بین dialpaln و یک برنامه بیرونی، که قصد دستکاری یک کانال تماس را در dialplan دارد ، ایجاد می کند. به طور کلی این رابط به صورت Synchronous-actions هایی هست که بر روی یک کانال از یک بلوک AGI عمل کرده و تا زمان پایان پروسه، کنترل برنامه در اختیار این رابط می باشد.

AMI یک سازوکاری را فراهم می کند که به وسیله آن می توان کانال های که در dialplan اجرا شده اند را کنترل کرد.عملکرد AMI بر خلاف AGI به صورت asynchronous می باشد . در اکثر موارد AMI قادر به ایجاد سازوکاری برای کنترل کردن کانال اجرای نیست بلکه این ماژول اطلاعاتی را درباره وضعیت کانال ها و کنترل اینکه چه کانال های در حال اجرا هستند، تهیه می کند. این دو رابط قدرتمند هستند و طیف وسیعی از امکانات یکپارچه سازی را ارائه می کنند. با استفاده از AGI امکان اجرای dialpaln به صورت Remote فراهم شده است که به توسعه دهندگان اجازه می دهد که Asterisk را با برنامه های مبتنی بر PHP ، JAVA ، Python و سایر برنامه ها یکپارچه کنند. با استفاده از AMI می توان کارهای مثل نمایش وضعیت Asterisk ، برقراری تماس ها و کنترل موقعیت کانال ها را انجام داد. استفاده از این دو رابط با هم باعث می شود که برنامه های پیچیده را با Asterisk یکپارچه کرد.
با این حال بعضی از اشکالات در استفاده از AMI و AGI وجود دارد.
عملکرد AGI به صورت Synchronous می باشد و هنگام اجرای یک پروسه استریسک بر روی کانال ، سرویس دهی Thread را مسدود می کند. در ایجاد یک برنامه ارتباطاتی، شما اغلب می خواهید که به تغییرات کانال پاسخ دهید ، انجام دادن این کار با AGI به خودی خود مشکل است و هماهنگی با رویدادهای AMI می تواند یک چالش باشد.

Dialplan حتی همراه با AGI و AMI می تواند محدودیت داشته باشد و عملکرد اساسی شما محدود شود به آنچه که بر روی یک کانال انجام شده است. یکسری قابلیت های دیگر در استریسک وجود دارد که توسط این دو API ارائه نمی شوند ازجمله : Bridge ، Endpoint ، Device State و … . عملیات Controling با AGI و AMI می تواند دشوار باشد و برای انجام این عملیات اغلب باید Dialplan های پیچیده ای نوشت .
در نهایت هم AGI و هم AMI ماژول هایی هستند که در اوایل پروژه Aserisk ایجاد شده بودند.
فناوری هایی که امروزه مورد استفاده قرار می گیرند همچون SOAP ، XML/JSON و REST در آن زمان زیاد استفاده نمی شدند. همینطور API های جدید می توانند بصری تر و راحتر باشند که منجر به توسعه سریع تر برای کاربران Asrterisk می شوند. قبل از Asterisk 12 اگر شما قصد ایجاد برنامه سفارشی برای خود می داشتید شما یا باید یک ماژول Asterisk با زبان C می نوشتید و یا اینکه یک برنامه سفارشی با استفاده از AGI و AMI ایجاد می کردید که هماهنگی بین AGI و AMI خود کار خیلی دشواری بود.

ARI:An interface for Communication Applications
Asterisk RESTful Interface(ARI) برای حل نگرانی های که در استفاده از AGI و AMI وجود داشت ، ایجاد شده است . اگرچه AMI در کنترل تماس عمکرد خوبی دارد و همچنین AGI امکان اجرای برنامه های dialplan را از طریق یک پردازش از راه دور فراهم می کند ، اما هیچکدام از این API ها اجازه ایجاد برنامه ارتباطی سفارشی را به توسعه دهندگان نمی دادند. ARI یک asynchronous API است که به توسعه دهندگان اجازه می دهد برنامه های ارتباطی را با قرار دادن Object های اولیه در Asterisk ازطریق یک رابط بصری REST ایجاد کنند. وضعیت Object هایی که توسط کاربر کنترل شده است ، از طریق رخدادهای JSON بر روی یک WebSocket منتقل می شوند. این منابع به طور سنتی جزء ماژول C استریسک بوده اند. با دادن کنترل این منابع به تمام توسعه دهندگان (بدون در نظر گرفتن زبان برنامه نویسی) استریسک به یک موتور ارتباطی تبدیل شده است.

اصول ARI
ARI شامل سه بخش مختلف است که با هم هماهنگی و همکاری دارند. این سه بخش به شرح زیر می باشند :
• یک رابط RESTful که کلاینت برای کنترل منابع در استریسک از آن استفاده می کنند.
• یک WebSocket که رخدادهای مربوط به منابع استریسک را در فایل JSON به کلاینت منتقل می کند.
• برنامه Stasis که یک DialPlan می باشد که کنترل را از یک کانال استریسک به کلاینت منتقل می کند.
این سه بخش با همدیگر کار می کنند و به توسعه دهندگان اجازه می دهند که منابع استریسک را کنترل و دستکاری کرده و برنامه ارتباطی خود را ایجاد کنند.

REST چیست؟
Representational State Transfer(REST) یک ساختار نرم افزاری است که دارای چندین مؤلفه می باشد :
• ارتباطات با استفاده از یک مدل Client-Server اجرا می شوند
• ارتباطات به صورت Stateless می باشد و سرور وضعیت کلاینت را در طول درخواست ذخیره نمی کند
• در REST ارتباطات لایه بندی شده اند و این به مسیریابی و Load Balancing کمک می کند
• RESTیک رابط یکنواخت می باشد . منابع در طول Request ها شناخته می شوند ، Message ها داری خاصیت خود توصیفی هستند و … .
Asrterisk به عنوان یک برنامه Stand-alone دارای وضعیتی است که ممکن است خارج از درخواست یک کلاینت از طریق ARI ،تغییر کند برای مثال ممکن است تماس توسط یک SIP Phone ، Hang up شود و Asterisk نیز کانال را Hangup خواهد کرد – حتی اگرچه ARI به استریسک دستور نداده باشد که SIP Phone را Hang up کند – بهرحال ARI یک RESTFul می باشد.

WebSocket چیست؟
WebSocket یک پروتکل نسبتا جدید می باشد که ارتباط دوطرفه را بین کلاینت و سرور ایجاد می کند. هدف اصلی این پروتکل فراهم ساختن سازوکاری برای برنامه ها تحت وب است که نیاز به ارتباط دو طرفه با سرور، بدون وابستگی به پروتکل HTTP ،دارند.
در ARI ، Websocket برای فرستادن رخدادهای غیر همزمان از Asterisk به کلاینت استفاده می شود. این رخدادها مربوط به رابط RESTful می باشند اما از لحاظ فنی مستقل از آن هستند و به استریسک اجازه می دهند که کلاینت ها را از تغییرات وضعیت منابع آگاه سازد.

Stasis چیست؟
Stasis یک برنامه dialpaln در استریسک می باشد . این برنامه یک سازوکاری است که در آن استریسک کنترل کانال ایجاد شده بر روی dialpaln ، را به ARI و کلاینت ها می دهد. به طور کلی برنامه های ARI با استفاده از ماژول Stasis کانال ها و سایر منابع استریسک را دستکاری می کنند و قبل از هرچیز هدف ARI ساختن یک برنامه dialplan جدید و سفارشی می باشد.

نکاتی که باید در استفاده از ARI به آن توجه داشت؟
۱٫ARI را توسط صفحه وب، مستقیم در دسترس قرار ندهید : برای توسعه دهندگان استفاده از ARI از طریق یک صفحه وب بسیار راحت است اما شما این کار را در نرم افزار خود انجام ندهید زیرا این کار مستلزم دسترسی مستقیم از صفحه وب به دیتابیس می باشد. شما نیاز دارید که Asterisk را پشت Application Server خود پنهان کنید.
۲٫از یک لایه انتزاعی استفاده کنید : تعداد بسیار زیاد فراخوانی مستقیم HTTP را در طول برنامه خود گسترش ندهید. نگرانی های متقابلی در مورد دسترسی به API وجود دارد که شما می خواهید در یک مکان مرکزی با آن برخورد کنید امروزه تنها نگرانی بحث احراز هویت است . اما به عنوان یک API تکامل یافته سایر نگرانی ها مانند Versioning نیز مهم می باشد . توجه داشته باشید که لایه انتزاعی پیچیده نیست . API سمت سرویس گیرنده شما حتی می تواند چیزی ساده مثل دستورات GET، POST و DELETE باشد که نگرانی های متقابل را بررسی می کند.
Asterisk TestSuite تعداد بسیار زیادی کتابخانه مجازی دارد که می تواند طبق زیر مورد استفاده قرار بگیرد :

ari = ARI(‘localhost’, (‘username’, ‘password’))# Hang up all channels
channels = ari.get(‘channels’)
for channel in channels:
ari.delete(‘channels’, channel[‘id’])

 

مدیریت سرور پشتیبانی و مشاوره – ثبت دامنه