23.12.2012 Views

PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU

PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU

PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

NORGES TEKNISK-NATURVITENSKAPELIGE UNIVERSITET<br />

FAKULTET FOR INFORMASJONSTEKNOLOGI, MATEMATIKK OG<br />

ELEKTROTEKNIKK<br />

<strong>PROSJEKTOPPGAVE</strong><br />

i faget<br />

TTM4700, Teletjenester og nett<br />

Oppgavens tittel:<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Levert av:<br />

Andreas Wille Søvik


NORGES TEKNISK-NATURVITENSKAPELIGE UNIVERSITET<br />

FAKULTET FOR INFORMASJONSTEKNOLOGI, MATEMATIKK OG<br />

ELEKTROTEKNIKK<br />

<strong>PROSJEKTOPPGAVE</strong><br />

Kandidatens navn: Andreas Wille Søvik<br />

Emne: TTM4700, Teletjenester og nett<br />

Oppgavens tittel: <strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Oppgavens tekst:<br />

Oppgaven går ut på å sette seg inn i behov og virkemåter for IVR og/eller VoiceXML-løsninger. Det skal<br />

gis en oversikt og sammenligning av disse med fokus på anvendelser og tekniske egenskaper. Hvordan kan<br />

taleløsninger brukes i tjenestesammenheng, hvilke eventuelle uavdekte bruksområder finnes det og har<br />

taleløsninger egne tjenesteplattformer eller må de brukes sammen med andre tjenesteplattformer.<br />

Oppgaven skal komme fram til en enkel IVR-løsning som skal være en del av en callcenter tjeneste. For at<br />

dette skal være mulig må selve IVR’en lages i tillegg til at to grensesnitt defineres. Disse er mot Dialogic<br />

kortet som skal stå i maskinen som kjører IVR løsningen. Det andre er grensesnittet mot<br />

tjenesteplattformen hvor callcentret ligger, som skal være selve brukeren av IVR løsningen.<br />

Under konstruksjon av grensesnittet mot callcentret må det benyttes en teknologi som er kompatibel både<br />

mot ActorFrame og IVR kortet. Dette løses i samarbeid med callcenter oppgaven. Valg av teknologi vil bli<br />

gjort etter en vurdering av tilgjenglige teknologier.<br />

Tilslutt vil en evaluering av løsningens generalitet bli gjort.<br />

Besvarelsen leveres innen: 5. desember 2003<br />

Besvarelsen levert: 5. desember 2003<br />

Utført ved: Institutt for telematikk<br />

Veileder: Senior Konsulent Rune Viken, for GINTEL AS<br />

Trondheim, 5. desember<br />

Lill Kristiansen<br />

Professor


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Forord<br />

Denne prosjektoppgaven er skrevet av Andreas Wille Søvik som går 5. årstrinn på<br />

sivilingeniørstudiet for Kommunikasjonsteknologi (<strong>NTNU</strong>), med fordypning i<br />

Teletjenester og nett. Oppgaven er skrevet for institutt for Telematikk, <strong>NTNU</strong>, høsten<br />

2003, og er en del av fordypningsemnet TTM4700 med et omfang på 22,5 studiepoeng.<br />

Bakgrunnsmaterialet til oppgaven er hentet fra tekniske spesifikasjoner, papers,<br />

lærebøker og Internet. Jeg vil rette stor takk til Professor Lill Kristiansen og Senior<br />

Konsulent Rune Viken fra Gintel AS for inspirasjon og gode ideer i utviklingen av<br />

oppgaven. Jeg vil også benytte anledningen til å takke de andre ansatte ved Gintel for<br />

deres støtte og engasjement i oppgaven.<br />

Trondheim, 5. desember 2003<br />

Andreas Wille Søvik<br />

i


Innholdsfortegnelse<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Forord_________________________________________________________________ i<br />

Innholdsfortegnelse______________________________________________________ ii<br />

Figurliste______________________________________________________________iii<br />

Tabelliste______________________________________________________________iii<br />

Sammendrag ___________________________________________________________ iv<br />

1. Innledning _________________________________________________________ 1<br />

1.1. Bakgrunn ___________________________________________________________ 1<br />

1.2. Avgrensning_________________________________________________________ 1<br />

1.3. Oppbygning _________________________________________________________ 2<br />

2. Arkitektur _________________________________________________________ 3<br />

2.1. Intelligente nett ______________________________________________________ 3<br />

2.2. Parlay ______________________________________________________________ 4<br />

2.2.1. Om Parlay _______________________________________________________________ 4<br />

2.2.2. Hva gir Parlay oss? ________________________________________________________ 4<br />

2.2.3. Hva er Parlay API’ene? _____________________________________________________ 5<br />

2.3. Grensesnitt__________________________________________________________ 6<br />

2.3.1. GUI / UI_________________________________________________________________ 6<br />

2.3.2. Interactive Voice Response __________________________________________________ 7<br />

2.4. Web services ________________________________________________________ 8<br />

2.5. Teknologi ___________________________________________________________ 8<br />

2.5.1. Intel Dialogic SingleSpan/D300JCT-E1 ________________________________________ 8<br />

2.5.2. Global Call______________________________________________________________ 11<br />

3. Design ___________________________________________________________ 14<br />

3.1. Overordnet løsning __________________________________________________ 14<br />

3.2. IVR tjenesten. ______________________________________________________ 16<br />

4. Implementering ____________________________________________________ 18<br />

4.1. Valg av utviklingsverktøy_____________________________________________ 18<br />

4.2. IVR tjenesten_______________________________________________________ 18<br />

4.2.1. Min webservice __________________________________________________________ 20<br />

4.2.2. TCP / IP socket server _____________________________________________________ 22<br />

4.2.3. IVR kontroller ___________________________________________________________ 26<br />

4.3. Grensesnitt mot callcenter ____________________________________________ 29<br />

4.3.1. Oversikt over protokollen __________________________________________________ 29<br />

4.3.2. Svarmeldinger ___________________________________________________________ 29<br />

4.3.3. Feilhåndtering ___________________________________________________________ 30<br />

4.3.4. Meldingsformat __________________________________________________________ 30<br />

4.3.5. Meldingssekvensdiagrammer _______________________________________________ 31<br />

4.3.6. Meldinger ______________________________________________________________ 34<br />

ii


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

5. Konklusjon _______________________________________________________ 37<br />

6. Referanseliste _____________________________________________________ 37<br />

7. Vedlegg __________________________________________________________ 38<br />

7.1. Bruk av CD-ROM___________________________________________________ 38<br />

7.2. CD-ROM __________________________________________________________ 38<br />

Figurliste<br />

Figur 1. Hvordan Parlay X, er knytte sammen med resten av Parlay rammeverket, fra [2] ____________ 5<br />

Figur 2. Parlay til data og telenett, fra [2] __________________________________________________ 6<br />

Figur 3. Dialogic interface med telefon nettet, fra [3] ________________________________________ 10<br />

Figur 4. Global Calls arkitektur, fra [5] ___________________________________________________ 12<br />

Figur 5 Tilstandsdiagram til Global Call ved en innkommende asynkron samtale, fra [5] ____________ 13<br />

Figur 6. IVRens innpass i nettet. _________________________________________________________ 15<br />

Figur 7. IVR tjenesten _________________________________________________________________ 17<br />

Tabelliste<br />

Tabell 1 Global Call hendelser, med forklaring _____________________________________________ 28<br />

Tabell 2 Tale ressurs hendelser, med forklaring _____________________________________________ 28<br />

iii


Sammendrag<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Oppgaven har sitt utspring i at alle dagens IVR løsninger er properitære. Gintel er et<br />

firma som har spesialisert seg innen IN teknologi og ønsket seg et IVR system som kunne<br />

benytte seg av flere plattformer. Dette krever at man finner en måte å kommunisere på<br />

som er allment gyldig og er anvendbar.<br />

Jeg har jobbet med en helt ordinær datamaskin med et såkalt mediakort installert og laget<br />

en fullt brukbar IVR tjeneste, som pr. i dag kjører sammen med et call center. Tjenesten<br />

tar i mot kommandoer fra call centeret om hvilke meldinger som skal spilles av for<br />

brukeren. IVRen tar vare på inntastningen fra brukeren og sender tilbake til call centeret.<br />

Kommunikasjon mellom call centeret og IVRen går gjennom web service grensesnitt.<br />

Nettopp dette, er det som gjør denne oppgaven til et unikum; en kan legge til en hvilken<br />

som helst applikasjon - web klient funksjonalitet slik at den kan sende meldinger til<br />

IVRen om hva den skal gjøre.<br />

iv


1. Innledning<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

1.1. Bakgrunn<br />

Dagens taleapplikasjoner er kompliserte og løsningene er properitære. Riktignok finnes<br />

det mange av dem og man kan med rette spørre seg om hvorfor det skal være nødvendig<br />

å lage noe som allerede finnes. Svaret på dette er enkelt, men før jeg svarer på det vil jeg<br />

si litt mer om dagens løsninger. Per i dag er det som nevnt mange properitære systemer,<br />

og hver eneste tjeneste er skreddersydd for en enkel løsning. Dette fører til at det er<br />

nesten like mange forskjellig taleapplikasjoner som det er ulike tale tjenester. Resultatet<br />

av dette blir at hver gang en løsning skal lages må den lages fra bunn av og dette fører<br />

med seg mye dobbeltarbeid med tanke på at arbeidet er gjort før bare for en annen<br />

plattform eller tjeneste. Ulempen med dette er selvsagt sløsing med tid, for den enkelte<br />

applikasjonsutvikler og at man må vite hvordan hver eneste taletjeneste fungerer for at<br />

man skal kunne utvikle på den.<br />

Hensikten med oppgaven er å lage et felles grensesnitt mot taleapplikasjonene slik at<br />

denne form for applikasjonsutvikling blir mer tilgjenglig. Hurtigere applikasjonsutvikling<br />

vil også være et resultat av dette. Hvis grensesnittet er kjent vil man slippe å bry seg om<br />

kommunikasjon med telenettet som er den vanskeligste delen av en slik tjeneste.<br />

1.2. Avgrensning<br />

Oppgaven har vært først og fremst en praktisk oppgave. Derfor har det vært naturlig å<br />

