A propos | Laboratoire | Voisinage | Meilleurs articles | Nous aider | Forums

Panoramisk / Le druide de la VoIP 

Appel général en interphonie

Il peut s’avérer utile, dans certains cas, de pouvoir émettre un message vocale sur un ensemble de poste téléphonique en mode interphonie. Ce mode, appelé également intercom, est présent sur la plupart des téléphones SIP du marché et autorise la réception d’un appel sans avoir à décrocher; il peut donc s’apparenter à l’interphone souvent utilisé dans la relation patron-secrétaire.

Nous vous proposons dans cet article de construire un appel général1 en se basant sur le mode intercom de nos téléphones d’une part et du module de conférence intégré dans Asterisk. La solution détaillée ici est inspirée d’articles disponibles sur le net, mais propose une approche un peu différente, elle utilise un Asterisk 1.4.

L’intercom

Tout d’abord, un appel en mode intercom implique que le poste appelé ne nécessite pas d’être décroché. L’implémentation n’est pas normalisée dans SIP mais se base souvent sur la présence d’une en-tête spécifique dans le message de mise en relation (SIP INVITE). Lorsque le téléphone est configuré pour accepter cette en-tête2, il est alors capable de décrocher sans intervention humaine. L’appel intercom peut être annoncé à l’utilisateur par une sonnerie particulière, afin de capter son attention et en règle générale le micro est automatiquement coupé pour éviter les écoutes sauvage de l’environnement de l’utilisateur (cf Bug volontaire dans des téléphones IP ?).

Chaque téléphone utilisant malheureusement un message spécifique, il sera nécessaire d’adapter l’appel intercom en fonction de celui-ci mais surtout d’identifier auprès du constructeur de l’équipement quel est ce message.

Le pont de conférence

Un des outils intégré à Asterisk et à haute valeur ajoutée est le pont de conférence, l’application se nomme MeetMe. Cette application permet de mettre en correspondance plusieurs téléphones et de mixer l’ensemble des voix audio.

Le principe retenu dans notre application d’appel général est de mettre en relation le poste appelant et l’ensemble des postes appelés au sein d’un salle de conférence. L’appelant sera le seul à pouvoir parler (mode talk) et les autres postes en intercom seront tous en mode écoute seulement (mode listen).

Le principe

La solution retenue est basée sur une salle de conférence dédiée à cet usage (ici la 99), s’il on souhaitait construire plusieurs groupe d’intercom il serait nécessaire de construire plusieurs salles.

L’appel initié par la personne qui souhaite s’adresser au groupe d’intercom exécute tout d’abord un AGI avant d’être dirigé vers la salle de conférence. Le rôle de l’AGI est de joindre l’ensemble des participants à la conférence avec la particularité que ceux-ci sont en mode intercom donc n’ont pas besoin de répondre. L’appel doit être automatisé car le nombre de participants est multiple, on utilise pour ce faire le gestionnaire d’appel automatique via la création de fichier .call positionné dans le répertoire outgoing.
La conférence est protégée par un code, permettant de restreindre son accès, en revanche, les postes appelés en intercom entrent dans la salle sans entrer de code, celui-ci est donc passé en paramètre à la commande MeetMe().

Les sources

La salle de conférence

; for intercom
conf => 99,1234 

La salle est ici protégée par un code et définie dans meetme.conf.

Gestion de l’appelant

Nous avons affecté une extension particulière dans notre plan d’appel pour l’accès à cet appel de groupe intercom, ici il s’agit du 635. Dans notre fichier extensions.conf nous avons donc:

exten => 635,1,Goto(meet-talker,s,1)

Le contexte meet-talker est spécialement construit à cet effet afin de pouvoir traiter le raccroché de l’appelant. En effet, lorsque ce dernier terminera son appel, l’ensemble des postes en intercom resteront dans la salle de conférence, il sera alors nécessaire de vider celle-ci.

[meet-talker]
exten => s,1,AGI(push_to_meetintercom,SIP/15,SIP/30)
exten => s,2,Answer()
exten => s,3,MeetMe(99,tq)
exten => h,1,MeetMeAdmin(99,K) 

Ici, nous faisons tout d’abord appel à notre AGI en lui précisant la liste des postes à joindre en mode intercom. Ensuite l’appelant est dirigé dans la salle 99, en mode “talk” et “quiet”, ainsi, il n’aura pas de voie retour et aucun message de service.

Le raccroché est géré dans l’extension h, la commande MeetMeAdmin avec l’option K permet de vider la salle de l’ensemble des participants.

Le script AGI de préparation des appels intercom

