---
# System prepended metadata

title: TP de téléphonie

---

# TP de téléphonie
## Installation d'asterisk

### Récupérer asterisk 

wget @ip ou svn <checkout | update | info | status>

mkdir -p /usr/src/asterisk
cd /usr/src/asterisk
su


## Commande Asterisk 

En étant root:

asterisk -rvvvvvv  \\ Pour accéder au CLI du serveur asterisk

? \\ Liste les commande

reload \\ Recharge la conf

pjsip show endpoints \\ Montre les abbonnés Pjsip

## Exemple de Config PJSIP.conf et extensions.conf

pjsip.conf:

    

    ;Template commun pour les endpoints
    [endpoint-template](!)
    type=endpoint
    context = default
    disallow=all
    allow=ulaw
    transport=udptrans

    ;Template commun pour les authentifications
    [auth-template](!)
    type=auth
    auth_type=userpass

    ;Template commun pour les aors
    [aor-template](!)
    type=aor
    max_contacts=1

    [2000](endpoint-template)
    auth=auth2000
    aors=2000

    [2001](endpoint-template)
    auth=auth2001
    aors=2001

    [2002](endpoint-template)
    auth=auth2002
    aors=2002

    [auth2000](auth-template)
    username=2000
    password=2000

    [auth2001](auth-template)
    username=2001
    password=2001

    [auth2002](auth-template)
    username=2002
    password=2002

    [2000](aor-template)
    [2001](aor-template)
    [2002](aor-template)

extension.conf:

    exten => _200[0-7],Dial(PJSIP/200${EXTEN:7}) , déclaration des numéros interne

    exten => 15,1,NoOp(Appel vers le Samu)
    same => n,Dial(PJSIP/${EXTEN}@mon_trunk)
    same => n,Hangup()


## Paramétrage Tel Thomson
config poste sip via navigateur 
192.168.21.44/admin/html

mdp admin: 784518

id: administrator


## Faire une Interception
Pour paramétré les interceptions il faute attribué des Call group et des Pickup group au différents endpoints dans le pjsip.conf:

    [6001]
    Call_group=1
    Pickup_group=1

    [6002]
    Call_group=1

Dans cette configuration 6001 peut intercepté 6002 mais pas l'inverse.

Il faut aussi dé-commenter la variable pickupexten dans features.conf.
## BVI
Pour paramétrer une boite Vocal il faut:
* Déclarer les numéros dans un contexte dans le fichier Voicemail.conf au format => "num => mdp, nom, email, email pager, options" 
***
* Il faut ensuite ajouté le voicemail au numéros paramétré dans extensions.conf: exten => 2000,1,Dial(PJSIP/2000)
    same => n,VoiceMail(2000@default,u)
    same=> n,Hangup()
    exten => 2001,1,Dial(PJSIP/2001)
    same => n,VoiceMail(2001@default,u)
    same=> n,Hangup()
*Dans la déclaration de la boite vocale @default correspond au context déclaré dans Voicemail.conf*
***
* Pour finir il faut définir un numéro de contact pour que les utilisateurs puisse contacter la boite vocal: 
exten => 7000,1,VoiceMailMain(${CALLERID(num)}@default)
*Dans cette configuration les utilisateur devrons appelé 7000 pour écouter leurs messages*

## Faire un groupement
Les groupements d'appels peuvent être configurer dans extensions.conf ou être déclaré sous forme de file d'attente dans queues.conf.

**Avec extensions.conf:**
Faire sonner les deux téléphone en même temps:
exten => 30,1,Dial(PJSIP/2000&PJISP/2001)
same => n,Hangup()

Faire sonner les numéros chacun leurs tours:
exten => 100,1,Dial(PJSIP/2000,15) ; Appelle 2000 pendant 15 secondes
same => n,Dial(PJSIP/2001,15)      ; Si 2000 ne répond pas, appelle 2001
same => n,Dial(PJSIP/2002,15)      ; Si 2001 ne répond pas, appelle 2002
same => n,Hangup()

Boucle d'appel qui fait sonner différents numéros en boucle chacun leurs tour pendant un nombre de tours définie:

exten => 3000,1,NoOp(Boucle pour le groupement 3000 soit 2000 et 2001)
same => n,Set(LOOPCOUNT=0)
same => n(LOOPSTART),GotoIf($[${LOOPCOUNT} > 5]?hangup)
same => n,Dial(PJSIP/2000,15)
same => n,Dial(PJSIP/2001,15)
same => n,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1])
same => n,Goto(LOOPSTART)

***