bruke mye tid på å få IVR tjenesten til å fungere så bra som mulig. Av denne grunn er det<br />

en fordel at leseren har kjennskap til temaer som intelligente nett, parlay konsortiet og<br />

IVR fra tidligere, da dette ikke er diskutert i detalj. Dette er på ingen måte en<br />

forutsetning, men det vil øke forståelsen for oppgaven.<br />

1


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

1.3. Oppbygning<br />

Oppgaven består av 5 kapitler hvorav kapittel 2 til 4 utgjør hoveddelen. Kapittel 1 er<br />

innledning og kapittel 5 er konklusjon. Hoveddelen har jeg organisert på følgende måte:<br />

• I kapittel 2 presenteres noen av de bakenforliggende teknologier, som er<br />

nødvendig for å forstå hvordan oppgaven er laget og hvordan tjenesten fungerer.<br />

• I kapittel 3 tar jeg for meg programdesign. Her vil tjenesten settes i sammenheng<br />

med de teknologier den spiller sammen med. Det vil være diagrammer som viser<br />

dette, både overordnet og i detalj.<br />

• I kapittel 4 presenteres min løsning på oppgaven. Den vil gå igjennom de enkelte<br />

deler av programmet som har vært nødvendig for å få det til å fungere som det<br />

gjør.<br />

Hensikten med oppbygningen har først vært å vise hvordan tjenestene i dag ville fungert<br />

hver for seg og deretter vise hvordan de kan spille sammen. Til slutt vil jeg se på om<br />

resultatet ble som forventet og evt. Hvorfor det ikke gikk som det skulle ha gått.<br />

2


2. Arkitektur<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Kapittelet beskriver de ulike teknologiene som er benyttet for å løse oppgaven. Hensikten<br />

er å si litt om teknologiene for de som kan noe om de. Begrunnelser for hvorfor disse er<br />

valgt kommer lenger ut i kapittel tre og fire. Ikke bare tar det for seg hva tjenestene er<br />

men også hva som finnes av hardware og software for å få dette til. Samspillet mellom<br />

disse og oppgaven vil man se utifra kapittel 6, design.<br />

2.1. Intelligente nett<br />

Tradisjonelle telefontjenester som vi kjenner dem i dag, går på å sette opp en samtale<br />

mellom to brukere gjennom ett aksessnett. Intelligente nett (IN) ble introdusert av Bell i<br />

USA som en måte å gi telenettet mer avansert funksjonalitet. Eksempel på<br />

tilleggsfunksjoner til nettet var særbehandling av enkelte telefonnummer og<br />

nummerserier (800 - nummer). IN ble først og fremst tatt i bruk for å markedsføre et<br />

konsept for hvordan slike tjenester kan realiseres.<br />

Intelligente nett ble av Bell fremlagt som måten å koble sammen nettkomponenter for å<br />

muliggjøre den avanserte tjenestefunksjonaliteten. Umiddelbart etter Bells lansering av<br />

IN begynte et standardiseringsarbeid for IN både i ITU (International Telecommunication<br />

Union )og ETSI (European Telecommunications Standards Institute). ITU’s<br />

standardiseringsarbeid for IN står omtalt Q.1200 serien fra september 1997. Generelt har<br />

dette arbeidet gitt følgende definisjon.<br />

”Intelligent network is an architectural concept for the creation and provision of<br />

telecommunication services which is characterised by:<br />

• Extensive use of information processing techniques<br />

• Efficient use of network resources<br />

• Modularisation of network functions<br />

• Flexible allocation of network functions among physical entities<br />

• Standarised communication between network functions via service independent<br />

interfaces<br />

• Access to the process of composition of services through the combination of<br />

network functions<br />

• Consumer control of some of his specific service attributes<br />

• Standarised management of service logic”<br />

Kort fortalt består IN av mer eller mindre ”intelligente” noder i nettet som switcher<br />

telefonsamtaler på bakgrunn av forhåndsbestemte regler. Videre kan man for eksempel ha<br />

ulike betalingsregler for tjenestene.[1],[4]<br />

3


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

2.2. Parlay<br />

Teksten er basert på [2]. Lesere som ønsker mer kunnskap om Parlay henvises dit.<br />

2.2.1. Om Parlay<br />

Parlay konsortiet ble dannet i 1998, samtidig som den trådløse internett eksplosjonen kom<br />

for alvor verden rundt. På den tiden, var telekommunikasjon applikasjoner og tjenester en<br />

del av nettverksadministratorens arbeidsområde og disse ble primært utviklet med<br />

verktøy som var spesialisert for telebransjen. Dette var for så vidt ikke noe problem så<br />

lenge applikasjonene kun samhandlet med andre teleapplikasjoner, men med<br />

oppblomstringen av mobile applikasjoner og IP, økte behovet for applikasjoner som<br />

kombinerte telekom tjenester med internett tjenester og kritiske virksomhetsdata. Dette<br />

førte til at helt nye dimensjoner av tjenester vokste fram som hadde stor betydning for<br />

enkeltbrukere og virksomheter.<br />

Parlay konsortiet ble startet av en samling av teleoperatører, IT leverandører,<br />

nettverksutstyr leverandører og applikasjonsutviklere. De satte seg som mål å mette det<br />

nye behovet som var oppstått og å spesifisere API’er som kombinerte det beste fra<br />

telebransjen og IT verdenen. For å få til dette spesifiserer og fremmer de API’er som er<br />

sikre, enkle å bruke, funksjonsrike og som er basert på åpne standarder. Spesifikasjonene<br />

blir laget og standardisert med deltakelse fra Parlay Joint Working Group (JWG), som<br />

inkluderer Third Generation Partnership Program (3GPP), Third Generation Partnership<br />

Program 2 (3GPP2) og European Telecommunications Standards Institute (ETSI)<br />

Services and Protocols for Advanced Networks.<br />

2.2.2. Hva gir Parlay oss?<br />

Parlay integrerer mulighetene i telekom nettverket med IT applikasjoner med sikre,<br />

gjennomtenkte og fakturerbare grensesnitt. Parlay’s åpne API frigjør utviklere fra å<br />

skrive kode for bestemte nettverk og miljøer, og med dette reduserer risiko og kostnader<br />

for prosjektet, noe som igjen åpner for at nyskapende tjenester blir levert gjennom<br />

telekom-nettverksoperatør kanalene. Med Parlay’s nettverksuavhengige API’er, genererer<br />

applikasjonene nye avgifts muligheter for nettverksoperatørene, applikasjons tjeneste<br />

tilbyderene og uavhengige program utviklere.<br />

Parlay ble med tiden svært komplisert og derfor ble Parlay X introdusert. Parlay X er et<br />

subset av Parlay, enklere å lære å støtte for web services. Dette gir en unik mulighet til å<br />

knytte sammen Parlay applikasjoner sammen med ikke Parlay applikasjoner. Nettopp<br />

denne muligheten er det jeg også benytter meg av i denne oppgaven, da tjenesten jeg<br />

jobber sammen med bruker Parlay og vi har da muligheten til å kommunisere ved hjelp<br />

av web services.<br />

4


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Figur 1. Hvordan Parlay X, er knytte sammen med resten av Parlay rammeverket, fra [2]<br />

2.2.3. Hva er Parlay API’ene?<br />

Parlay API’ene muliggjør kjøring av tredje parts applikasjoner innenfor en teleoperatørs<br />

nettverk og samtidig som at applikasjonene kjøres på eksterne applikasjonsservere for å<br />

tilby tjenester til abonnentene gjennom en sikker gateway. I tillegg til å tilby sikker,<br />

konfigurerbar tilgang til mulighetene i tjeneste tilbyderens nettverkt, kobler også Parlay<br />

tredje parts programvare til nettverksoperatørens nettverk via Parlay rammeverket. Parlay<br />

rammeverket er et kraftig verktøy som gjør nye virksomhets modeller mulige, gjennom å<br />

lage et fellesskap mellom nettverksoperatørene og tjenestetilbyderne som går utover<br />

internetts begrensede muligheter.<br />

5


Figur 2. Parlay til data og telenett, fra [2]<br />

2.3. Grensesnitt<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

2.3.1. GUI / UI<br />

Grensesnitt mot dagens applikasjoner varierer stort. De fleste av oss kjenner begrepene<br />

GUI og UI, hvor GUI står for Graphical User Interface eller grafisk bruker grensesnitt.<br />

GUI kjenner vi best gjennom klikkbare ikoner enten det er på en mobiltelefon eller det er<br />

på en PC. UI står da kun for User Interface eller bruker grensesnitt. Dette kjenner vi best<br />

som tekst baserte grensesnitt, som for eksempel fra operativsystemet DOS eller mer<br />

aktuelt kanskje, Linux. Riktignok har man GUI med Linux også, hvis man installerer X,<br />

men det er slett ikke nødvendig. Tale grensesnitt eksisterer også, enten sammen med GUI<br />

eller UI men også alene, som for eksempel ved opplesning av feilkoder på hovedkort.<br />

Dette er som sagt de tradisjonelle grensesnittene, men vi har også flere hvis vi tenker oss<br />

om. Tale er et grensesnitt, enten det er tale ut fra en webside eller det er fra en telefon. Og<br />

bruker man en telefon kan man samhandle med tjenesten enten ved å gi tale tilbake eller<br />

ved å bruke DTMF. DTMF står for ”dual tone multi frequency”, og er det signalet du gir<br />

teleoperatøren din når du taster en tast på telefonen. Navnet kommer av at for hver gang<br />

du taster en knapp på telefonen din generer du to toner med hver sin frekvens, som da blir<br />

tolket som én tast hos teleoperatøren din. Hensikten med dette er at det skal være umulig<br />

6


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

å gjengi disse lydene med tale. Etter sigende skal dette riktignok også være gjort, men det<br />

er ikke dette noe stort problem. Hvert siffer har en lav frekvens og en høy, for å<br />

vanskeliggjøre etterligninger.<br />

Sistnevnte er den aktuelle tilbakemeldingsformen for brukeren i denne oppgaven, og den<br />

beskrives mer utdypende i neste kapittel.<br />

