Asterisk pozwala na dokonywanie integracji z innymi systemami na wiele sposobów. Poniżej krótkie omówienie trzech metod z przykładami.
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.
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.
Łą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.
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.
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()
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:
SCCP pozwala na realizację połączeń z automatycznym wymuszonym odbiorem:
Dial(SCCP/9291/aa=1w&SCCP/9292/aa=1w, 120)
gdzie aa: