В Asterisk версии 12 появился REST интерфейс (Asterisk REST Interface — ARI).
Да, это RESTful API в натуре.
Пока имеются следующие ресурсы:
Или, интерфейсы к Каналам, Девайсам, Бриджам, Записям, Звукам. Вероятно, будут наращивать мощности :-)
Ну и главная фишка, это возможность подключения через WebSocket на /ari/events и в режиме постоянного соединения получать события.
В отличие от AMI, тут гуляют объекты в JSON формате, и работать с событиями крайне удобно.
Пример скрипта на ARI:
События самые разные. В том числе можно по GET сгенерировать событие, и самому получить его как UserEvent через WebSocket. Так сказать, Asterisk как шина передачи данных :-{P
Подключение звонка в WebSocket приложение делается из диалплана командой Stasis.
Вот так выглядит диалплан:
Из WebSocket'а можно выйти через вызов /channels/{channelId}/continue, и управление из WebSocket'a перейдет обратно в диалплан Asterisk'a.
Это как будто AMI и AGI в одном флаконе.
Кстати, имеется вкуснейшая плюшка в виде браузера по API.
Вот скриншот:

Ну и поглядев внимательно на API, надумал пачку UseCases:
Monitor ^ Spy ^ Record ^ Conference ^ Dialer
Похоже на переход на другой уровень.
Asterisk12 сохраняя телефонный комбайн для админа, дает разработчику приближенный по удобству интерфейс не хуже FreeSWITCH. IMHO. Там XML, тут JSON.
А если вспомнить о функции CURL, то получается, у диалплана вырастают тааакие руки :-)
Молодцы, что сказать :-)
Главные ссылки:
Да, это RESTful API в натуре.
Пока имеются следующие ресурсы:
- Asterisk
- Bridges
- Channels
- Endpoints
- Events
- Recordings
- Sounds
- Applications
- Playbacks
- Devicestates
- Mailboxes
Или, интерфейсы к Каналам, Девайсам, Бриджам, Записям, Звукам. Вероятно, будут наращивать мощности :-)
Ну и главная фишка, это возможность подключения через WebSocket на /ari/events и в режиме постоянного соединения получать события.
В отличие от AMI, тут гуляют объекты в JSON формате, и работать с событиями крайне удобно.
Пример скрипта на ARI:
import ari
client = ari.connect('http://localhost:8088/', 'hey', 'peekaboo')
def on_dtmf(channel, event):
"""Callback for DTMF events.
When DTMF is received, play the digit back to the channel. # hangs up,
* plays a special message.
:param channel: Channel DTMF was received from.
:param event: Event.
"""
digit = event['digit']
if digit == '#':
channel.play(media='sound:goodbye')
channel.continueInDialplan()
elif digit == '*':
channel.play(media='sound:asterisk-friend')
else:
channel.play(media='sound:digits/%s' % digit)
def on_start(channel, event):
"""Callback for StasisStart events.
On new channels, register the on_dtmf callback, answer the channel and
play "Hello, world"
:param channel: Channel DTMF was received from.
:param event: Event.
"""
channel.on_event('ChannelDtmfReceived', on_dtmf)
channel.answer()
channel.play(media='sound:hello-world')
client.on_channel_event('StasisStart', on_start)
# Run the WebSocket
client.run(apps="hello")
События самые разные. В том числе можно по GET сгенерировать событие, и самому получить его как UserEvent через WebSocket. Так сказать, Asterisk как шина передачи данных :-{P
Подключение звонка в WebSocket приложение делается из диалплана командой Stasis.
Вот так выглядит диалплан:
exten => 1,1,Wait(1.5)
same => n,Stasis(dialer) ; dialer is the name of the application
same => n,Wait(2)
same => n,Hangup()
Из WebSocket'а можно выйти через вызов /channels/{channelId}/continue, и управление из WebSocket'a перейдет обратно в диалплан Asterisk'a.
Это как будто AMI и AGI в одном флаконе.
Кстати, имеется вкуснейшая плюшка в виде браузера по API.
Вот скриншот:

Ну и поглядев внимательно на API, надумал пачку UseCases:
- Providers monitoring
- Call spy
- Conference manager
- User device monitoring
- Recording manager
Monitor ^ Spy ^ Record ^ Conference ^ Dialer
Похоже на переход на другой уровень.
Asterisk12 сохраняя телефонный комбайн для админа, дает разработчику приближенный по удобству интерфейс не хуже FreeSWITCH. IMHO. Там XML, тут JSON.
А если вспомнить о функции CURL, то получается, у диалплана вырастают тааакие руки :-)
*CLI> core show function CURL
-= Info about function 'CURL' =-
[Synopsis]
Retrieves the contents of a URL
[Description]
url - URL to retrieve
post-data - Optional data to send as a POST (GET is default action)
[Syntax]
CURL(url[,post-data])
Молодцы, что сказать :-)
Главные ссылки: