Asterisk - AGI i AMI

Asterisk pozwala na dokonywanie integracji z innymi systemami na wiele sposobów. Poniżej krótkie omówienie trzech metod z przykładami.

AMI

Asterisk Manager Interface - interfejs umożliwiający sterownie centralką i pobieranie z niech informacji o zdarzeniach za pomocą zewnętrznego oprogramowania. Istnieje kilka bibliotek pozwalających komunikować się z Asteriskiem z użyciem AMI. Nic nie stoi jednak na przeszkodzie by skorzystać z tego interfejsu bezpośrednio.

AMI - konfiguracja

Uruchomienie AMI jest możliwe po odpowiednim zedytowaniu pliku manager.conf w katalogu Asteriska.

[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0

Powyższe spowoduje, że AMI będzie dostępne na porcie 5038 pod każdym adresem IP maszyny z Asteriskiem.

[asterisk]
secret = password
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.255
permit=192.168.111.0/255.255.255.0
read = all
write = all

Tutaj zezwalamy użytkownikowi asterisk na łączenie się z adresów localhost oraz sieci 192.168.111.0/24, próby logowania z innych adresów zostaną odrzucone. Użytkownik będzie miał dostęp do wszystkich komunikatów oraz poleceń - nie zaleca się takich ustawień w środowisku produkcyjnym ale jest to wygodne podczas testów i konfiguracji.

Możliwe wartości dla read to: all,system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan,agi,cc,aoc,test,security a dla write: all,system,call,agent,user,config,command,reporting,originate,message,agi,aoc,test,message Można wyszególnić kilka po przecinku.

Łączenie z AMI

Łączyć z AMI możemy się nawet telnetem:

telnet 127.0.0.1 5038

a cała komunikacja odbywa się w postaci tekstowej, stąd łatwo o stworzenie własnego oprogramowania komunikującego się z centralą. Po uruchomieniu telnetu i otrzymaniu zachęty w postaci:

Asterisk Call Manager/5.0.4

należy się zalogować wydając polecenia:

Action: Login
UserName: asterisk
Secret: password
Events: on

Istotna jest pusta linia na końcu - zatwierdzenie zestawu poleceń odbywa się poprzez podwójną nową linię. Asterisk odpowie czy połączenie doszło do skutku:

Response: Success
Message: Authentication accepted

Wylogować można się wydając polecenie:

Action: Logoff

W AMI mamy podział na dwie grupy - polecenie (Actions) i wydarzenia (Events). Ich pełna lista zależna jest od wersji Asteriska i dostępna w świetnej dokumentacji na stronie producenta. AMI pozwala na wykonanie praktycznie każdego polecenia jakie można wydać w konsoli centralki zależnie od wymyślonych bez nas warunków.

AGI

Asterisk Gateway Interface - to drugi interface ale działający nieco inaczej - pozwala na wywoływanie z dialplanu skryptów w w naszym systemie. Sktypty mogą być praktycznie dowolne - nic nie stoi na przeszkodzie by były to lokalnie wywyoływane skrypty PHP, BASH bądź nawet programy. Asterisk przekazuje im parametry a dalej skrypty działają samodzielnie. Zwrotna interakcja z centralką jest możliwe poprzez AMI.

Przykłady użycia AGI:

Korzystając z AGI możemy ustalić nasz zewnętrzny adres IP i zlecić Asteriskowi odczytania go. Tutaj po wybraniu numeru wewnętrznego 51 wykorzystany zostanie program curl, który używając skryptu zwracającego adres IP przekaże go do zmiennej MyIPAddressIs w dialplanie a następnie Asterisk odczyta ten adres.

exten => 51,1,Verbose(2, Ustalanie zewnętrznego adresu IP)
same => n,Answer()
same => n,Set(MyIPAddressIs=${CURL(http://www.naszSerwerWWW.pl/ip.php)})
same => n,SayAlpha(${MyIPAddressIs})
same => n,Hangup()

Skojarzenie Asteriska i inteligentnego domu też nie jest problemem - tutaj wykorzystamy mechanizm webhook celem wydania polecenia HA po wybraniu na centralce numeru 99.

exten => 99,1,System(curl -m 2 -d "" -X POST http://192.168.x.1:8123/api/webhook/xyz321a)
exten => 99,n,Busy()

Tutaj po odebraniu polączenia przychodzącego na numer xxxxxxxx naszej centralki przekazujemy do skryptu caller_id.php numer osoby dzowniącej do nas, który może na podstawie tego numeru podjąć dowolneg działania. Następnie wyświetlamy ten numer w konsoli i kończymy połączenie.

exten => xxxxxxxx,1,Answer()
 same => n,AGI(/tmp/caller_id.php,${CALLERID(num)})
 same => n,NoOp(${CALLERID(name)})
 same => n,HangUp()

Call Files

Asterisk skanuje domyślnie cały czas katalog /var/spool/asterisk/outgoing/ i w przypadku pojawienia się w nim odpowiedniego pliku wykona stosowne połączenie telefoniczne. Trzeba mieć na uwadze, że w przypadku kiedy ten katalog będzie udziałem sieciowym to może to nie działać idelanie gładko.

Przykładowy callfile

Channel: SIP/91
Context: wewnetrzne
Extension: 92
Priority: 1

Jeżeli używamy telefonów CISCO i kanałów SCCP to możemy wykorzystać dodatkową funkcjonalność przy wywoływaniu połączenia. W tym przykładzie dodatkowo jeżeli na telefonie inicjującym połączenie w ciągu 5 sekund nie zostanie podniesiona słuchawka to połączenie nie będzie realizowane.

Channel: SCCP/62/ringer=feature
WaitTime: 5
CallerID: 62
Context: wewnetrzne
Extension: 92
Priority: 1

Dodanie opcji ringer pozwala na użycie innego dzwonka dla danego połączenia. Możemy ustawić następujące rodzaje dzwonków:

  • outside
  • inside
  • feature
  • silent
  • urgent

SCCP - dodatkowe opcje

SCCP pozwala na realizację połączeń z automatycznym wymuszonym odbiorem:

Dial(SCCP/9291/aa=1w&SCCP/9292/aa=1w, 120)

gdzie aa:

  • 1w: 1way audio (MIC on other side is OFF).
  • 2w: 2way audio (MIC on other side is ON).
  • 1wb: 1way and reject cause: busy
  • 1wu: 1way and reject cause: unavailable
  • 1wc: 1way and reject cause: congestion
  • 2wb: 2way and reject cause: busy
  • 2wu: 2way and reject cause: unavailable
  • 2wc: 2way and reject cause: congestion

Poprzedni wpis Następny wpis