AMI

Материал из Xgu.ru

Перейти к: навигация, поиск


AMI (Asterisk Manager Interface) — позволяет внешним программам подключаться к Asterisk и давать ему управляющие команды. Все команды, которые Asterisk умеет получать через консоль, могут быть отправлены ему через AMI-интерфейс[1]. Кроме того, через AMI можно получать сообщения от Asterisk'а о том, что с ним происходит: например, как обрабатываются звонки, на какой стадии находится обработка и так далее.

Настройка AMI выполняется через файл manager.conf.

Содержание

[править] Протокол AMI

Пример сеанса работы с AMI вручную:

$ telnet 127.0.0.1 5038
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Asterisk Call Manager/1.0

Ответ:

Response: Success
ActionID: 1
Message: Authentication accepted

[править] Пример конфигурации

В файле manager.conf (или в файле, который инклюдится из него, например /etc/asterisk/manager.d/admin.conf):

[admin]
secret = secret5
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
read = all,system,call,log,verbose,command,agent,user,config
write = all,system,call,log,verbose,command,agent,user,config

[править] Пример использования

Python-скрипт, который принимает сообщения от Asterisk с помощью интерфейса AMI и публикует их на ZeroMQ-сокете:

#!/usr/bin/python

'''
Pub events from the Asterisk Manager Interface vie ZeroMQ.
'''

__author__  = 'David Wilson'
__id__      = '$Id$'

import sys, time, socket
from Asterisk.Config import Config
from Asterisk.Manager import CoreManager
import Asterisk.Manager, Asterisk.Util

class MyManager(CoreManager):
    '''
    Send events.
    '''

    def on_Event(self, event):
        #print event.keys()
        if event['Event'] == 'Bridge':
            Asterisk.Util.dump_packet(event)

def main2():
    manager = MyManager(*Config().get_connection())

    try:
        print '#', repr(manager)
        print
        manager.serve_forever()

    except KeyboardInterrupt, e:
        raise SystemExit

def main(argv):
    max_reconnects = 100
    reconnect_delay = 2

    while True:
        try:
            main2()

        except Asterisk.Manager.GoneAwayError, e:
            print '#', str(e)

        except socket.error, e:
            print
            print '# Connect error:', e[1]
            reconnect_delay *= 2

        print '# Waiting', reconnect_delay, 'seconds before reconnect.'
        print '# Will try', max_reconnects, 'more times before exit..'

        max_reconnects -= 1
        time.sleep(reconnect_delay)
        print '# Reconnecting...'

if __name__ == '__main__':
    main(sys.argv[1:])

</pre>

[править] Дополнительная информация

[править] Примечания

  1. Только синтаксис у них другой
Источник — «http://xgu.ru/wiki/AMI»