Ce script est écrit en Perl, aucun outil particulier n’est nécessaire en dehors de l’interpréteur. Voici son contenu détaillé par portion:

#!/usr/bin/perl                                                                                                                       

my $outgoingDir  = '/var/spool/asterisk/outgoing';

my %sipHeadersIntercom = (
  "Aastra 5xi" => "Alert-Info: info=alert-autoanswer",
  "Polycom"    => "Alert-Info: Auto Answer",
                          );

my %phones = (
          "SIP/15" => {
              sip => $sipHeadersIntercom{"Polycom"},
              wait => 1,
          },
          "SIP/30" => {
              sip => $sipHeadersIntercom{"Aastra 5xi"},
              wait => 1,
          }
          );
 


Nous commençons par définir la liste des messages spécifiques à ajouter lors du message d’INVITE SIP pour mettre le poste en mode décrochage automatique (intercom). Chaque constructeur ayant une syntaxe particulière, il est important de détailler l’ensemble des postes de son installation, ici, un Polycom IP301 et un Aastra 53i.

La seconde table de hachage détaille l’ensemble des postes de l’installation et relie chacun d’eux sur un type de poste de la première liste et une variable wait qui permet de temporiser l’appel de ces postes3.

foreach my $exten (@ARGV) {
    createCall($exten);
}

sub createCall {
    my ($exten) = @_;
    my $id = $exten;
    $id =~ s/\///g;
    my $file = "$outgoingDir/$$-$id";
    open(CALL, ">>$file" );

    print CALL << "EOF";
Channel: Local/start@meet-and-page
MaxRetries: 1
Retry: 0
RetryTime: 1
Context: meet-and-page
Extension: call
Priority: 1
SetVar: TOCALL=$exten
SetVar: HEADER=$phones{$exten}->{sip}
SetVar: WAIT=$phones{$exten}->{wait}
EOF
;
    close(CALL);
}

Ensuite on traite l’ensemble des définitions de poste passé en paramètre lors de l’appel de l’AGI4, de façon itérative.

La fonction createCall construit le fichier .call qui va mettre en relation l’extension spécifique du plan d’appel: start dans le contexte meet-and-page, celle-ci décrochant automatiquement. L’autre extrémité à mettre en relation est le poste spécifié dans la variable TOCALL. Celui-ci sera appelé dans le plan d’appel (contexte meet-and-page et extension call) après positionnement de la variable SIP positionnée ici dans HEADER.

Chaque fichier ainsi crée va être interprété par Asterisk et entrer automatiquement dans le plan d’appel, d’abord en traitant la partie Channel puis après le décrochage en l’aboutant à la seconde partie Context/Extension.

Appel du poste en mode intercom

Il ne nous reste plus qu’à traiter le appels en provenance des fichiers .call, le plan d’appel est parfait pour cette manipulation:

[meet-and-page]
exten => start,1,Answer()
exten => start,n,MeetMe(99,mql,1234)
exten => start,n,Hangup

exten => call,1,SIPAddHeader(${HEADER})
exten => call,2,Wait(${WAIT})
exten => call,3,Dial(${TOCALL},2)
exten => call,4,Hangup() 

La partie start de ce contexte correspond à la salle de conférence, elle doit décrocher automatiquement afin de provoquer l’aboutement de la seconde partie.

La partie call correspond à la seconde patte de l’aboutement et pointe donc vers le poste à mettre en mode intercom. Il est donc nécessaire de positionner l’en-tête constructeur (ici dans la variable HEADER) puis de l’appeler classiquement avec l’application Dial().

Conclusion

Voilà une approche simplifié d’un mécanisme d’appel de groupe en mode intercom. Il sera nécessaire de l’adapter à votre besoin spécifique et surtout à chacun de vos téléphones SIP. Mais cette approche est pragmatique et efficace, de plus elle n’utilise que des composants standard d’Asterisk qui une fois de plus prouve son ouverture à des situations particulières.


  1. vers un groupe de poste défini []
  2. certains postes le sont par défaut, d’autres nécessite une modification de configuration []
  3. nous avons remarqué que si nous allons trop vite, certains postes ne passent pas en mode intercom []
  4. on pourra choisir d’autre approche de type base de données pour des installations plus importantes []
Posté par: Alexandre Chauvin-Hameau, le 11/09/2007
Trackback | Popularité: 32%
marqué , , , et
AddThis Social Bookmark Button
UselessNothing newInformativeLearned a lotAmazingly helpful (1 votes, average: 5 out of 5)
Loading ... Loading ...

Voir aussi

Et pourquoi pas

Laisser un commentaire En discuter dans le forum

© 2009 Panoramisk | Creative Commons License wordpress logo