For å oppsummere har vi ulike typer grensesnitt, i hovedsak varierer disse om man bruker<br />

telefon eller om man bruker en datamaskin, eller avansert mobiltelefon med skjerm. For<br />

datamaskinen, vil man ha tekst ut til brukeren, klikkbare ikoner og andre klikkbare felter<br />

og for eksempel tale ut fra en webside med VoiceXML. Telefon vil innebære tale ut til<br />

brukeren, eventuelt tale tilbake til applikasjonen og tilbakemeldinger gjennom DTMF.<br />

Du vil verken ha tekst ut eller noen ikoner eller annen form for GUI.<br />

Et interessant tema er talegjenkjenning som tilbakemeldingsform, men det temaet er ikke<br />

aktuelt for denne oppgaven, men kan absolutt være noe som hadde gjort tjenesten mer<br />

interessant.<br />

2.3.2. Interactive Voice Response<br />

Interactive Voice Response (heretter forkortet IVR) er en applikasjon som godtar en<br />

kombinasjon av tale, telefoni og inntastingstoner (DTMF) og tilbyr passende<br />

tilbakemeldinger på formen tale, faks, tilbakeringing osv. Applikasjonen kjører på<br />

vanlige maskiner men et talekort med et gitt antall telefonlinjer må være til stede. En IVR<br />

er vanligvis en del av et større system som den kommuniserer med og står sjelden eller<br />

aldri alene. De fleste av oss møter slike systemer ukentlig ja kanskje daglig, når man<br />

ringer kundeservice i en bedrift og lignende.<br />

IVR løsninger er løsninger som automatiserer og er tidsbesparende innenfor enkelte<br />

applikasjoner. Som en følge av at løsningen automatiserer vil den også kunne gjøre<br />

jobben til flere arbeidstakere i en bedrift. Så selv om det er en relativt dyr installasjon<br />

både med tanke på hva hardware koster og hva det koster å få utvikle en løsning, vil en<br />

IVR spare penger for en bedrift i det lange løp. Dette vil komme klart frem senere, da<br />

kapittelet tar for seg hvilke tjenester IVRen kan utføre.<br />

Vanlige arbeidsoppgaver for en IVR er:<br />

• Bank og aksje konti ballanser og overføringer.<br />

• Spørreundersøkelser og avstemninger<br />

• Kundesenter løsninger<br />

• Enkle bestillingssystemer, f.eks. kino<br />

• Informasjonsinnhenting, f.eks. kino<br />

En ordinær IVR applikasjon tilbyr ferdig innspillte talemeldinger som spilles av for<br />

brukerne av systemet ved gitte hendelser, logikk etter utført inntasting fra bruker, tilgang<br />

til relevante data og mulighet for å ta opp tale fra en bruker for senere bruk. Ved bruk av<br />

7


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Computer Telephony Interaction kan man få opp ytligere informasjon om innringeren fra<br />

databaser og se disse på en skjerm og å se på autitentiseringsdata for innringeren, for<br />

eksempel om telefonnummeret er en lovlig bruker av tjenesten.<br />

Denne oppgaven fokuserer på en begrenset callcenter løsning hvor IVR’ens oppgave er å<br />

spille av talemeldinger på kommando fra callcenteret til en bruker som skal respondere<br />

med inntastinger. IVRen skal formidle disse inntastingene tilbake til callcenteret for så og<br />

få videre instrukser.<br />

2.4. Web services<br />

Web services er uavhengige funksjoner som er tilgjenglig over internett. De er skrevet i<br />

henhold til nøyaktige spesifikasjoner, slik at de kan samarbeide med andre tilsvarende<br />

funksjoner. Noen av de mer etablerte funksjonene er meldingsformidling og beskrivelser<br />

av tekniske tjenester. Men andre er selvsagt også i bruk.<br />

Web services er nyttige for de gjør det mulig at flere ulike systemer kan kobles sammen<br />

på en sikker, enkel måte, som er standardisert. Samtidig som bedrifter hele tiden ønsker å<br />

knytte seg nærmere leverandører og kunder både på lang og kort sikt, er det viktig å ha et<br />

verktøy for hånden, som kan gjøre dette enkelt. Web services er nettopp et slikt verktøy.<br />

Styrken ligger i at en kan ikke bare kan sende meldinger til andre web services på en<br />

enkel måte men en kan også der det er behov for mye regnekraft, sende variabler over en<br />

web service til en annen rask maskin som kan utføre operasjonene og deretter returnere<br />

svaret. I tilfellet mitt brukes web services til å styre IVR maskinen.<br />

I og med at web services baserer seg på åpne standarder, er det tilgjenglig for mange<br />

systemutviklere. Resultatet av dette blir at konkurransen blir stor og at kostnadene ved å<br />

lage en slik tjeneste går ned. Konkurransen blant leverandørene av slike tjenester<br />

oppmuntrer til innovasjon i produktene og i tjenestene som tilbys bedriftene. Ved å<br />

basere systemer på standarder hindrer man også at løsningene kun passer en type maskin<br />

eller programvare.<br />

2.5. Teknologi<br />

2.5.1. Intel Dialogic SingleSpan/D300JCT-E1<br />

Mye av stoffet er basert på [3]<br />

Intel Dialogic SingleSpan er betegnelsen på serien av telekom produkter som Intel tilbyr<br />

markedet. Denne serien er mer korrekt identifisert som et medie bearbeidelseskort, hvor<br />

mediet for eksempel kan være tale. Taleteknologi omslutter prosessering og manipulasjon<br />

av et talesignal i et datamaskin-telefon system, noe som innebærer: filtrering, analysering,<br />

opptak, digitalisering, komprimering, lagring, utvidelse og avspilling. I tillegg inkluderer<br />

det muligheten for å motta, kjenne igjen, og å generere spesifikke telefon og nettverks<br />

8


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

toner. Denne typen teknologi i slike systemer er som regel standard og ikke spesielt for<br />

Intel sin løsning.<br />

Alle kortene i SingleSpan JCT serien gir digitale nettverksgrensensitt som er H.100<br />

støttet. Det støtter digital signalering teknologi, industristandarden PCI bussen og CT<br />

bussen (Computer Telephony). CT-buss åpner for muligheter til å koble sammen flere<br />

kort slik at det vil få flere linjer inn og økt kapasitet. At kortet ikke har andre krav til<br />

maskin enn at det har støtte for PCI buss gjør at det er meget anvendbart og kan brukes i<br />

så å si alle PC’er. Kortene støtter media funksjoner som tale prosessering, tale<br />

gjenkjennings programvare, faks, tone signalering, global tone detektering, global tone<br />

generering, analyse av fremdriften til en samtale noe som gjør de ideelle for<br />

tjenestetilbydere.<br />

ISDN Primary Rate Interface (PRI) firmware er standard på alle kort i SingleSpan-JCT<br />

serien og denne er blant annet godkjent for de fleste protokoller basert på både T-1 (1.544<br />

Mb/s) ogE-1 (2.048 Mb/s) fysiske grensesnitt. Som vi ser av kortbeskrivelsen,<br />

SingleSpan-D300JCT-E1, er kortet basert på E1 grensesnittet, hvilket betyr at det besitter<br />

30 ISDN B kanaler og 2 D kanaler. I tillegg har kortet 30 taleressurser, altså en til hver<br />

talekanal. B kanalene er kun for samtalehåndtering / anropshåndtering, mens talekanalene<br />

er for opptak og avspilling av lyd på B-kanalen.<br />

ISDN PRI gir oss en rekke funksjonalitet, jeg vil raskt trekke frem de viktigste for denne<br />

oppgaven og de som er blitt tatt i bruk av denne. Dialed Number Identification Service<br />

(DNIS) – automatisk gjenkjenning av telefonnummeret som ble tastet inn. Automatic<br />

Number Identification (ANI) – Identifiserer innringeren med telefonnummeret (a<br />

nummer). Dynamisk sette protokoll timere gjennom API’s<br />

Videre støttes Global Call programvaren, et call control programmerings grensesnitt og<br />

protokoll motorsom gjør det enklere å utvikle nettverksapplikasjoner for telefonnettet<br />

uavhengig av nettverksprotokollene. Global Call kan leses mer om i neste kapittel.<br />

9


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Figur 3. Dialogic interface med telefon nettet, fra [3]<br />

Figuren viser hvordan Dialogic kortet setter programutvikleren i kontakt med<br />

telefonnettet. Vi ser også at uavhengig av hvor mange kort som benyttes vil vi kun<br />

benytte oss av en PCI kortplass i maskinen, tilkobling av flere kort går gjennom CT<br />

bussen. Kortet er heller ikke avhengig av Global Call, men at dette kun er et foretrukket<br />

API. PBX (Private Branc Exchange) er multiplekser som gir muligheten for at lokale<br />

linjer på den ene siden av kortet kan bruke samme linje på utsiden; mye brukt i bedrifter<br />

så man slipper og tilordne et telefonnummer til hver ansatt. Automated Speech<br />

Recognition (ASR) programvare kan også kobles til kortet, slik at men kan lage tjenester<br />

man kan prate til og for talegenerering.<br />

10


2.5.2. Global Call<br />

Kapittelet er basert på utdrag fra [5]<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Global Call er Dialogic’s standard for call control. Global Call utviklingsverktøy gir et<br />

felles signalerings grensesnitt for nettverksapplikasjoner, uavhengig av<br />

signaleringsprotokollen som brukes på det lokale telefonnettverket. Signalerings<br />

grensesnittet som Global Call tilbyr, forenkler utvekslingen av call control meldinger<br />

mellom telefonnettet og nettverksapplikasjoner. Det gir utviklere mulighet til å lage<br />

applikasjoner som kan jobbe med signalerings systemer over hele verden, uavhengig av<br />

hvilket nettverk det er og hvilke applikasjoner som er tilkoblet. Det er ideelt for store<br />

nettverksløsninger, som tale, data og video applikasjoner, hvor hardware og<br />

signaleringsteknologi varierer fra land til land.<br />

Det er implementert som et API og fungerer på ulike typer telefon nettverk:<br />

• Analog<br />

• Digital CAS<br />

• ISDN<br />

• SS7<br />

Global Call kjører på følgende plattformer og arkitekturer:<br />

