Pull to refresh

В Asterisk версии 12 появился REST интерфейс (Asterisk REST Interface — ARI)

Reading time 2 min
Views 37K
В Asterisk версии 12 появился REST интерфейс (Asterisk REST Interface — ARI).

Да, это 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.

Вот скриншот:

image

Ну и поглядев внимательно на 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])



Молодцы, что сказать :-)

Главные ссылки:

Tags:
Hubs:
+22
Comments 5
Comments Comments 5

Articles