در دنیای امروز، سیستمهای تلفنی مبتنی بر VoIP (Voice over IP) نقش بسزایی در ارتباطات سازمانی ایفا میکنند. Asterisk، بهعنوان یکی از محبوبترین پلتفرمهای PBX (Private Branch Exchange)، امکانات گستردهای را برای توسعهدهندگان فراهم میکند. در این مقاله، به بررسی Asterisk REST Interface (ARI) میپردازیم و تفاوتهای آن را با AGI (Asterisk Gateway Interface) و AMI (Asterisk Manager Interface) مورد بحث قرار میدهیم.
تاریخچهای کوتاه از APIهای Asterisk
در سال ۱۹۹۹، Asterisk بهعنوان یک PBX محلی معرفی شد که از فایلهای پیکربندی استاتیک برای تنظیمات استفاده میکرد. با گذشت زمان و نیاز به کنترل بیشتر بر روی تماسها، دو API معرفی شدند:
-
AGI: اینترفیس AGI به توسعهدهندگان امکان میدهد تا از طریق Dialplan، برنامههای خارجی را فراخوانی کرده و کنترل کانال را به آنها واگذار کنند. این اینترفیس بهصورت همزمان (synchronous) عمل میکند؛ به این معنا که تا زمانی که عملیات تکمیل نشود، کنترل به Dialplan بازنمیگردد.
-
AMI: این اینترفیس به برنامههای خارجی اجازه میدهد تا از طریق پروتکل TCP/IP، دستورات را به Asterisk ارسال کرده و یا رویدادها را دریافت کنند. برخلاف AGI، AMI بهصورت غیرهمزمان (asynchronous) عمل میکند و بیشتر برای نظارت بر وضعیت کانالها و آغاز تماسها استفاده میشود.
هرچند این دو اینترفیس امکانات قابلتوجهی را فراهم میکردند، اما نیاز به APIیی که به توسعهدهندگان اجازه دهد تا برنامههای مخابراتی خود را با دسترسی مستقیم به منابع اصلی Asterisk ایجاد کنند، احساس میشد. این نیاز منجر به معرفی ARI شد.
WebSocket چیست؟
WebSocket یک پروتکل ارتباطی است که ارتباط دوطرفه و پایدار بین کلاینت و سرور را فراهم میکند. در ARI، این پروتکل برای دریافت رویدادها و مدیریت تماسها بهصورت بلادرنگ استفاده میشود.
ویژگیهای WebSocket:
- ارتباط دوطرفه دائمی بین کلاینت و سرور
- کاهش سربار درخواستهای HTTP
- ایدهآل برای برنامههایی که نیاز به بروزرسانی لحظهای دارند
مثال ساده اتصال به WebSocket در ARI با JavaScript:
const ws = new WebSocket("ws://asterisk-ip:8088/ari/events?api_key=user:password&app=exampleApp");
ws.onopen = () => {
console.log("WebSocket connection established");
};
ws.onmessage = (event) => {
console.log("Received event: ", event.data);
};
ws.onerror = (error) => {
console.log("WebSocket error: ", error);
};
ws.onclose = () => {
console.log("WebSocket connection closed");
};
ARI: رابطی برای توسعه برنامههای مخابراتی و ارتباطی
Asterisk REST Interface یا بهاختصار ARI، به توسعهدهندگان امکان میدهد تا برنامههای مخابراتی قدرتمندی را با استفاده از هر زبان برنامهنویسی ایجاد کنند. ARI از طریق یک اینترفیس RESTful، دسترسی به منابع اصلی Asterisk مانند کانالها (channels)، پلها (bridges)، نقاط انتهایی (endpoints)، رسانهها (media) و غیره را فراهم میکند.
بهعنوان یک اینترفیس غیرهمزمان، ARI وضعیت اشیاء را از طریق رویدادهای JSON و با استفاده از WebSocket به برنامهها ارسال میکند. این ویژگی به توسعهدهندگان امکان میدهد تا با کنترل کامل بر منابع Asterisk، منطق برنامههای خود را پیادهسازی کنند.
ARI واقعاً چیست؟
قبل از اینکه درباره ARI صحبت کنم، بیایید کمی درباره برنامههای دیالپلن در Asterisk صحبت کنیم. این دقیقاً همان جایی است که بیشتر افراد در رابطه با ARI دچار سردرگمی میشوند، بهخصوص در مورد چگونگی دسترسی به برنامههای دیالپلن از طریق ARI. ابتدا کمی پیشزمینه ارائه میدهم!
برنامههای دیالپلن معمولاً به زبان C نوشته میشوند و از APIها و رابطهایی که هسته Asterisk و ماژولهای دیگر ارائه میدهند، استفاده میکنند. این برنامهها به مدیران یا کاربران Asterisk این امکان را میدهند که از طریق دیالپلن، آنها را با گزینهها و تنظیمات خاص اجرا کنند. این میتواند شامل پست صوتی (Voicemail)، تماس گرفتن و متصل کردن دو تماس و موارد دیگر باشد. اگرچه زبان C قدرتمند است و Asterisk دارای APIها و رابطهای زیادی است، اما این مسئله باعث میشود که فقط برنامهنویسان C بتوانند قابلیتهای جدیدی را توسعه دهند. هدف ما این بود که این قابلیت را برای افراد بیشتری فراهم کنیم و به دیگران همان سطح کنترلی را بدهیم که توسعهدهندگان C دارند.
ARI نتیجهی همین تلاش است. ARI این امکان را فراهم میکند که برنامههای دیالپلن را خارج از Asterisk و با هر زبان برنامهنویسی که از HTTP و WebSocket پشتیبانی کند، بنویسید. این کار را با ارائه یک رابط کاربری ساده انجام میدهد که بسیاری از جزئیات پیچیده را در پسزمینه مدیریت میکند. این ویژگی باعث میشود قدرت هسته Asterisk در دسترس افراد بیشتری قرار بگیرد.
یک نکتهی مهم: ARI یک رابط برای برنامههای دیالپلن Asterisk نیست، بلکه یک رابط برای نوشتن برنامههای جدید دیالپلن است. برای مثال، ممکن است بخواهید یک برنامه دیالپلن صف تماس (Call Queue) مخصوص خودتان را بنویسید.
با استفاده از ARI، شما به قابلیتهایی مانند پخش فایلهای صوتی، ضبط صدا، شمارهگیری کانالها، دریافت DTMF، ایجاد بریجها، انتقال کانالها بین بریجها و موارد دیگر دسترسی دارید. اینها همان اجزای اساسی هستند که برنامههای دیالپلن به آنها نیاز دارند.
اما این تمام قابلیتهای ARI نیست. یکی دیگر از ویژگیهای مهم آن که بسیاری از افراد مفید یا جالب میدانند، مدیریت رویدادها است. برای پیادهسازی برنامههای دیالپلن با استفاده از ARI، باید رویدادهایی را دریافت کنید که نشان دهند چه اتفاقاتی در حال رخ دادن است. این رویدادها میتوانند بهصورت غیرفعال دریافت شوند تا نظارت بر کانالها و بریجهای Asterisk بدون نیاز به تعامل مستقیم با آنها انجام شود. برای مثال، میتوانید از این ویژگی برای ایجاد یک داشبورد زنده استفاده کنید که فعالیتهای سیستم را نمایش دهد، مانند زمان شمارهگیری، اتصال تماسها به یکدیگر و قطع تماسها.
تفاوتهای کلیدی بین ARI، AGI و AMI
-
AGI: کنترل اجرای Dialplan را بر عهده دارد و به برنامههای خارجی اجازه میدهد تا عملیات خاصی را بر روی کانالها انجام دهند. این اینترفیس همزمان است و تا تکمیل عملیات، کنترل به Dialplan بازنمیگردد.
-
AMI: این اینترفیس برای نظارت و مدیریت سطح بالای تماسها طراحی شده است. AMI به برنامهها امکان میدهد تا دستورات را ارسال کرده و رویدادها را دریافت کنند. این اینترفیس غیرهمزمان است و بیشتر برای نظارت بر وضعیت سیستم و آغاز تماسها استفاده میشود.
-
ARI: این اینترفیس به توسعهدهندگان اجازه میدهد تا با دسترسی مستقیم به منابع اصلی Asterisk، منطق برنامههای مخابراتی خود را پیادهسازی کنند. ARI غیرهمزمان است و از طریق RESTful API و WebSocket ارتباط برقرار میکند.
مثالهایی از پروژههای قابل پیادهسازی با ARI
با استفاده از ARI، میتوان پروژههای متنوعی را پیادهسازی کرد. در ادامه به چند نمونه اشاره میکنیم:
-
سیستمهای پاسخگویی خودکار (IVR): با ARI میتوان سیستمهای IVR پیشرفتهای ایجاد کرد که به تماسگیرندگان امکان میدهد با استفاده از منوهای صوتی، به اطلاعات مورد نیاز دسترسی پیدا کنند.
-
کنفرانسهای تلفنی: با استفاده از پلها (bridges) در ARI، میتوان کنفرانسهای تلفنی با قابلیتهای پیشرفته مانند مدیریت شرکتکنندگان و ضبط مکالمات ایجاد کرد.
-
رباتهای تماسگیرنده: با ARI میتوان برنامههایی توسعه داد که بهصورت خودکار با لیستی از شمارهها تماس گرفته و پیامهای از پیش تعیینشده را پخش کنند.
-
سیستمهای ضبط مکالمات: با دسترسی مستقیم به کانالها، میتوان مکالمات را ضبط کرده و در سیستمهای مدیریت فایل ذخیره کرد.
-
نظارت بر تماسها: با استفاده از رویدادهای ARI، میتوان بر تماسهای ورودی و خروجی نظارت کرده و اطلاعات مربوط به آنها را در زمان واقعی دریافت کرد.
نتیجهگیری
ARI بهعنوان یک اینترفیس قدرتمند، به توسعهدهندگان امکان میدهد تا با دسترسی مستقیم به منابع اصلی Asterisk، برنامههای مخابراتی پیشرفتهای را ایجاد کنند. با درک تفاوتهای بین ARI، AGI و AMI، میتوان از هر یک در جایگاه مناسب خود بهره برد و سیستمهای تلفنی کارآمدتری را پیادهسازی کرد.
یادگیری حرفهای Asterisk
تمامی این مباحث و نحوه برنامهنویسی آنها را میتوانید در دوره استریسک پیشرفته ویپ ایران بهصورت حرفهای بیاموزید. این دورههای پیشرفته در ایران فقط در ویپ ایران آموزش داده میشود.