• SpringWareTM eller R4-based<br />

• DM3-baserte kort<br />

• Ikke-Dialogic kort<br />

GlobalCall består i hovedsak av tre hoved komponenter<br />

• Global Call API<br />

Et enkelt, utvidbart API som tilbyr deg nettverksgrensesnittene på et høyere nivå.<br />

Det forenkler utvekslingen av call control meldinger mellom telefonnettet og<br />

nettverksapplikasjoner.<br />

• Global Call - Call Control Biblioteker<br />

Biblioteker som gir et grensesnitt mellom Global Call API og de ulike nettverk<br />

signalerings protokoller.<br />

• Global Call Protokoller<br />

Nettverk signalerings protokoller, som T-1 Robbed Bit, E-CAS, ISDN, Analog,<br />

QSIG, SS7, og IP H.323, kan bli anropt fra GlobalCall API for å utføre call<br />

control.<br />

11


Figur 4. Global Calls arkitektur, fra [5]<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Figuren setter Global Call i kontekst med PSTN nettet og brukerapplikasjonen. Vi ser at<br />

for programmereren vil nettverksarkitekturen være transparent.<br />

Global Call API’et er et call control API. På samme måte som de andre Intel Dialogic<br />

API’er, som Voice API, bruker GlobalCall API, Standard Runtime Libary (SRL) API til<br />

å levere svarhendelser til de respektive API kall. GlobalCall muliggjør ikke bare call<br />

control men også funksjoner for støtte operasjoner, administrering og vedlikeholds<br />

oppgaver.<br />

Som et eksempel, signal kvitteringen eller informasjonsflyten som er nødvendig for å<br />

etablere en samtale vil variere utifra hvilket land en befinner seg i. Istedenfor å kreve at<br />

applikasjonen håndterer lavnivå detaljene, vil Global Call programvaren tilby et<br />

konsistent høynivå grensesnitt til brukeren og håndterer i tillegg de ulike lands unike<br />

protokollkrav, transparent for applikasjonen.<br />

Tilstandsdiagrammet under viser oss de ulike tilstandene når en samtale komme inn til<br />

global call. Hver transisjon er indikert med enten heltrukket eller stiplet linje, hvor<br />

heltrukket er et absolutt av hva programmereren må benytte seg av når han<br />

programmerer. Vi ser også hvilke kall som starter en transisjon. Hva de forskjellige<br />

hendelsene betyr står i tabell 2. Den røde streken indikerer hva som er benyttet i denne<br />

oppgaven.<br />

12


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Figur 5 Tilstandsdiagram til Global Call ved en innkommende asynkron samtale, fra [5]<br />

13


3. Design<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Dette kapittelet har til hensikt å klargjøre hva tjenestens oppgave er og hvordan det er<br />

implementert på et høyere nivå enn implementasjon kapittelet.<br />

3.1. Overordnet løsning<br />

Denne første delen av kapittelet setter fokus på, hva IVRen skal gjøre, for å sette leseren<br />

raskt inn i den praktiske betydningen av IVR. Senere vil det bli vist hvordan dette faktisk<br />

gjøres og hvordan det fungerer i dag.<br />

IVR maskinen står plugget rett i telenettet på en E-1 linje. E-1 er et europeisk digitalt<br />

transmisjons format som kan bære 32 kanaler á 64 Kbps til sammen 2048 Mbps. Det vil<br />

si at den kan ha 30 samtidige samtaler, fordi 2 av kanalene går til signalering på linjen.<br />

Videre er den koblet til IP nett med et standard nettverkskort. For å vise hvordan<br />

tjenesten fungerer har jeg tegnet en nummerert figur, hvor IVR maskinen er tegnet i<br />

sammenheng med resten av nettet som benyttes av løsningen. Løsningen vil være IVR<br />

tjenesten og Call center tjenesten sammen. Løsningen skal tilby call center funksjonalitet,<br />

hvor en bruker ringer et nummer og får opplest en meny, velger et av meny elementene<br />

og for eksempel blir satt over til en kunde konsulent.<br />

Tallene nedenfor indikerer hva som skjer ved tilsvarende tall på figur 7.<br />

1. Når systemet startes opp, registrerer call centeret seg i IVR tjenesten. Det er først og<br />

fremst fordi IVRen kan tjene flere tjenester og da er det nødvendig at IVRen sender<br />

til bake info om for eksempel inntastinger til riktig tjeneste. Den sender da med URL<br />

til web servicen som skal ta imot informasjon av denne art.<br />

2. Innringeren er i denne sammenhengen en kunde som ønsker å benytte seg av<br />

tjenesten call centeret tilbyr. Innringeren kan godt ringe fra en mobiltelefon så vel<br />

som fra en fast telefon.<br />

3. Videre kommer samtalen fram til endesvitsjen som ser at nummeret som ringes er et<br />

IN nummer.<br />

4. Endesvitsjen signalerer da til et ”Service Control Point” (SCP) som videre sender<br />

forespørselen til call centeret. Call centeret sier så ifra til endesvitsjen, gjennom SCP,<br />

at samtalen skal viderekobles mot IVRen. Dette er fordi det er IVRen som kan spille<br />

av talemeldinger og ta imot dtmf fra telenettet. Et viktig poeng er at det fortsatt er<br />

Call centeret som har kontroll på eller styrer samtalen.<br />

5. Samtalen rutes gjennom telenettet til den kommer til siste svitsjen som IVRen er<br />

koblet til.<br />

6. Destinasjon er funnet og samtalen kommer fram til IVRen. IVRen gjennomgår nå en<br />

rekke prosedyrer, som å opprette tilstandsinformasjon om samtalen, slik at en finner<br />

tilbake til riktig samtale. Kommer det flere samtaler er det viktig å ikke blande dem.<br />

14


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

7. IVRen har nå funnet ut at samtalen skal styres fra call centeret, og spør følgelig om<br />

hva som skal gjøres med samtalen. Dette vil i praksis si at den spør om hvilke<br />

meldinger som skal spilles av for innringeren.<br />

8. Call centeret svarer da på forespørselen og forteller hvilke meldinger som skal spilles<br />

av for innringeren.<br />

9. IVRen spiller av meldinger til riktig innringer, hvorpå innringeren svarer med et<br />

menyvalg. Vedkommende svarer da med å taste inn på telefonen.<br />

10. IVRen sender igjen en melding til Call centeret om at den ene samtalen har tastet<br />

akkurat det menyvalget<br />

Punkt 8, 9 og 10 gjentas nå så mange ganger som Call centeret bestemmer. Til slutt<br />

kobles samtalen til IVRen ned og viderekobles til en eventuell kundebehandler. Samtalen<br />

vil da være oppsatt mellom innringer og kundebehandler. Dette gjøres da av call centeret.<br />

Kundebehandleren vil da typisk ha en kundedatabase hvor en kan lete opp for eksempel<br />

adresse til innringeren ved en eventuell utkjøring av varer.<br />

Figur 6. IVRens innpass i nettet.<br />

15


3.2. IVR tjenesten.<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Nå som vi har sett på IVR’ens funksjon i nettet, la oss gå nærmere inn på hvordan slik<br />

funksjonalitet kan implementeres. Som vi har sett av figur 7, må IVRen tilby to<br />

inngående grensesnitt og to utgående. Det vil henholdsvis være en inn og ut til ISDN<br />

nettet samt en web service og en web klient som kaller en webservice hos call centeret.<br />

En av forutsetningene til oppgaven var å lage en tjeneste som skulle være uavhengig av<br />

tjenesten som benyttet seg av IVRen.<br />

Kommunikasjon med call centeret var det viktigste, men kunne man finne en løsning som<br />

er mer generell ville det være det beste. Call centeret benytter seg av Parlay for<br />

kommunikasjon med telenettet og hadde derfor også muligheten til å benytte seg av<br />

Parlay X. Parlay X består av, som nevnt tidligere, et utvalg Parlay funksjonalitet, men<br />

med web service støtte. Web services er dagens absolutt beste å enkleste måte å<br />

kommunisere mellom programmer over internett på. Det er plattformuavhengig og det er<br />

kun måten man bygger dem på som er forskjellig. Metodene og attributtene sendes på<br />

samme format, uansett hvordan de er bygd, og det er det som gjør det til et unikt verktøy.<br />

Det er heller ingen begrensing i programmeringsspråk, når en skal lage web services.<br />

Videre må vi ha ett grensesnitt mot PSTN nettet. I teknologi kapittelet er det skrevet om<br />

Global Call, og at det følger med Dialogic kortet. Global Call gir oss et grensesnitt mot<br />

PSTN nettet som er mer enn godt nok for den funksjonaliteten vi ønsker. Global Call er<br />

også særdeles godt dokumentert, men det er enormt og det tar lang tid å sette seg inn i<br />

det.<br />

Vi skal nå gå IVR tjenesten nærmere i sømmene og se hva som ligger bak ”den gule<br />

boksen” i figur 7. Det er klart at vi må ha med web services og global call API’et,<br />

utfordringen blir hvordan vi skal sette dette sammen. Implementasjonsmessig ville det<br />

være lettest å programmere alt i samme prosjekt. Av programmeringsmessige årsaker<br />

gikk dessverre ikke dette, så funksjonaliteten måtte deles inn i mindre programmer.<br />

Grunnen til at dette ikke gikk er omhyggelig beskrevet i kapittel 4.2 ”Implementering av<br />

IVR tjenesten”. Årsaken til oppdelingen har noe med web servicen å gjøre, så den måtte<br />

skilles ut fra hovedprogrammet, eller IVR kontrolleren. Jeg måtte likevel ha<br />

kommunikasjon mellom web servicen min og IVR kontrolleren og dette løste jeg med å<br />

bruke TCP / IP sockets mellom programmene. Dette kunne blitt et problem hvis<br />

programmene hadde vært på forskjellig maskiner, med tanke på forsinkelse, men de er på<br />

samme maskin så det er ikke noe problem.<br />

16


Figur 7. IVR tjenesten<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Figur 8 viser oss hvordan arkitekturen av programmet vil være, når det er ferdig. Web<br />

klienter og web services er tegnet blå, socket kommunikasjonen er tegnet rød og IVR<br />

