Asterisk/Instellen

Uit Limesco Wiki
Versie door SGielen (overleg | bijdragen) op 17 jun 2012 om 08:43 (Regel bovenaan weggehaald)
Ga naar: navigatie, zoeken

Op deze pagina wordt uitgelegd hoe je je eigen Asterisk-server opzet en interconnect met Limesco/SpeakUp. Aanvullingen en wijzigingen op deze pagina zijn welkom: deze wiki is vrij wijzigbaar door leden. Eventuele twijfels of vragen kun je stellen op de Overlegpagina.

Waarschuwing: De informatie op deze pagina is nog lang niet af. Ga er nog niet vanuit dat iets op deze pagina werkt, er kunnen nog grote wijzigingen plaatsvinden terwijl de infrastructuur zich vormt.

Kom je afkortingen of woorden tegen die je niet kent? Kijk dan op de terminologie-pagina!

De infrastructuur

SpeakUp heeft de infrastructuur (via Elephant Talk, de MVNE) met het T-Mobilenetwerk zo geregeld dat alle verkeer vanaf de mobiele telefoons van SpeakUp-klanten direct uitkomt bij de PBX bij SpeakUp. Daar zal hun Asterisk-installatie controleren of er een alternatieve SIP-server is ingesteld voor het telefoonnummer in kwestie, en zo ja de SIP-verbinding doorsturen. Je Asterisk-server kan dan kiezen wat er met dat uitgaande gesprek gebeurt. De meest waarschijnlijke optie voor de meeste nummers is het gewoon weer terug doorsturen naar SpeakUp, die dan een route zal kiezen naar dat nummer. Zodra een PBX het gesprek accepteert, zal vanaf dan een RTP-stream worden opgezet tussen de servers van SpeakUp en de ontvanger (jouw server, een server bij SpeakUp, of een VoIP-eindpunt) waar de gespreksdata overheen kan gaan.

Op deze pagina wordt uitgelegd hoe je die eigen Asterisk-server opzet. We zullen ervoor zorgen dat gesprekken uitkomen op je server, en dan een regel definiëren waarmee je server alles terugstuurt naar SpeakUp (je PBX is daardoor 'transparant'). Daarna zorgen we ervoor dat ook inkomende gesprekken correct naar je telefoon terug komen. En daarna geven we wat voorbeelden van leuke dingen om te proberen :)

Asterisk installeren

Dit hangt natuurlijk af van je distro, maar ik heb dit onder Debian Testing geprobeerd met Asterisk 1:1.8.11.1~dfsg-1. De configuratiebestanden staan dan onder /etc/asterisk. De server zelf runt als de user "asterisk". Om een volledige console-log te krijgen heb ik logger.conf aangepast en daar onder [logfiles] een console-regel veranderd naar:

console => debug,notice,warning,error,verbose,dtmf,fax

Onder de meeste distro's zal Asterisk vanzelf gestart zijn; anders moet je 'm nu zelf even starten (bijvoorbeeld met service asterisk start). Nu kunnen we verbinden naar Asterisk, met een asterisk -R (bij een "unable to connect" even opnieuw proberen als de user waarmee asterisk runt, b.v. sudo -u asterisk asterisk -R, of als je het wel gelooft gewoon als root).

sjors@foo:~$ sudo asterisk -R
[...]
Connected to asterisk 1.8.11.1~dfsg-1 currently running on foo (pid = 8051)
Verbosity is at least 3
foo*CLI> core show version
Asterisk 1.8.11.1~dfsg-1 built by pbuilder @ boomtime on a x86_64 running Linux on 2012-04-25 17:59:19 UTC

Een kleine extensions-tutorial

We hebben nu een Asterisk-server runnen die nog niets doet, en waar nooit naartoe verbonden zal worden. Hier volgt eerst een kleine tutorial in dialplans, zodat we er zometeen eentje kunnen schrijven.

