PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU
PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU
PROSJEKTOPPGAVE Interaktiv taleresponstjeneste ... - NTNU
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