kontrolleren gul. Legg merke til hvilken vei pilene går. Vi ser at kommunikasjon inn til<br />

programmet vårt kommer gjennom web servicesen vår og kommunikasjon ut går enten<br />

gjennom Global call APIet eller web klienten.<br />

Meldingen som utveksles på figuren vil være definert av hva slags melding som skal<br />

sendes. De forskjellige meldingene som er definert mellom call centeret og inn til IVRen<br />

er: register, play og disconnect. Ut fra IVRen til call centeret er connect og<br />

return_number. Detaljerte beskrivelser av meldingene samt meldingssekvensdiagrammer<br />

finnes i kapittel 4.3 ”Grensesnitt mot callcenter”.<br />

17


4. Implementering<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Implementasjonen av prosjektarbeidet er den jeg har brukt mest tid på. Den har vært<br />

utrolig tidkrevende samtidig den har vært teknisk krevende. Spesielt er det global call<br />

som har vært utfordrende, samtidig som at det er totalt ukjent og det har tatt lang tid å<br />

sette seg inn i dette store og omfattende APIet.<br />

4.1. Valg av utviklingsverktøy<br />

Utgangspunktet for oppgaven er Global call biblioteket. Dette er skrevet i C++. Derfor<br />

var det viktig med et verktøy som håndterer C++. Oppgaven innebefatter flere<br />

teknologier blant annet webservices; derfor var det fint om verktøyet om verktøyet kunne<br />

lage. De fleste verktøy lager et standard program for deg i det du begynner, for eksempel<br />

ønsker man å lage en konsoll applikasjon lager veiviseren dette for deg, slik at du kun<br />

trenger å legge til funksjonalitet siden. At verktøyet også var integrert med en webserver<br />

og lett kunne utplassere webservicen på denne, var også viktig. Det viktigste kriteriet var<br />

likevel muligheten til å kompilere både managed og unmanaged C++ kode i samme<br />

prosjekt, og dette var det kun .NET rammeverket som gjorde. Derfor falt valget på<br />

Microsoft Visual Studio .NET.<br />

I etterkant er jeg meget fornøyd med valget. Visual Studio .NET har særdeles gode ”hjelp<br />

- funksjoner”, samt at det er tett integrert med Internet Information Server, som er<br />

Microsoft sin webserver, fine ”veivisere” er også der.<br />

4.2. IVR tjenesten<br />

IVR tjenesten er implementert i tre forskjellige faser. Disse representerer de tre<br />

hoveddelene av selve tjenesten, som er: IVR kontrolleren, webservicen og TCP / IP<br />

sockets. Hvordan disse forskjellige delene henger sammen sees på figur 7. Ideelt sett<br />

burde alt vært programmert sammen, dette vil ha gjort at jeg hadde sluppet og brukt<br />

socket programmering mellom IVR kontrolleren og webservicen. Jeg kunne da ha<br />

implementert webservicen i kontrolleren og spart meg for mye tid. Begrunnelsen for<br />

hvorfor dette ikke ble gjort blir forklart nedenfor. Vær oppmerksom at kode som er vist i<br />

det følgende kapittel kan være noe forkortet i forhold til hva som er realiteten i oppgaven,<br />

dette er på grunn av plass hensyn og at det ikke er noe vits i å vise samme kode flere<br />

ganger.<br />

Global call API er skrevet i C++, og følgelig måtte også IVR kontrolleren skrives i C++.<br />

API’et distribueres til brukere gjennom header filer (*.h) og biblioteker (*.lib ). Header<br />

filene definerer klasser og funksjoner og enkelte variabler, mens bibliotekene inneholder<br />

kompilert kildekode. På denne måte kan ingen endre kildekoden og API’et forblir dermed<br />

uendret, eller ubrukelig hvis man endrer header filene som kun er tekstfiler.<br />

18


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Når man snakker om C++, snakker man egentlig om unmanaged C++. Unmanaged C++<br />

betyr at garbage collection ikke er i bruk.. Garbage collection er at programmet ”rydder<br />

opp” etter seg. Med dette menes at hvis man bruker garbage collection, vil programmet<br />

automatisk frigjøre minne når en klasse er ferdig og slettes, eller for eksempel en tabell<br />

som slettes. Dette er som sagt det som brukes hvis ikke annet er angitt. Alle nye<br />

programmeringsspråk i dag benytter seg av garbage collection og er derfor managed.<br />

Man kan gjøre C++ managed ved å benytte seg av direktivet __gc, hvilket da forteller<br />

kompilatoren at her kommer det en managed funksjon eller datatype. Å blande managed<br />

og unmanaged C++ er også mulig men man må da fortelle kompilatoren hele tiden om<br />

man benytter seg av managed eller unmanaged kode. Dette gjøres med direktivene:<br />

#pragma managed og en __gc datatype / funksjon eller #pragma unmanaged og en<br />

__nogc datatype / funksjon. For å illustrere forskjellen gir jeg et raskt eksempel.<br />

Ikke garbage collection: #pragma unmanaged<br />

int MyIntArray [100]; // eller<br />

int MyIntArray __nogc [100];<br />

garbage collection: #pragma managed<br />

int MyIntArray __gc[]= new int __gc[100];<br />

Vi ser at måten å deklarere varier utifra om vi bruker managed eller unmanaged C++.<br />

Hvis man ønsker å blande managed og unmanaged kode må man også benytte seg av /clr<br />

parameteren for kompilatoren, som forteller den at den skal bruke Common Language<br />

Runtime.<br />

Det viste seg at ved bruk av webservice i C++ må de avanserte datatypene i metodene<br />

være managed. I utgangspunktet er ikke dette noe problem, siden man med .NET<br />

rammeverket kan skrive både managed og unmanaged i samme program som vist<br />

ovenfor. Imidlertid var jo kildekoden for Global call API’et var allerede ferdig kompilert<br />

unmanaged C++ kode og jeg hadde derfor ikke mulighet for å gå inn i kildekoden å sette<br />

”#pragma unmanaged” direktivet. Resultatet ble derfor at jeg måtte dele opp programmet<br />

i to, en del som håndterte kontroll av IVR’en og en som håndterte web servicen.<br />

Allikevel må jeg ha kommunikasjon mellom disse to programmene, for at kontrolleren<br />

skal få melding om hvilke lydfiler som skal avspilles, og dette løste jeg ved å<br />

implementere TCP / IP sockets.<br />

Innledningsvis i del kapittelet skrev jeg at jeg ideelt sett burde programmert alt sammen, i<br />

og dette er altså grunnen til at dette ikke ble gjort.<br />

Videre i kapittelet følger en beskrivelse for hvordan jeg har brukt de forskjellige<br />

teknologiene for å løse oppgaven.<br />

19


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

4.2.1. Min webservice<br />

En tjeneste som man ønsker skal være lett tilgjenglig, må benytte seg av en teknologi som<br />

støttes på tvers av andre teknologier. Web services er dette og det er da også det eneste<br />

som egentlig trengs for å kunne benytte seg av denne tjenesten. Det er det som gjør den<br />

så anvendbar i mange forskjellige genre. Web servicen har som skrevet tidligere til<br />

hensikt å fungere som en mottaker av kommandoer fra call centeret. Den skulle også<br />

være et frittstående program og ikke integrert i IVR kontrolleren. Når den tar imot<br />

meldinger sender den de videre med TCP / IP socket klienten. Jeg vil nå gå igjennom litt<br />

av kildekoden i fra web servicen som jeg mener er relevant. Koden som vises vil være<br />

kode som blir eksekvert etter hverandre. Det begynner med en kommando som kommer<br />

inn på web servicen, deretter blir sendt med TCP / IP mottatt av IVR kontrolleren og<br />

deretter spilt av til riktig samtale tilkoblet IVR’en.<br />

Dette er web servicen som tar imot kommando om å spille av lydfiler på IVRen.<br />

Programmerings språket er C# (uttales C sharp). Vi ser at det er en metode tilgjenglig på<br />

internett allerede fra første linje hvor det står [WebMethod]. Man kan ha mange metoder<br />

i en web service prosjekt men kun de av de som det står [WebMethod] foran vil være<br />

tilgjenglig for allmennheten. Det eneste som er spesielt med en web service er nettopp<br />

dette, som dere ser er resten av koden helt normal. Vi ser funksjonsdeklarasjonen public<br />

Boolean Play (), og den forteller oss at det er en offentlig funksjon altså aksesserbar for<br />

andre deler av programmet, Boolean forteller at funksjonen returnerer true eller false<br />

tilbake til den som kalte funksjonen. Play er funksjonsnavnet. Hele ideen med resten av<br />

koden er å gjøre om alle parametrene til om til en tekst streng slik at den kan sendes som<br />

ett argument til funksjonen som skal sende den til IVR kontrolleren. For å få dette til må<br />

først bestemme oss for på hvilken måte skal vi sette sammen strengen på, slik at vi kan<br />

finne fram til de opprinnelige variablene, når tekst strengen er kommet fram til IVR<br />

kontrolleren. Jeg måtte finne en løsning på å skille de ulike variablene. Ikke alle<br />

variablene er likt oppbygd, sånn som msg_id (message id), som inneholder en tabell men<br />

hvilke lydfiler som skal spilles av. Indeks 0 i denne tabellen brukes som velkomstmelding<br />

og det skal ikke leses opp ”Tast 1” foran den. Dette begynner programmet med fra og<br />

med indeks 1. Derfor måtte jeg finne en måte jeg kunne gjøre dette på som skulle være<br />

entydig og umulig å tolke, uansett datatype.<br />

Løsningen på dette problemet var å sette ett semikolon etter hvert variabelnavn og<br />

likhetstegn etter hver variabelverdi. For å markere slutten på en streng settes # tegnet.<br />

Variabelnavnet må være der for at jeg skal kunne vite i hvilken variabel jeg skal sette<br />

20


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

verdien i når strengen kommer på andre siden. Jeg måtte også skille mellom variabler og<br />

verdier, derfor måtte jeg ha to separatorer, jeg valgte semikolon og likhetsegn. Grunnen<br />

til at disse separatorene kommer etter verdien eller variabelen er at da kan jeg huske på<br />

