Artisan Numérique

/système/réseau/voip/sip/asterisk/ Automatisez votre VoIP avec le démon Linphone

Il existe de nombreux clients SIP dans le libre mais Linphone, outre son aspect multi-plateforme, dispose d'une caractéristique peu commune et très mal documentée, sa déclinaison en tant que service exploitable tant par des scripts sur un serveur, que sur un poste de travail pour une parfaite intégration à un bureau minimaliste.

Lancement du démon

Pour l'installation, il vous suffit de sélectionne le paquet linphone-nox (nox voulant souvent dire "version sans interface graphique" sur debian). Et si vous ne voulez pas vous prendre trop la tête à configurer le client, prenez aussi GUI linphone.

Ceci fait vous devez disposer de trois commandes linphone3 (l'interface graphique), linphonec (le démon) et linphonecsh (le client du démon).

Pour commencer, lancez la version graphique pour régler le client. Vous allez pouvoir ainsi facilement créer votre compte SIP, sélectionner les cartes son à utiliser comme micro, écouteurs et pour la sonnerie, etc. Ensuite testez pour vérifier que vous recevez bien les appels et que vous pouvez en passer. Pour info, la configuration sera stockée dans un simple fichier texte ~/.linphonerc.

Lorsque vous êtes certain que tout fonctionne, quittez le client graphique, ouvrez une console, et lancez le démon en avant plan pour tester :

$ linphonec -c ~/.linphonerc
Ready
Warning: video is disabled in linphonec, use -V or -C or -D to enable.
linphonec>$
lancement du démon linphonec

Nous voilà face à une console un peu comme celle d'asterisk qui nous permet d'envoyer toutes les commandes nécessaires à l'usage du sip. Pour passer un appel :

linphone>call 0102030405
Contacting <sip:0102030405@asterisk>
Remote ringing
linphone>$
commandes simples

Et pour terminer la communication :

linphone>terminate
Call ended
linphone>$
commandes simples

Pour obtenir la liste des commandes et leur description, tapez help, il y en a beaucoup. Les plus importantes sont :

  • call un_numero pour appeler;
  • terminate pour clore un appel;
  • answer pour répondre à un appel;
  • quit pour arrêter le client SIP;
  • mute/unmute pour couper le micro (et le rallumer).

Et des moins utiles au jour le jour mais néanmoins intéressantes :

  • record pour enregistrer une conversation (spécial paranoïaques ;-):
  • play pour lire un fichier wav à votre correspondant (attente musicale, etc):
  • speak pour parler au correspondant avec un synthétiseur vocal (il faut qu'espeak soit installé).

Comme vous le voyez les possibles ne manquent pas.

Client du démon

Tout cela est bien mignon mais on aimerait bien que notre démon se démonise et travaille en arrière plan. Pour commencer tapez quit pour sortir de linphonecr car c'est maintenant l'heure d'utiliser linphonecsh

gastonlinphonecsh init -c ~/.linphonerc
lancement du démon linphonec

Comme vous le voyez nous ne lançons pas le démon de manière directe mais confions cette tâche au client linphonecsh avec la commande init auquel nous fournissons notre configuration (paramètre -c).

Si vous êtes curieux, et que vous regardez ce qui est réellement lancé par un ps -edaf | grep linphone, vous constaterez la présence d'un paramètre non documenté --pipe. En effet, pour communiquer avec ses clients, ce démon va créer dans le dossier tmp un tube nommé linphone-UID où UID est votre identifiant utilisateur. Ainsi toute la magie de linphonecsh se résumera en réalité à faire des echo commande | /tmp/linphone-1234.

Là c'est pour le test, mais à terme il faudra lancer cette commande à chaque démarrage de sessions. Personnellement j'ai opté pour l'ajout de lancement de ce démon dans mon ~/.xinitrc.

Pour attaquer le démon, c'est strictement comme tout à l'heure mais en passant cette fois par la commande linphonecsh et sa commande generic

gastonlinphonecsh generic "call 1234564"
gastonlinphonecsh generic "terminate"
lancement de commandes via le client

Petite astuce elle aussi non documentée, il arrive que l'on ait affaire à des saletés de serveurs vocaux qui demandent à presser telle ou telle touche pour enfin parler à un humain. C'est faisable très simplement par linphonecsh generic 1 qui va envoyer le code DTMF 1.

Statut du démon

Depuis quelque temps déjà, j'expérimente le principe du "toutes mes données dans un fichier texte". Cela inclus mon agenda, mes tâches, le suivi de mon temps, mes notes, mais aussi mon carnet d'adresse. Il serait donc sympa lorsque quelqu'un m'appelle que je puisse voir apparaître son nom plutôt que son numéro de téléphone. C'est faisable par la commande très mal documentée status hook qui renvoie selon les situations les valeurs suivantes :

  • offhook - non connecté.
  • Dialing - le démon compose un numéro.
  • Rien du tout (c'est à dire aucun résultat) - ça sonne.
  • Call out, hook=0102030405 duration=28, muted=no rtp-xmit-muted=no - Un appel émis est en cours. On le destinataire et la durée ce qui est sympa pour l'injecter dans du time tracking.
  • Incoming call from "33123456454" <sip:33123456454@asterisk> - Quelqu'un nous appel, on a son numéro pour chercher son nom.
  • hook=answered duration=3 - On a décroché un appel, la durée est indiquée mais malheureusement par le numéro de l'appelant.

Il devient dés lors très simple de faire un petit script qui va aller pooler le "status hook" et afficher par exemple dans la barre de statut le nom de l'appelant ou la durée d'un appel.

Conclusion

Comme vous le voyez, il est possible tout faire ou presque avec Linphone, et de manière bien plus rapide qu'avec Ekiga/Dbus (quant ça marche...). A titre d'exemple, dans mon installation j'ai intégré ce client de la manière suivante :

  • Les noms des appelants sont affiché par le script de la barre de status (WMFS).
  • Une script python qui me liste des numéros correspondant à un paramètre, me permet d'en choisir un et passe l'appel.
  • Le décrochage et le raccrochage de la ligne mappé sur une touche du clavier (via WMFS).
  • Un alias vers linphonecsh generic pour rapidement envoyer des commandes comme les codes DTMF ou l'enregistrement des conversations (bien plus pratique que de prendre des notes !!)