Yet Another Telephony Engine and sip client

Introduction

De nos jours, il n'est pas facile de trouver un client sofphone pour Linux, en effet certains sont en voie de disparition et d'autres sont trop importants pour que l'on puisse les compiler sur notre machine.

J'ai trouvé yate qui n'est pas récent, mais qui devrait faire l'affaire, mais pas sans difficultés, d'où, cette page.

Compilation

Exécuter les opérations suivantes:

diff -Naur yate.orig/engine/Mutex.cpp yate/engine/Mutex.cpp
--- yate.orig/engine/Mutex.cpp	2017-08-01 15:34:32.000000000 +0200
+++ yate/engine/Mutex.cpp	2018-02-28 19:15:18.756118973 +0100
@@ -36,7 +36,11 @@
 extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind);
 #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
 #else
-extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind) __THROW;
+// HQ workaround to compile on void linux
+extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind);
+#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
+
+//extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind) __THROW;
 #endif
 }
 #endif
diff -Naur yate.orig/libs/yrtp/session.cpp yate/libs/yrtp/session.cpp
--- yate.orig/libs/yrtp/session.cpp	2017-03-28 11:13:43.000000000 +0200
+++ yate/libs/yrtp/session.cpp	2018-02-28 19:15:59.800116070 +0100
@@ -148,7 +148,15 @@
     u_int32_t ss = ((u_int32_t)pc[8] << 24) | ((u_int32_t)pc[9] << 16) |
 	((u_int32_t)pc[10] << 8) | pc[11];
 
-    // skip over header and any CSRC
+    /* HQ hack */
+    if ( ts - m_tsLast > 480 ){
+       m_tsLast = ts - 160;
+       if (m_dejitter)
+          m_dejitter->clear();
+       Debug(DebugInfo,"HQ RTP rtpData HACK ts %u, m_ts %u, m_tsLast %u", ts, m_ts, m_tsLast  );
+    }
+
+   // skip over header and any CSRC
     pc += 12+(4*cc);
     len -= 12+(4*cc);
     // check if extension is present and skip it

Compilation et installation:

cd yate
./configure -prefix=/usr
make
sudo make install

Configuration

Après compilation le client sofphone yate-qt4 est installé dans /usr/bin, et une entrée est créée dans le menu Applications. On peut donc lancer l'application en ligne de commande ou par le menu. Le principe, au départ, est de configurer un compte sip dans le menu Settings/Accounts c'est à dire d'y rentrer les paramètres d'un compte sip existant quelque part chez un fournisseur. Comme j'ai un PBX Asterisk qui tourne sur un Raspberri pi, j'utilise un compte sip déclaré sur cette machine avec un compte sip, c'est celui que j'ai rentré dans yate.

Settings/Accounts

Une fois le compte rentré dans yate-qt4, celui ci s'enregistre sur le serveur, normalement sans problème. Le premier test à faire c'est l'echo test. Après appel d'un numéro, ici 699, on reçoit un message vocal expliquant le test et invitant à parler et en retour s'entendre dans les haut parleurs, lorsque cela fonctionne bien.

Noter la case domain de l'image. Si elle n'est pas remplie, le client s'enregistre la première fois, mais les informations ne sont pas sauvegardées dans ~/.yate ou on ne peut pas les relire. Encore un bug !

Alors que ceci fonctionne correctement avec d'autres sofphones, ça ne fonctionne pas avec yate. Et tout semble normal, les paquets RTP sont transmis. Autres symptômes sur un essai de communication:

 appel d'un poste à partir de yate-qt4
   l'appelé entend bien
   l'appelant n'entend pas
 appel de yate-qt4 à partir d'un autre poste OK
   l'appelé entend bien
   l'appelant entend aussi

Un autre essai avec un compte sip sip.linphone.org voir [2]. fonctionne correctement, ce qui rassure un peu et encourage à investiger.

Dans la console d' Asterisk, il est possible d' activer des traces et comme RTP semble être concerné, on active la trace de rtcp qui est le controle de RTP.

rtcp set debug on

En cours du test d'echo on voit appaitre ce genre de message, indiquant des paquets perdus. Il ne reste plus qu'à trouver un paramètre qui joue sur ce défaut

...
Packets lost so far: 755
...

Dans la version 14.6.0 d'Asterisk, le defaut est supprimé en modifiant la variable strictrtp=no dans le fichier /etc/asterisk/rtp.conf.

Dans la version 11 d'Asterisk, la modification de la variable strictrtp dans le fichier /etc/asterisk/rtp.conf ne change rien. Par contre, dans le fichier de configuration de yate /etc/yate/yrtpchan.conf, la variable suivante permet de mettre à 0 les paquets perdus. Et dans ces conditions, le test fonctionne.

; buffer: int: Maximum buffer size - used to fragment octet (G.711) audio streams
;buffer=240
buffer=128

Problème RTP

Dans la première configuration suivante, on retrouve le problème décrit précédemment, c'est à dire, l'appelé entend bien, l'appelant n'entend pas, dans le cas d'un appel à partir de yate-qt4. Dans les mêmes conditions, Les autres softphones (twinkle, baresip) fonctionnent.

Les paquets RTP du début de la mise en communication, émis par Asterisk sont transmis à la carte son, mais les paquets émis par pap2t, à travers Asterisk, ne le sont pas. Ceci est du à un manque de continuité dans la variable timestamp des paquets RTP. Le patch tente de rétablir la continuité.

  yate-qt4 <-----> Asterisk PBX <-----> Linksys Pap2t  <-----> telephone analogique
  yate-qt4 <-----> Asterisk PBX <-----> yate-qt4

Après le patch, la configuration yate-qt4 à yate-qt4, à travers Asterisk, fonctionne.

Notez, cependant, que ce patch n'est qu'un palliatif permettant le fonctionnement dans cette configuration. Les mainteneurs sont, cordialement, invités à regarder le problème.

Autres softphone

références

  1. Code source de yate chez yate.ro.
  2. Free SIP service.
  3. Baresip is a modular SIP User-Agent with audio and video support.
  4. twinkle SIP softphone.