hvor jeg leste til sist og lese det som er imellom der jeg var og der jeg er. Jeg vil vise<br />

dette med et eksempel til slutt om i del kapittelet TCP / IP sockets.<br />

For – løkkene i funksjonen har til hensikt å hente ut alle variablene i tabellen med ider å<br />

legge dem etter hverandre i tekststrengen som oversendes DoSocketGet. Vi ser at i siste<br />

setning, bygges og oversendes strengen til socket klassen som skal sende tekststrengen,<br />

som også bygges ferdig i denne linjen. String.Concat slår sammen tekststrenger til en<br />

streng, og DoSocketGet ligger i Send klassen. Action forteller socket serveren hvilken<br />

web service som ble kalt, slik at det blir enkelt for kontrolleren å finne ut hva som skal<br />

gjøres. La oss tenke oss at vi har disse variablene:<br />

msg_id [ 0 ] = 101<br />

msg_id [ 1 ] = 204<br />

msg_id [ 3 ] = 306<br />

ref_no = ” 35224678”<br />

num_of_digits = 1<br />

Dette vil se slik ut når det oversendes Send klassen:<br />

”action;play=msg_id;101=204=306=0=0=0=0=0=0=0=ref_no;35224678=num_of_digits;1=#"<br />

Vi ser at det alltid blir sendt en tabell med indeks 0-9, dette har ingen praktisk betydning<br />

men er kun gjort for å forenkle mottaket av strengen.<br />

Dette var altså selve web servicen, nå skal vi se litt nærmere på socket klassen som<br />

sender tekststrengen til socket serveren.<br />

Tekst strengen som funksjonen DoSocketGet heter nå conn_string. Meldinger som<br />

sendes over TCP / IP sockets sendes i dette programmet som en Byte tabell, vi ser at jeg<br />

21


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

bruker en funksjon som henter ut bytesene fra conn_string og legger dem i msg. Deretter<br />

defineres variabelen som skal returneres til webservicen. Denne forteller om sende<br />

operasjonen var vellykket eller ikke. Videre blir det opprettet en socket. AdressFamily<br />

betyr at det er IPv4 som benyttes, deretter kommer socket type og i dette tilfelle benytter<br />

jeg Stream som er en pålitelig, forbindelses orientert type, den benytter seg av<br />

Internetwork familien og TCP. Videre definerer jeg hvilken port kommunikasjonen skal<br />

gå på. Det er det samme hvilken du bruker så lenge du holder deg unna de faste portene.<br />

Er du i tvil kan du bruke port lister som en finner på internett. Disse har oversikt over<br />

hvilke applikasjoner som bruker hvilke porter.<br />

Connect etablerer TCP forbindelsen til serveren, som ligger på samme maskin, på port<br />

81. Lykkes dette sendes msg, som inneholder strengen, over til serveren. Samtidig som<br />

success = true returneres til web servicen som igjen sender true tilbake til call centeret.<br />

4.2.2. TCP / IP socket server<br />

Socket serveren er skrevet i C++. Jeg har ikke benyttet meg av .NET’s C++ rammeverk,<br />

da ville jeg fått samme problem som jeg beskrev innledningsvis om implementasjon av<br />

IVR tjenesten. Implementasjonmessig tilhører den IVR kontrolleren, men den<br />

representerer spesifikk funksjonalitet og derfor skriver jeg om den for seg. Oppgaven til<br />

socket serveren er å ta imot byte tabellen som sendes fra socket klienten omtalt i web<br />

service kapittelet. Når det er gjort, må byte tabellen gjøres om til en char tabell slik at den<br />

kan behandles og tolkes på en slik måte at datastrukturene blir de samme igjen. Det vil si<br />

sånn de var da de ble mottatt av web servicen.<br />

For å gjøre forklaringen enklere og å enklere henvise til koden har jeg lagt inn piler, som<br />

peker til det omtalte området i koden.<br />

1. Før vi kan begynne mottaket av byte tabellen må vi klargjøre en socket som lytter<br />

etter tilkoblinger fra socket klienten i web servicen. Med metoden som jeg har<br />

benyttet for å lage en socket server må jeg først starte opp Windows Sockets<br />

prosessen. De 5 kodelinjene i punkt 1 starter prosessen slik bruk av ws2_32.dll blir<br />

mulig. Uten denne ville jeg for eksempel ikke kunnet lage en socket som jeg gjør i<br />

punkt 3.<br />

2. Når det er gjort må jeg definere adressefamilie, hvilke adresser som skal få lov til å<br />

koble seg på, og til hvilken port dette gjøres. Dette er veldig likt som med måten man<br />

lager en socket som sender, altså forklart i forrige kapittel, så jeg sier ikke mer om<br />

dette. Det eneste som er forskjellig er syntaksen, funksjonaliteten blir akkurat den<br />

samme.<br />

3. Videre må socketen lages og defineres for hva slags typer data den skal ta imot, dette<br />

er også likt som for klienten.. Deretter må adresseinformasjonen knyttes til socketen,<br />

som gjøres i bind kallet.<br />

4. Socketen settes nå i en tilstand hvor den lytter etter innkommende tilkoblinger. 5<br />

indikerer at det kan være 5 tilkoblinger som kan være i kø, man kan nemlig kun<br />

22


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

behandle en og en tilkobling og i stedet for å kaste nye forespørsler, setter man de i<br />

kø.<br />

5. Programmet har nå gått inn i en evig løkke, indikert av while(1), et argument som<br />

alltid vil være sant. Det er i denne fasen at vi mottar og prosesserer forespørselen.<br />

Accept godkjenner et tilkoblings forsøk og returner en ny socket datatype som lagres<br />

i Inn variabelen. Datastrømmen vil nå være tilgjenglig gjennom Inn.<br />

6. Selve innlesningen av byte tabellen gjøres i dette punktet. Det leses en og en byte,<br />

samtidig som det sjekkes om terminerings tegnet ’#’ er lest inn, da vil i så fall<br />

innlesningen opphøre og vi går videre til, behandlingen av strengen. Resultatet blir<br />

lest inn i input.<br />

7. Når innlesningen er unnagjort kan strengbehandlingen starte. Hvordan dette foregår<br />

vises nedenfor. Etter dette blir resultatet lagret i incomming tabellen, og IVR<br />

kontrolleren får melding om at en melding fra web servicen er kommet inn og lagret<br />

på den gitte plassen i tabellen. Incomming er en tabell som peker til forskjellige<br />

instanser av klassen Variables. Variables lagrer resultatet av strengbehandlingen, som<br />

vi skal se straks. Legg også merke til at incomming kan inneholde 30 klasser, altså<br />

like mange som vi har ISDN linjer. Vedlikeholdet av denne tabellen foregår utenfor<br />

den koden og kommenteres derfor heller ikke.<br />

23


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Strengbehandlingen foregår i ParseString(). Den er nødvendig for å skille ut dataene i<br />

tekststrengen som oversendes socket serveren. Oppgaven til ParseString er derfor og<br />

skille ut hvilke variabler som skal ha de ulike verdiene som oversendes. Koden nedenfor<br />

viser nettopp, og jeg skal gå igjennom den på samme måte som jeg gikk igjennom koden<br />

ovenfor.<br />

Vi ser at ParseString er deklarert på en sånn måte at, den returnerer en peker til en klasse,<br />

som lagres i incomming tabellen nevnt tidligere. Den tar en char* som argument og det er<br />

strengen som skal behandles. Det neste som skjer at variabler som brukes i funksjonen<br />

blir initiert.<br />

1. En temporær klasse peker blir opprettet, slik at vi kan jobbe på denne klassen og<br />

senere returnere den ved funksjonens slutt. Når dette er gjort startes en løkke som skal<br />

gå igjennom hver del av strengen og tolke denne. Vi kan aksessere et tegn i strengen<br />

24


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

på følgene måte: streng[ teller ] og det er akkurat det som gjøres i switch utsagnet.<br />

For hvert tegn som leses sjekkes det om tegnet er ’ ; ’, ’ = ’eller ’ # ’. Hvis tegnet ikke<br />

er noen av delene sjekkes neste tegn i strengen.<br />

2. Er tegnet ’ # ’ er strengbehandlingen ferdig. Vi husker fra tidligere at ’ # ’ terminerer<br />

strengen. Finished blir satt til true slik at strengbehandlingen avbrytes, og pekeren til<br />

klassen blir returnert og lagret på riktig plass i incomming tabellen.<br />

3. Er tegnet ’ ; ’, er det lest inn en ny variabel. Det som er lest inn er variabel navnet og<br />

vi ser at det lagres i variabelen variabel. Er det for eksempel den første variabelen<br />

som er lest inn, som er ”action” vil offset være 0 og counter være 6.<br />

Programmet leser da inn i variabel, det som står mellom offset og counter -1. Etterpå<br />

settes offset til counter + 1, slik at en vet hvor neste verdi / variabel begynner, ved<br />

neste innlesning.<br />

4. Er tegnet ’ = ’, er det en verdi som er lest inn. Verdien blir lest inn i value på samme<br />

måte som i punkt 3. Deretter sjekkes hvilken variabel som skal få tilordnet verdien. Er<br />

verdien et tall som den er i to av tilfellene må man i tillegg til å tilordne verdien riktig<br />

variabel, gjøre den om til et tall. Er det en meldings id som er kommet inn må man<br />

inkrementere tabell indeksen slik at eventuelt neste tabell verdi blir tilordnet på neste<br />

indeks i tabellen.<br />

5. Etter at programmet er ferdig med å behandle den spesifikke plassen i strengen<br />

inkrementeres counter slik at neste tegn kan tolkes. Er strengen ferdig tolket<br />

returneres pekeren til det kallende program.<br />

25


4.2.3. IVR kontroller<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

IVR kontrolleren er selve hjernen i IVR tjenesten. Funksjonaliteten i de foregående<br />

kapitlene har kun til hensikt å bringe informasjon fram til kontrolleren. Som for eksempel<br />

en meldings id som skal spilles. Jeg vil ikke i samme grad kommentere koden i dette<br />

kapittelet. Derfor vil jeg anbefale at leseren titter på denne på den vedlagte CD, slik at<br />

man får et visst inntrykk av det arbeid som er gjort i forbindelse med kontrolleren. IVR<br />