**Avec queues.conf:**

Déclaration d'une file d'attente:

[general]
persistentmembers = yes       ; Sauvegarde les membres dynamiques dans un fichier
autofill = yes                ; Distribue les appels à plusieurs agents simultanément
updatecdr = no                ; Ne pas mettre à jour les CDR avec les détails de la file

[my_queue]                    ; Nom de la file d'attente
musicclass = default          ; Musique en attente (définie dans musiconhold.conf)
strategy = rrmemory           ; Stratégie de distribution (Round-Robin avec mémoire)
timeout = 15                  ; Temps d'attente maximum pour un agent avant de passer au suivant
retry = 5                     ; Temps d'attente avant de rappeler un agent après un échec
maxlen = 5                    ; Nombre maximal d'appels en attente
joinempty = yes               ; Autorise les appels même si aucun agent n'est disponible
leavewhenempty = no           ; Garde les appels en attente même si aucun agent n'est disponible
ringinuse = no                ; Ne sonne pas les agents déjà en communication
announce = queue-thankyou     ; Annonce à jouer avant de joindre un agent
periodic-announce = queue-periodic-announce ; Annonce périodique
periodic-announce-frequency = 30 ; Intervalle en secondes pour l'annonce périodique
memberdelay = 0               ; Délai avant de joindre un agent après l'annonce

; Membres statiques (agents fixes)
member => PJSIP/2000          ; Ajoute l'agent 2000 à la file
member => PJSIP/2001          ; Ajoute l'agent 2001 à la file
***
Différent paramètre pour la strategy:
ringall : Tous les agents sonnent en même temps.
rrmemory : Appelle les agents en boucle, en reprenant à l'agent suivant après chaque appel.
rrordered : Appelle les agents en boucle, mais toujours dans le même ordre.
leastrecent : Appelle l'agent qui n'a pas pris d'appel depuis le plus longtemps.
fewestcalls : Appelle l'agent ayant pris le moins d'appels.
random : Appelle un agent au hasard.
***
Ajout de la file d'attente dans extentions.conf:

exten => 100,1,Answer()                    ; Répond à l'appel
same => n,Queue(my_queue)                  ; Place l'appelant dans la file "my_queue"
same => n,Hangup()                         ; Termine l'appel si la file est vide



## Heures d'ouverture

exten => 600,1,GotoIfTime(11:00-11:50,mon-fri,*,*?open,s,1) ; Renvoie vers le context open si les condition sont remplie
same => n,Goto(closed,s,1) ;Renvoie vers le context Closed si les conditions précédentes ne sont pas valides

[open]
exten => s,1,Dial(PJSIP/6001,20)
same => Hangup()

[closed]
exten => s,1,agi(googletts.agi,"L'entreprise est fermé pour le moment",fr,any)
same => n,MusicOnHold(pers1) ;Le profil pers1 est à définir dans le fichier MusicOnHold.conf
same => n,Hangup()

## SVI
- Installation des dépendances de player mpg
*apt-get install perl libwww-perl sox mpg123*
- Installation de l’application googletts (script pour mettre en place la
synthèse vocale)
*/var/lib/asterisk/agi-bin/ ou /usr/share/asterisk/agi-bin/* 
- Selon le type d’installation (manuelle premier cas ou automatique par apt-get
install asterisk)
*wget https://raw.github.com/zaf/asterisk-googletts/master/googletts.agi*
- chmod +x googletts.agi ; "permet de rendre l’application exécutable par asterisk"
***
Paramétrage d'une SVI dans extensions.conf:
exten => 500,1,Answer()
same => n,agi(googletts.agi,"Salut !",fr,any)
same =>n,agi(googletts.agi,"Je vais bientot te répondre.",fr,any)
same =>n,agi(googletts.agi,"appuie sur 1 pour joindre le 6001",fr,any)
same =>n,agi(googletts.agi,"appuie sur 2 pour joindre le 6002",fr,any)
same => n,agi(googletts.agi,"Faite votre choix",fr,any)
same =>n,WaitExten(10)

exten => 1,1, Goto(6001,1)
exten => 2,1,Goto(6002,1)

exten =>_[3-8#],1,Goto(500,5)
exten => t,1,Goto(500,5)
exten => i,1,Goto(500,5)

## Musique d'attente
Exemple de config d'un profil de musique:

dans MusicOnHold.conf

[default]
mode=files

directory=moh
Set(CHANNEL(musicclass)=pers1)

[pers1]

mode=files
directory=/var/lib/asterisk/moh/pers1
sort=random