Waarschuwing: Terwijl ik dit schrijf ben ik hier net twee dagen mee bezig, dus de kans is groot dat ik dingen verkeerd heb begrepen. Ik schrijf dit als een best-effort om mijn huidige begrip over te brengen. Als je zeker weet dat hier iets niet klopt, verbeter het dan alsjeblieft!

Asterisk laadt bij het opstarten een "dial-plan" in het geheugen. Een dialplan is een set instructies voor een bepaald telefoonnummer (of extension), die Asterisk zal uitvoeren zodra dat telefoonnummer wordt gebeld. Iedere instructie heeft een regelnummer; Asterisk zal beginnen bij regelnummer 1 van de juiste extension en regelnummers zullen in volgorde worden afgehandeld tot het eerstvolgende regelnummer niet meer bestaat. Als een telefoongesprek tegen het einde van een set instructies niet (succesvol) is doorgeschakeld, aangenomen of geweigerd, zal Asterisk zelf de juiste foutcode proberen te raden (b.v. aan de hand van een gefaalde operatie). Er bestaat een opdracht GoTo om naar een andere extension of een ander regelnummer te springen. Dit is bijvoorbeeld een correcte set instructies om een geluidje af te spelen en op te hangen bij het nummer 300:

exten => 300,1,Answer
exten => 300,n,MP3Player(/tmp/Sad-Trombone.mp3)
exten => 300,n,Hangup

Alle regels beginnen met "exten =>" (of "exten ="); daarna volgt het telefoonnummer, daarna het regelnummer (of "n" voor next, het vorige regelnummer plus één), en daarna de instructie om uit te voeren. De instructies die je kunt gebruiken vind je (o.a.) in de console:

foo*CLI> core show applications
  -= Registered Asterisk Applications =-
    AddQueueMember: Dynamically adds queue members.
[...]
     Zapateller: Block telemarketers with SIT.
  -= 176 Applications Registered =-
foo*CLI> core show application Zapateller

  -= Info about application 'Zapateller' =- 

[Synopsis]
Block telemarketers with SIT.
[....]

Naast telefoonnummers kun je als extension ook nog patterns opgeven. Die beginnen met een underscore (_) en kunnen bepaalde characters matchen vanaf het begin (maar niet vanaf het eind). Zie voor meer informatie http://www.voip-info.org/wiki/view/Asterisk+Dialplan+Patterns.

Asterisk maakt in een extensionlijstje nooit vanzelf een sprong naar een regelnummer méér dan één hoger dan het huidige regelnummer. Dit werkt dus niet:

exten => 300,1,Answer
[...]
exten => 300,10,
exten => 300,100,HangUp

Om een sprong te maken, neem je een GoTo op (zie ook core show application goto). Dat kan direct naar een specifiek regelnummer, maar werkt wat overzichtelijker met labels:

exten => 300,1,Answer
exten => 300,n,GoTo(hangMaarOp)
exten => 300,100(hangMaarOp),HangUp

Asterisk instellen voor je mobiele nummer

SpeakUp heeft een gateway staan die de normale PLMN-signalen omzet naar SIP-signalen en vice versa. Die gateway verandert iedere mobiele telefoon in een SIP-client die verbindt naar je Asterisk-machine. Kies voor de telefoon een gebruikersnaam, wachtwoord en als je wil een intern nummer. Gebruikersnaam mag ook gelijk zijn aan een intern nummer, en je mag ook simpelweg zijn externe nummer gebruiken. De eerste telefoon bij mij had als gebruikersnaam "speakup" en als intern nummer "300", maar je mag dus ook als gebruikersnaam en intern nummer "31612345678" pakken. Pak bij interne nummers liever niet de 1xx-range: daarin zitten ook de alarmnummers (112, 144) en die zijn special-cased: ze zullen nooit uitkomen bij je PBX maar bij de alarmcentrale.

