Viktor Hlača 20/09/2018

Asterisk kao IVR bez licenci uz malo truda (1/2)

Tehnologija
Tehnologija
0

Jedna od aplikacija Asteriska je i Sustav glasovno potpomognutog odgovora (IVR). U ovom članku u dva dijela prikazat ćemo postavke potrebne za postizanje osnovnih IVR funkcionalnosti na Asterisk platformi.

Da bi Asterisk mogli koristiti kao IVR potrebne su nam minimalno sljedeće funkcionalnosti:

  • glasovni izbornici
  • upiti prema vanjskim sustavima radi donošenja odluke
  • pružanje informacija pozivateljima temeljem podataka skupljenih u vanjskim sustavima

U nastavku slijede pojednostavljeni primjer dobivanja svake od navedenih funkcija. Cilj primjera je pokazati kako se na jednostavan način mogu dobiti navedene funkcionalnosti. Sav kod prikazan u primjerima je testiran na Asterisku verzija 11.

Osnovna metoda programiranja Asteriska su dialplan funkcije i navedeni primjeri koriste tu metodu. Bitno je napomenuti da u ovoj metodi sve definiramo kroz konfiguracijske datoteke kao što je extensions.conf.

Upiti prema vanjskim sustavima radi donošenja odluke

Jedan od osnovnih način postavljanja upita prema vanjskim sustavima je integracija putem ODBC-a. ODBC integracija funkcionira definiranjem upita prema bazi podataka u konfiguracijskoj datoteci func_odbc.conf. Upit se definira u SQL jeziku. Upitu dajemo naziv i definirano način povezivanja sa bazom te ga koristimo kao funkciju.  Primjer takve funkcije je:

[ANIBLOCK]
dsn=asterisk
readsql=SELECT IF(COUNT(1)>0, 1, 0) FROM Aniblock WHERE NUMBER='${ARG1}'

 Funkcija se zove ANIBLOCK i provjerava u tablici je li broj pozivatelja blokiran te ako je, vraća vrijednost 1. DNS parametar odnosi se na definiranu ODBC vezu (definira se u datoteci res_odbc.conf). Funkcija bi se u dialplanu pozivala sa:

[super-kontekst]
exten => _50054XX,1,NoOp()
same => n,Set(CDR(accountcode)=pricall)
; Da li je pozivatelj u „black listi“?
same => n,GotoIf($[${ODBC_ANIBLOCK(${CALLERID(number)})}]?busy)
same => n(dial),Dial(SIP/prvi)
same => n(busy),Busy(10) ; Yes, you are on the blacklist.
same => n,Hangup

Iz dialplana se vidi da u slučaju da se broj pozivatelja nalazi u tablici poziv prekidamo, a ako ne, preusmjeravamo na telefon. U diaplanu se funkcija poziva pomoću prefiksa „ODBC_“ jer prefiks nismo definirali u func_odbc.conf. Primjer sa definiranjem prefiksa bi bio:

[INFO]
prefix=HOTDESK
dsn=asterisk
readsql=SELECT ${ARG1} FROM ast_hotdesk WHERE extension = '${ARG2}'

Ova bi se funkcija pozivala sa:

same => n,Set(${E}_STATUS=${HOTDESK_INFO(status,${E})})

ili:

same => n,Set(${E}_PIN=${HOTDESK_INFO(pin,${E})})

Prvi argument je polje u tablici dok je drugi argument broj ekstenzije. Na ovaj način možemo istu funkciju koristiti za “hvatanje” različitih parametara iz iste tablice.
Zanimljiv primjer integracije dialplana sa ODBC bazom podataka je i smještanje parametara reda čekanja (queue). Dialplan funkcija queue ima sljedeću sintaksu:

Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule[,position]]]]]]]]])

Funkciju bismo definirali ovako:

[QUEUE_DETAILS]
prefix=GET
dsn=asterisk
readsql=SELECT * FROM QueueDialplanParameters
readsql+= WHERE QueueDialplanParametersID='${ARG1}'

Funkciju bismo pozivali u diaplanu pomoću:

exten => s,1,Verbose(1,Call entering queue named ${SomeValidID)
same => n,Set(QueueParameters=${GET_QUEUE_DETAILS(SomeValidID)})
same => n,Queue(${QueueParameters})

Na ovaj način smo temeljem podataka koje smo skupili usmjerili pozivatelja na odgovarajući red čekanja uz podešavanje parametara.

Pružanje informacija pozivateljima temeljem podataka skupljenih u vanjskim sustavima

Za dobivanje informacije iz web aplikacija možemo koristiti dialplan funkciju CURL(). Parametre koje dobijemo na takav način možemo iskoristiti za dinamičko pružanje informacija pozivateljima. Jedan takav je primjer:

exten => 520,1,Verbose(2, Pozovi CURL za dobijanje javne IP adrese Asteriska whatismyip.org)
same => n,Answer() ;javi se
; Pokupi IP adresu sa servisa na Internetu
same => n,Set(MojaIPAdresa=${CURL(http://wtfismyip.com/text)})
; pročitaj broj
same => n,SayAlpha(${MojaIPAdresa})
same => n,Hangup()

 U ovom primjeru smo pristupili javnom servisu i dobili IP adresu putem HTTP protokola. Dobivenu IP adresu smo poslali funkciji za izgovaranje brojeva i slova tako da je naš pozivatelj čuo IP adresu kojom se Asterisk predstavlja na Internetu. Ovo naravno nije nešto što bi radili u stvarnom životu. Služi samo kao primjer upita prema web aplikacijama.

U sljedećem dijelu prikazat ćemo osnovne postavke potrebne za uspostavu glasovnog menija na Asterisk platformi.