kontrolleren er vesentlig mer komplisert og lengre, men jeg vil trekke ut essensielle<br />

momenter. Oppgaven til kontrolleren er og først initialisere Global call biblioteket<br />

deretter Dialogic kortet. gc_Start(NULL) starter biblioteket og gc_Stop() stopper det.<br />

Initialisering av kortet foregår på den måten at en først finner ut hvor mange Dialogic<br />

kort man har installert. Deretter åpnes disse og registreres i Global call samt at man<br />

starter en Global call hendelses håndter for hvert kort. Hendelses håndtererens oppgave er<br />

å ta imot hendelser til kortet slik at en handling kan utføres. Videre skal alle linjene på<br />

hvert enkelt kort åpnes (30 ISDN linjer)og klargjøres for innkommende anrop.<br />

Et problem som ofte oppstår under åpning av ISDN linjene er at de ikke er klare til å<br />

motta anrop enda. Løsningen på dette er å nullstille linjen etter at man har åpnet den.<br />

Videre må man lage en hendelses håndterer som kan si ifra til programmet når en<br />

26


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

innkommende samtale detekteres for eksempel. Til slutt kalles waitcall som setter linjen i<br />

stand til å motta en samtale. Koden nedenfor viser et utdrag fra denne klargjøringen. For<br />

løkken som står øverst vil kjøre 30 ganger siden det er 30 linjer som skal åpnes. Denne<br />

koden er portabel så den kan brukes på andre Dialogic kort, som for eksempel har flere<br />

eller færre linjer, eller i konfigurasjoner hvor man stacker kortene. Da vil eventuelt denne<br />

løkken ble startet like mange ganger som man har kort installert.<br />

Resten av koden som omhandler den enkelte ISDN linje finnes i [8] under<br />

\ivr_controller\GlobalCall.cpp.<br />

Når alle linjer på alle kort er åpnet, må man initialisere talekanalen på hver ISDN linje.<br />

Denne koden ligner mye på koden for å åpne linjene, så den viser jeg ikke. Forskjellen er<br />

at det ikke er noen måte å nullstille denne kanalen, og man trenger heller ikke å klargjøre<br />

kanalen med en waitcall lignende funksjon. Hendelseshåndtereren til talekanalene vil ta<br />

seg av hendelser som har med tale på kanalen å gjøre. Dette kan typisk være at IVR<br />

kontrolleren holder på med et opptak eller avspilling av lyd.<br />

Forskjellen på hendelseshåndtereren til en linje enhet og til en tale enhet er viktig å forstå<br />

og oppgaven hadde vært umulig å gjennomføre uten disse. Hendelseshåndtereren til en<br />

linje enhet, håndterer altså alt som har med et anrop å gjøre mens tale håndtereren<br />

håndterer alt som har med lyd å gjøre på en enkelt kanal. For å øke forståelsen av<br />

27


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

hendelsene listes de opp nedenfor, de er selvforklarende så noen forklaring utover det<br />

som er gjort trengs ikke.<br />

HENDELSE FORKLARING<br />

GCEV_BLOCKED Linjen er sperret<br />

GCEV_UNBLOCKED Linjen er åpen, klar til bruk<br />

GCEV_CONNECTED Utgående samtale er besvart<br />

GCEV_ANSWERED Inngående samtale er besvart<br />

GCEV_ACCEPT Godkjenner en innkommende samtale<br />

GCEV_OFFERED Samtalen blir tilbudt applikasjonen<br />

GCEV_DICONNECTED Forbindelsen er brutt<br />

GCEV_DROPCALL Samtalen blir lagt på<br />

GCEV_TASKFAIL Hvis en oppringning har gått feil<br />

Tabell 1 Global Call hendelser, med forklaring<br />

HENDELSE FORKLARING<br />

CS_IDLE Kanalen gjør ingenting<br />

CS_PLAY Kanalen spiller lyd<br />

CS_RECD Kanalen gjør et lydopptak<br />

CS_DIAL Kanalen slår et nummer<br />

CS_GTDIG Kanalen mottar siffer<br />

CS_TONE Kanalen lager en tone<br />

CS_CALL Kanalen ringer opp<br />

CS_BLOCKED Kanalen er blokkert<br />

CS_RECVFAX Kanalen mottar en faks<br />

CS_SENDFAX Kanalen sender en faks<br />

CS_STOPD Operasjonen er avsluttet<br />

Tabell 2 Tale ressurs hendelser, med forklaring<br />

Nå som kortet er klart til å motta samtaler og å spille av lydmeldinger, kan call centeret<br />

koble samtaler til IVRen og å gi melding om hva skal gjøres med den enkelte samtale.<br />

Neste eksempel vil anta at en samtale er kommet inn og at IVR kontrolleren har fått<br />

melding om hva som skal avspilles for brukeren. Koden som følger er hentet fra notify<br />

funksjonen som blir kalt etter at variablene er lest. Programmet har alt funnet ut at det er<br />

en avspilling som skal utføres.<br />

28


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

getMsgId returnerer adressen til tabellen som inneholder alle id’ene som skal spilles av.<br />

Det første vi sjekker er om det som skal spilles av er en velkomstmelding eller<br />

pausemusikk. Meldinger av denne art legges alltid på plass 0 i tabellen, det vil heller ikke<br />

bli assosiert noen dtmf tone med disse meldings id’ene. Videre blir det spilt av like<br />

mange meldinger som tabellen er lang med tilhørende ”Tast 1 for ”, ” Tast 2 for ”<br />

meldinger. Legg merke til at ’i’ i for-løkken begynner på 1 så vi ikke spiller av en<br />

eventuell velkomstmelding to ganger. Lookup funksjonen finner riktig talekanal og spille<br />

av på. Siden kortet har 30 ISDN linjer og 30 talekanaler, har jeg mappet disse en til en.<br />

Det vil si at hvis jeg ønsker å spille av en melding på en gitt kanal er det kun en kanal<br />

som kan gjøre dette. For at brukeren av systemet skal kunne taste inn ett meny valg, må<br />

funksjonen dxGetDigits kalles. dxGetDigits må vite hvor mange siffer den skal vente på,<br />

og dette antallet ligger i getNumberOfDigits. Når brukeren tastet inn sitt svar vil<br />

funksjonen returnere og dxStop kalles. Den ”renser” opp og avslutter all tale trafikk på<br />

tale enheten slik at for eksempel dxPlay kan kalles på nytt.<br />

Når denne prosedyren er gjennomført blir web servicen til, i dette tilfelle, call centeret<br />

kalt og programmet sender med hvilken samtale kallet gjelder og hva resultatet av<br />

inntastningen var. Call centeret kan da ta en beslutning om hva som skal skje med<br />

samtalen videre. Enten er sesjonen over eller så sendes ny play melding.<br />

4.3. Grensesnitt mot callcenter<br />

4.3.1. Oversikt over protokollen<br />

Meldingene består av webservice kall. Hver melding er et kall til en webservice på<br />

tjeneren. Tjener vil i denne sammenheng si den maskin som skal utføre noe for en annen,<br />

denne rollen skifter altså maskinene på å ha. Innholdet av meldingen vil være argumenter<br />

til webservicen.<br />

4.3.2. Svarmeldinger<br />

Alle meldinger har en tilhørende kvitteringsmelding. Denne er implementert ved at<br />

enhver forespørsel til tjeneren har en return klausul som sier noe om hvordan<br />

29


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

eksekveringen gikk, for eksempel ”ok”. Ved feil under eksekvering og det returneres feil,<br />

legger IVR’en på samtalen.<br />

4.3.3. Feilhåndtering<br />

Alle meldinger må komme i par hvis de skal tolkes og forståes korrekt av IVR’en.<br />

Meldinger mottatt fra en webservice forteller hva som skal gjøres med en samtale mottatt<br />

fra telenettet, så en samtale mottatt fra telenettet uten et webservice kall har ingen<br />

mening.<br />

Hver gang en melding blir sendt fra callcentret startes en timer i callcentret. Det være seg<br />

webservice kall eller melding til telefonnettet. Timeren har funksjonen å avbryte<br />

oppkoblingsforsøket mot IVRen hvis ikke en suksessfull return fra connect fra<br />

webservice mottas eller oppkoblingsforsøket timer ut for et gitt referansenummer.<br />

Timeren vil også fungere globalt for hele samtalen. Det vil si at en kan ikke behandle en<br />

kunde i mer enn den tiden timeren tillater. Hvis denne timeren slår inn hvil callcenteret<br />

sende disconnet melding. En tilsvarende timer er også implementert på IVR siden.<br />

Under mottak av siffer, vil det også startes en timer. Hensikten med denne er og spille av<br />

valgalternativene en gang til etter 30 sekunder hvis brukeren ikke har tastet et siffer.<br />

Dette gjøres tre ganger og hvis det fortsatt ikke er mottatt noen siffer, kobles samtalen<br />

ned fra callcenteret.<br />

Feilårsaker kan være:<br />

• IVRen har ikke fler ledig telefonlinjer, maks er 30 samtidige samtaler<br />

• E-1 linjen til IVR er nede<br />

• IP nettet til IVRen er nede<br />

• IVR tjenesten har krasjet<br />

• Tilsvarende feil vil også kunne oppstå på callcenter siden<br />

4.3.4. Meldingsformat<br />

Meldingene sendes i klartekst og vil være kall på bestemte funksjoner hos tjeneren, med<br />

tilhørende argumenter.<br />

Meldinger fra Callcenter: Register, Play og Disconnect<br />

Meldinger fra IVR:Connect og return_number.<br />

30


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

4.3.5. Meldingssekvensdiagrammer<br />

Selve registreringen av call centeret på IVRen er det første som skjer. Vi ser at register er<br />

den første meldingen som sendes til IVRens web service. Lykkes ikke web servicen i å<br />

sende dette kallet videre til IVR kontrolleren ser vi at registreringen avbrytes. Lykkes den<br />

derimot, blir informasjonen som er sendt over lagret og Call centeret får true tilbake som<br />

en indikasjon på at operasjonen var vellykket. Grensesnittet mellom IVR webservice og<br />