Schrijf nu in /etc/asterisk/sip.conf de volgende regels, waarbij je %GEBRUIKER% en %WACHTWOORD% en %NUMMER% uiteraard verandert:

[%NUMMER%]
  type=friend
  callerid="Mijn mobiele telefoon" <%NUMMER%> ; SIP-naam als je uitbelt
  host=dynamic ; verbindt altijd naar ons toe, want ip-adres is niet constant
  username=%GEBRUIKER%
  secret=%WACHTWOORD%
  context=default
  mailbox=%NUMMER%@default
  regcontext=default
  regexten=%NUMMER%
  insecure=invite,port
  canreinvite=yes

Herlaad nu in de Asterisk-console (zie hierboven) de SIP-configuratie: sip reload

Het daadwerkelijk instellen van de PBX voor een mobiel nummer moet SpeakUp doen. Daarvoor hebben we binnenkort een API. Die API direct toegankelijk maken voor leden staat op de actiepuntenlijst van de B.V. Zodra dit is ingesteld, komen alle oproepen vanaf de telefoon dus uit bij je SIP-server. Ze zijn alleen nog niet routeerbaar: er zijn verder nog geen interne nummers, geen mogelijke interne oproepen, en er is nog geen uplink terug naar externe nummers.

Je kunt dit wel alvast testen: zodra de PBX is ingesteld en de SIP-configuratie voor je mobiele telefoon (hierboven) is correct, kan je telefoon zich via SIP aanmelden op je server. Als je de telefoon aanzet / de eerste call maakt, zou de Asterisk-server iets moeten loggen als:

NOTICE[...]: chan_sip.c:20788 handle_response_peerpoke: Peer 'nummer' is now Reachable. (150ms / 2000ms)

Nu komen calls vanaf je telefoon uit bij je server. Asterisk heeft standaard een demo-modus, die je kunt bereiken door (zodra alles hierboven goed is ingesteld) op je mobiele telefoon 1234 te bellen. Als je alles hebt opgezet maar je krijgt "oproep geweigerd" of "reageert niet" en geen logging-informatie in Asterisk, probeer dan 0vast01234 (0827801234) te bellen. Werkt dat ook niet, ga dan naar de Troubleshooting-sectie hieronder.

De uplink via SpeakUp instellen

Om calls vanuit je PBX weer terug te routeren het netwerk op, via je mobiele telefoonnummer, gebruik je de aansluiting bij SpeakUp die je krijgt bij het activeren van je account. Hiervoor voeg je de volgende code toe aan sip.conf:

[to-speakup](!)       ; een template voor een verbinding naar speakup toe
  type=friend
  insecure=invite
  pedantic=no
  canreinvite=no
  nat=no
  port=5060
  context=default
  qualify=4000
  username=%USERNAME%
  secret=%PASSWORD%
  disallow=all
  allow=alaw
  allow=ulaw
  allow=gsm
  allow=g726

[speakup01](to-speakup) ; instantie van de template, voor server #1
  host=switch1.sip.speakup.nl

[speakup02](to-speakup) ; instantie van de template, voor server #2
  host=switch2.sip.speakup.nl

Om nu een outbound call te doen, kun je de volgende macro definiëren in extensions.conf:

[to-speakup]
exten = _X.,100,Verbose(Outbound call from [${CALLERID(num)}] to [${EXTEN}] via SpeakUp)
exten = _X.,n,Set(CALLERID(num)=316%JENUMMER%)
; exten = _X.,n,Set(CALLERID(name)=Anonymous)    ; Uncommenten voor nummeronderdrukking
exten = _X.,n,Macro(load-balancer,SIP/speakup01/${EXTEN}#SIP/speakup02/${EXTEN},,,)

De macro die in de laatste regel gebruikt wordt is hier te vinden op SpeakUp's eigen website. Voor meer informatie kun je ook kijken naar hun pagina over SIP-koppeling.

Eventuele andere uplinks kun je op een vergelijkbare manier instellen.