Cours:Asterisk
From Wiki
Contents |
Architecture
Clients SIP
Editer le fichier sip.conf pour ajouter la description des deux SIP-phones afin de leur permettre d’émettre et de recevoir des appels.
File: sip.conf
[general] context=default allowoverlap=no bindport=5060 bindaddr=0.0.0.0 tcpenable=no tcpbindaddr=0.0.0.0 srvlookup=yes disallow=all allow=ulaw [1000]type=frienddefaultuser=1000secret=torototocontext=localcontexthost=dynamic [1001]type=frienddefaultuser=1001secret=torototocontext=localcontexthost=dynamic
Services
Objectif : décrocher, répéter «1» et raccrocher lorsque le premier SIP-phone contacte Asterisk quelle que soit sa demande.
File: extensions.conf
[general] static=yes writeprotect=no autofallthrough=yes clearglobalvars=no priorityjuymping=no [localcontext]exten => _.,1,Answer()exten => _.,2,Wait(1)exten => _.,3,PlayBack(digits/1)exten => _.,4,HangUp()
Objectif : Permettre une communication téléphonique entre les deux SIP-phones.
File: extensions.conf
[general] static=yes writeprotect=no autofallthrough=yes clearglobalvars=no priorityjuymping=no [localcontext]exten => _1XXX,1,Dial(SIP/${EXTEN})exten => _1XXX,2,HangUp()
Observer les échanges réseau réalisés pour chaque client et pour le serveur Asterisk. Observer les échanges protocolaires SIP.
Voicemail
Objectif : Fournir une messagerie aux clients.
File: extensions.conf
[general]
static=yes
writeprotect=no
autofallthrough=yes
clearglobalvars=no
priorityjuymping=no
[localcontext]
exten => _1XXX,1,Dial(SIP/${EXTEN},20)
exten => _1XXX,2,VoiceMail(${EXTEN}@local_mb) exten => _1XXX,3,PlayBack(vm-goodbye)exten => _1XXX,4,HangUp()
exten => 888,1,VoicemailMain(${CALLERID(num)}@local_mb)exten => 888,2,HangUp()File: sip.conf
[1000] type=friend defaultuser=1000 secret=torototo context=localcontext host=dynamic mailbox=1000@local_mb [1001] type=friend defaultuser=1001 secret=torototo context=localcontext host=dynamic mailbox=1001@local_mb
File: voicemail.conf
[general] format=wav49|gsm|wav serveremail=asterisk attach=yes skipms=3000 maxsilence=10 silencethreshold=128 maxlogins=3 emaildateformat=%A, %B %d, %Y at %r sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside [zonemessages] eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours' military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p' european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM [local_mb]1000 => 1234,flo,flo@localhost1001 => 1234,david,david@polymorf.fr
Horloge parlante
Objectif : Fournir un numéro spécial pour l'horloge parlante.
File: extensions.conf
exten => 123,1,Answer() exten => 123,2,SayUnixTime(,Europe/Paris,AdBY kM) exten => 123,3,HangUp()
Suivi d'appels
Objectif : Mise en place d'une facturation via suivit d'appels.
File: cdr.conf
[general] enable=yes [csv] usegmtime=yes loguniqueid=yes loguserfield=yes
tail /var/log/asterisk/cdr-csv/Master.csv "","1000","1001","localcontext","""David"" <1000>","SIP/1000-00000000","","Hangup","","2010-03-16 10:17:30","2010-03-16 10:17:30","2010-03-16 10:17:44",14,14,"ANSWERED","DOCUMENTATION","1268734650.0",""
Conférences téléphoniques
Objectif : Avoir un numéro spécial pour la salle de conférence téléphonique.
File: extensions.conf
exten => 234,1,Answer() exten => 234,2,ConfBridge(1,scM,1234) exten => 234,3,HangUp()
File: meetme.conf
[rooms] conf => 1,1234,4567
Transfert d'appel
Objectif : Permettre le transfert d'appel entre clients, et vers un espace parking.
File: extensions.conf
[localcontext] include => parkedcallsexten => _1XXX,1,Dial(SIP/${EXTEN},20,tT)[...]
File: features.conf
[general] parkext => 700 ; What extension to dial to park (all parking lots) parkpos => 701-720 ; What extensions to park calls on. (defafult parking lot) context => parkedcalls ; Which context parked calls are in (default parking lot)
Dans ce scénario, lorsque A appel B, celui-ci décroche et peut :
- Placer A en attente dans un parking-lot (700..720) ;
- Placer A en attente de C ; dans ce cas, B transfert A vers C et :
- Se retrouve en communication avec C pour lui indiqué que A souhaite lui parler ; lorsque C valide, B met B et C en liaison.
Filtrage dans les extensions
Il s'agit de filtrer les extensions en fonction du callerID. L'utilisation de jokers (* ou ?) est aussi possible avec "_"
File: extensions.conf
exten => 123,1,Answer() exten => 123/1000,2,SayUnixTime(,Europe/Paris,kM)exten => 123/1001,2,SayUnixTime(,Europe/Paris,AdBY)exten => 123/1002,2,SayUnixTime(,Europe/Paris,AdBY kM)exten => 123,3,HangUp()
Standard téléphonique
Il s'agit ici de proposer à l'appelant (dans notre cas, lorsqu'il compose un numéro invalide) un fichier son de menu : typiquement, "tapez 1 pour avoir la date, 2 pour avoir l'heure, et 3 pour rejoindre l'audio-conférence". En fonction des chiffres entrés par l'utilisateur, des redirections vers les bon labels sont fait (GotoIf). Le parcours des valeurs possibles se fait de façon séquentielle côté serveur : lorsque l'appelant entre 3, il passe en réalité dans le cas "false" de 1, puis "false" de 2 etc.
File: extensions.conf
[...]
[localcontext]
include => parkedcalls
exten => _1XXX,1,Dial(SIP/${EXTEN},20,tT)
exten => _1XXX,2,VoiceMail(${EXTEN}@local_mb)
exten => _1XXX,3,PlayBack(vm-goodbye)
exten => _1XXX,4,HangUp()
exten => 888,1,VoicemailMain(${CALLERID(num)}@local_mb)
exten => 888,2,HangUp()
exten => _.,1,Answer()exten => _.,2,Goto(localcontext,666,1)
exten => 666,1,Read(dig,/usr/share/asterisk/sounds/menu,1)exten => 666,2,GotoIf($["${dig}" = "1"]?menucontext,123,1 : 3)exten => 666,3,GotoIf($["${dig}" = "2"]?menucontext,321,1 : 4)exten => 666,4,GotoIf($["${dig}" = "3"]?menucontext,234,1 : 1)exten => i,1,Goto(666,1)
[menucontext]exten => 123,1,SayUnixTime(,Europe/Paris,AdBY)exten => 123,2,HangUp()
exten => 321,1,SayUnixTime(,Europe/Paris,kM)exten => 321,2,HangUp()
exten => 234,1,ConfBridge(1,scM,1234)exten => 234,2,HangUp()Architecture VoIP distribuée
Cette deuxième architecture vise à déployer un réseau plus réaliste. Dans cet exercice, le serveur Asterisk n’est plus directement joignable par tous les équipements de téléphonie IP. De plus, nous supposons l'existence de plusieurs sites distincts possédant chacun leur IP-PBX.
Enregistrement des serveurs SIP entre eux
Sur la machine asterisk1 :
File: sip.conf
[...] register => asterisk1@10.0.2.1 [asterisk2] type=friend defaultuser=asterisk2 secret= context=fromasterisk2 host=dynamic [...]
Mise à jour du plan de numérotation distant
Pour permettre aux appels de sortir, sur la machine asterisk1 :
File: extensions.conf
[localcontext]
include => parkedcalls
exten => _1XXX,1,Dial(SIP/${EXTEN},20,tT)
exten => _1XXX,2,VoiceMail(${EXTEN}@local_mb)
exten => _1XXX,3,PlayBack(vm-goodbye)
exten => _1XXX,4,HangUp()
exten => _2XXX,1,Dial(IAX2/asterisk2/${EXTEN},20,tT)Et pour les recevoir, sur la machine asterisk2 :
File: sip.conf
[asterisk1]
type=friend
defaultuser=asterisk1
secret=
context=fromasterisk1host=dynamicFile: extensions.conf
[fromasterisk1]include => parkedcalls
exten => _2XXX,1,Dial(SIP/${EXTEN},20,tT)
exten => _2XXX,2,VoiceMail(${EXTEN}@local_mb)
exten => _2XXX,3,PlayBack(vm-goodbye)
exten => _2XXX,4,HangUp()Interconnexion via IAX avec SIP en fallback
IAX (Inter-Asterisk eXchange protocol) a été conçu à l'origine pour permettre les communications (voix et contrôle) entre serveurs Asterisk. La version actuelle est IAX2 (désignée IAX dans la suite). Toutefois, aujourd'hui sa portée s'étend aussi aux clients compatibles. IAX a été dès le début pensé pour permettre le transport de la voix, du contrôle même s'il permet le transport d'autres types de données. Il est de fait optimisé pour minimiser la bande passante nécessaire aux appels (via des mécanismes de Trunk ou l'emploi d'un protocole binaire au lieu du textuel SIP), permettre l'échange d'informations de plans de numérotation et surtout limiter les problèmes liés au NAT et aux pare-feux (en utilisant un seul port UDP pour toute les informations, en lieu et place d'un port pour SIP, d'un port pour RTP...). Actuellement, IAX reste un protocole propriétaire mais il a été soumis à l'IETF en vue d'une "standardisation".
File: iax.conf
[general] bandwidth=low disallow=lpc10 jitterbuffer=no forcejitterbuffer=no autokill=yes register => asterisk2:torototo@10.0.1.1 [asterisk1] type=friend defaultuser=asterisk1 secret=torototo auth=plaintext context=fromasterisk1 host=dynamic
File: extensions.conf
[...]
exten => _1XXX,1,Dial(IAX2/asterisk1/${EXTEN},20,tT)[...]Trunking
Il suffit de rajouter trunk=yes dans le contexte affecté par la communication IAX.
Fallback SIP
Modifier extensions.conf de la façon suivante :
File: extensions.conf
exten => _1XXX,1,Dial(IAX2/asterisk1/${EXTEN},20,tT)
exten => _1XXX,2,Dial(SIP/asterisk1/${EXTEN},20,tT)QoS
Marquage SIP
Modifier sip.conf de la façon suivante :
File: sip.conf
[general] context=default allowoverlap=no bindport=5060 bindaddr=0.0.0.0 tcpenable=no tcpbindaddr=0.0.0.0 srvlookup=yes disallow=all allow=ulaw tos_sip=cs3 tos_audio=ef
Marquage IAX
File: iax.conf
[general]
bandwidth=low
disallow=lpc10
jitterbuffer=no
forcejitterbuffer=no
autokill=yes
tos=efregister => asterisk2:torototo@10.0.1.1
[asterisk1]
type=friend
defaultuser=asterisk1
secret=torototo
auth=plaintext
context=fromasterisk1
host=dynamicConfiguration des Cisco
File: running-config
[.......] class-map match-all VOICE match protocol rtp ! ! policy-map COMPRESS class VOICE compress header ip rtp ! interface FastEthernet0/0 ip address 10.0.0.1 255.255.255.0 service-policy output COMPRESS duplex auto speed auto ! interface FastEthernet0/1 ip address 10.0.2.254 255.255.255.0 duplex auto speed auto ! router ospf 1 router-id 10.0.0.1 log-adjacency-changes network 10.0.1.0 0.0.0.255 area 0 network 10.0.0.0 0.0.255.255 area 0 ! [....]
- Les paquets sont bien dans la classe de service
rt-voip#show policy-map interface fa0/0
FastEthernet0/0
Service-policy output: COMPRESS
Class-map: VOICE (match-all)
434 packets, 92876 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: protocol rtp
compress:
header ip rtp
Class-map: class-default (match-any)
93 packets, 11856 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: any- Malgré cela dans la capture Wireshark nous n'avons pas vu de compression d'entête.