IVR kontroller er som tidligere nevnt TCP / IP sockets.<br />

31


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Avspilling av en melding initieres egentlig av IVRen. Det er den som får melding av<br />

global call om at en samtale er mottatt. Hva de forskjellige hendelsene som sendes til<br />

IVR kontrolleren betyr er forklart i tabell 2. Til venstre for GlobalCall er det nettverket<br />

som er. Deretter sender melding om dette til call centeret (connect). Sekvensen av<br />

meldinger som følger nå er en sekvens som gjentas helt til call centeret har fått spilt av så<br />

mange meldinger den vil, det vil si til det sender disconnect. Legg merke til at play ikke<br />

kommer fra noen steder, det har bakgrunn i at jeg ikke hadde plass til CC Web client som<br />

den sendes ifra, men som altså skulle stått der.<br />

32


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Til slutt, når call centeret har latt innringeren navigere seg gjennom de menyer som skal<br />

til for at en beslutning om hvilken kundebehandler samtalen skal settes over til, sendes<br />

disconnect til IVRen. Dette er egentlig mest en formalitet, fordi IVRen selv ville ha<br />

merket hvis samtalen bare ble koblet ned av call centeret med GCEV_DICONNECTED<br />

hendelsen. Uansett gjøres det og IVR kontrolleren må, når samtalen kobles ned, rydde<br />

opp i noen tabeller og klargjøre linjen for innkommende anrop igjen. Her behøves heller<br />

ingen returverdi, fordi IVRen er selvdetekterende på grunn av hendelseshåndterene.<br />

33


4.3.6. Meldinger<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

register<br />

Sender: Callcenter<br />

Mottaker: IVR<br />

Parametre: navn datatype<br />

service_id string*<br />

url string*<br />

Returverdi: success boolean<br />

Beskrivelse: Register meldingen har til hensikt å fortelle IVR’en at noen ønsker å<br />

kommunisere med den. Hvem det er som ønsker dette er angitt i<br />

service_id. For at kommunikasjonen skal gå begge veier er det nødvendig<br />

at IVRen vet hvor den skal returnere for eksempel inntastinger fra<br />

brukeren. Dette er angitt i URL variabelen. Tjenestene som ønsker å<br />

benytte IVRen kjører register med en gang tjenesten starter. Returverdien<br />

vil være true så lenge maks antall registrerte tjenester ikke er nådd.<br />

Url parameteren er for at call centret kan endre IP, på denne måten slipper<br />

IVRen ha oversikt over alle tjenestene, som bruker IVRen, sin IP adresse.<br />

IP adressen behøves for Play_ack meldingen. Formatet er på string* slik at<br />

denne kan være vilkårlig lang, for eksempel med tanke på Ipv6.<br />

Service_id er et tekstfelt bestående av 20 tegn, og kan typisk være<br />

”Callcenter”. Alle meldinger behøver ikke nødvendighvis ha samme<br />

opphav. IVR løsningen vil derfor i fremtiden ikke bare kommunisere med<br />

med Callcenter tjenesten, men også tilby tjenester til andre plattformer.<br />

Derfor er det nødvendig med en service id, slik at riktig grensesnitt<br />

benyttes ved kommunikasjon med den andre tjenesten/ platformen. Ikke<br />

alle plattformer vil kunne motta meldinger fra en webservice og derfor er<br />

dette nødvendig.<br />

play<br />

Sender: Callcenter<br />

Mottaker: IVR<br />

Parametre: navn datatype<br />

msg_id integer[10]<br />

ref_no string*<br />

num_of_digits integer<br />

Returverdi: success boolean<br />

Beskrivelse: Play indikerer for IVR’en at noe skal spilles av for brukeren. Nøyaktig hva<br />

som skal avspilles befinner seg i msg_id tabellen. Den har en begrensing<br />

på 10 meldinger. Meldingene vil være forhåndslagret på IVR’en og<br />

utvekslig av id’er vil være hardkodet. For hver meldings id som blir funnet<br />

34


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

i tabellen, blir det før meldingen lest opp ”Tast x for” hvor x er<br />

rekkefølgen meldingen blir lest opp i. Det vil si at for meldingen som<br />

tilhører msg_id[1] vil x være ”en” osv. Dette gjelder for alle meldingsid’er<br />

bortsett fra den første meldings id’en lagret i msg_id[0]. Grunnen til dette<br />

er at man her kan legge velkommen meldinger som ikke skal være<br />

velgbare.<br />

Antall siffer som skal mottas ligger lagret i num_of_digits. Dette er<br />

nødvendig for at IVR’en skal vite hvor mange siffer den skal motta. Er det<br />

et meny valg vil denne være 1, men er det et kontonummer vil den være<br />

11.<br />

Hver melding får et referansenummer (ref_no) som er unikt for samtalen.<br />

Referansenummeret sendes med hver eneste melding slik at man lett<br />

identifiserer hvilken samtale meldingen tilhører. Nummeret består av åtte<br />

siffer og vil bli mappet mot Call Reference Number (CRN), som Global<br />

Call bibliotekene i IVR’en automatisk tilordner en samtale, i en tabell.<br />

Dette er fordi det er CRN som unikt identifiserer samtalen i IVR’en mens<br />

det er ref_no som gjør det i Callcenteret.<br />

disconnect<br />

Sender: Callcenter<br />

Mottaker: IVR<br />

Parametre: navn datatype<br />

ref_no string*<br />

Returverdi: ingen<br />

Beskrivelse: Disconnect forteller IVRen at dens jobb er slutt, kunden har fått gjort de<br />

valgene som skal til for at samtalen kan behandles videre av Callcenteret.<br />

Det som gjøres er at samtalen slettes fra koblingstabellen omtalt i connect<br />

meldingen og fra ressurstabellen. Callcenteret vil samtidig koble ned<br />

samtalen. Idet dette skjer klargjøres både linje og tale ressursen for nye<br />

samtaler.<br />

connect<br />

Sender: IVR<br />

Mottaker: Callcenter<br />

Parametre: navn datatype<br />

ref_no string*<br />

Returverdi: ingen<br />

Beskrivelse: For å hindre at IVRen får for mange henvendelser og itillegg at det ikke<br />

går an å reservere ressurser vil det bli forsøkt å koble til IVR fra PSTN<br />

35


<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

nettet først. IVRen har kun 30 linjer og det er derfor dette antallet som<br />

begrenser samtidig bruk av tjenesten.<br />

IVRen vil derfor få et innkommende anrop og hvis den har ledig kapasitet<br />

svare anropet og deretter sende connect til riktig tjeneste ved å se på anummeret.<br />

Ref_no som connect sender med er det samme som Call<br />

Reference Number (CRN), som er iden Global call tilordner en samtale.<br />

Deretter kan riktig tjeneste svare styre samtalen med play kallet slik at<br />

riktig meldinger blir spilt av.<br />

Return_number<br />

Sender: IVR<br />

Mottaker: Callcenter<br />

Parametre: navn datatype<br />

ref_no string*<br />

recieved_digits string*<br />

Returverdi: ingen<br />

Beskrivelse: Play_ack forteller Callcenteret hvilke siffer som er tastet inn av brukeren.<br />

Sifferene vil være lagret i recieved_digits og er av typen string siden antall<br />

siffer som skal returneres varierer. Sifferene vil være atskilt med komma<br />

tegn.<br />

Ref_no er som for play meldingen.<br />

36


5. Konklusjon<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

Som nevnt tidligere ble web services valgt får å gjøre tjenesten mest mulig generell og<br />

plattformfri. Tjenesten er nå implementert og fungerer bra. Ikke bare er det mange som<br />

kan koble seg til IVRen på grunn av web service grensesnittet men det er også uhyre<br />

enkelt å lage test applikasjoner. Dette er utvilsomt en stor fordel når en skal utvikle nye<br />

tjenester, noe som også har bidratt til at tjenesten er så bra som den er.<br />

En ting som er viktig å tenke på er at call centeret er brukt i denne oppgaven er bare en av<br />

mange tjenester som IVRen kan brukes til. I denne oppgaven har vi også kun sett på<br />

eksempler hvor IVRen tar imot samtaler, men det er også muligheter for å ringe ut, sette<br />

opp konferanser, og å viderekoble samtaler. Vi skjønner at her er mulighetene mange,<br />

noen av dem kan kanskje være televoting, som vil ligne på det som kjøres under Grand<br />

Prix for eksempel. Andre muligheter vil kunne være at man kan ringe nummeret til<br />

IVRen og gi penger til Redd Barna. Spørreundersøkelser vil kunne defineres på IVRen<br />

slik at den automatisk ville ringt opp gitte telefonnummer, stilt spørsmål og tatt imot svar<br />

for så deretter presentert resultatet på en webside. Andre muligheter vil kunne være å ha<br />

samme logikk på en webside som på IVRen, benytte seg av VoiceXML og deretter lest<br />

opp tale til brukeren av websiden. Brukeren kunne da for eksempel ha svart på<br />

spørsmålene med et klikkbart GUI, eller lest svaret inn i maskinens mikrofon.<br />

6. Referanseliste<br />

[1] Tore Riksaasen Telematikknett, 1995<br />

[2] The Parlay group, www.parlay.org<br />

[3] The Intel Coorporation, http://www.intel.com/network/csp/products/6038web.htm<br />

[4] International Telecomunication Union, http://www.itu.int/home/<br />

[5] The Intel Coorporation,System Release 5.1.1 for Windows Feature Pack 1 Online<br />

Bookshelf,<br />

http://resource.intel.com/telecom/support/releases/winnt/sr511fp1/onldoc/htmlfiles/in<br />

dex.html<br />

37


7. Vedlegg<br />

7.1. Bruk av CD-ROM<br />

<strong>Interaktiv</strong> <strong>taleresponstjeneste</strong><br />

1. Kopier \ivr_controller\biblioteker fra cd’en til c:\biblioteker.<br />

2. Alle kildekode ligger i *.cpp og *.h filer. Disse finnes under \ivr_controller\ og<br />

\ivrWS<br />

3. \ivr_controller\ inneholder kildekode for ivr kontrolleren og \ivrWS\ inneholder<br />

kildekode for webservicen.<br />

7.2. CD-ROM<br />

38

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!