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

    В 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])
    
    


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

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

    • +22
    • 33.9k
    • 5
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 5

      0
      Ну наконец-то!
        +1
        У диалплана уже дааавно ТААКИЕ руки — смотри extensions.lua. Вплоть до расширений на C.

        Asterisk 12 кстати не радует chan_sip в realtime режиме. Не правильно записывает данные в таблицу- как следствие пользователь не может звонить) hрешение и- использовать PJSIP, но его для транков тоже не везде можно использовать. Нельзя ему сказать чтобы он игнорил через isecure invite сообщения и порты с которых они приходят. В продакшне приходится использовать оба канала- 1 для транков, другой для клиентов. Но это так… оффтоп.

        А по интерфейсам — да, расширение радует. В 12 и AMI гораздо понятнее. Больше полей и информации. Правда документация на сайте оставяет желать лучшего, поэтому лучше смотреть в исходниках формирование сообщений, так как реальные интерфейсные сообщения отличаются от тех что описаны на wiki.asterisk.org.

        Ждем 13 LTS. в нем должны быть решены многие проблемы и улучшена поддержка websockets в работе с каналами сигнализации.
          0
          У диалплана уже дааавно ТААКИЕ руки — смотри extensions.lua. Вплоть до расширений на C.

          Нет, я не то имел в виду.
          Большая часть админов использует extensions.conf, а не extensions.lua.
          Так вот из extensions.conf появилась возможность залезать через REST внутрь.
            0
            Я понял что вы имели ввиду. Я говорю не о большинстве админов, а о функциональных возможностях комбайна.
            0
            Обновил пример скрипта на ARI, более наглядный пример добавил.

            Only users with full accounts can post comments. Log in, please.