Scénario

1. Configuration

1.1 En entreprise

Contexte: l'entreprise utilise un serveur PBX (comme Asterisk) à l'interne et offre des comptes SIP à ses employés. Les employés se connectent avec une IP locale directement au serveur.

Configuration SFLPhone: Compte SIP avec:

  • SIP Proxy: l'IP ou le nom de domaine du serveur asterisk. Par exemple: sip.mycompany.com
  • Nom d'utilisateur: votre nom d'utilisateur asterisk (attribué par l'administrateur, le champ entre [])
  • Authorization User: votre nom d'utilisateur asterisk (attribué par l'administrateur, soit le champ entre [] ou encore l'attribut username= s'il est spécifié)
  • Password: votre mot de passe asterisk (attribué par l'administrateur)
  • Auto-register: YES
  • STUN/Use Stun: NO
  • DTMF/Send DTMF as: SIP INFO

Configuration du compte dans Asterisk (/etc/asterisk/sip.conf):

[nomduuser]
secret=motdepasse
host=dynamic
nat=no
dtmfmode=info
type=friend
canreinvite=yes

Si vous regarder dans asterisk le résultat (après un sip reload), vous devriez voir:

*CLI> sip show users
Username                   Secret           Accountcode      Def.Context      ACL  NAT
nomduuser                  motdepasse                        default          No   RFC3581

1.2 À la maison (compte)

Contexte: un utilisateur utilise le serveur d'entreprise ou encore un service de téléphonie IP (comme le serveur de sipphone). L'utilisateur est connecté sur un réseau local (petit routeur) et n'a pas une IP publique. L'utilisateur est donc en arrière d'un NAT.

Configuration interne: avec proxy et avec STUN: yes.

Configuration du serveur asterisk: nat=yes

1.3 À la maison (sans compte)

Contexte: l'utilisateur est à la maison et veut communiquer avec une adresse SIP qui est impossible de rejoindre avec un serveur d'entreprise. L'utilisateur ne veut pas recevoir d'appel, mais seulement appeler un autre utilisateur. L'utilisateur est derrière un NAT (routeur d'un réseau local).

Configuration interne: sans proxy. STUN: yes

1.4 Pour faire des tests personnel

Contexte: un utilisateur veut tester SFLphone avec un client asterisk sur le même ordinateur ou sur un réseau local.

Configuration interne: avec proxy (ip locale du serveur asterisk, par exemple: 127.0.0.1 ou 192.168.0.2). STUN: no. Le nom d'utilisateur doit être le même que le nom entre [] dans le fichier de configuration d'asterisk.

Configuration du serveur asterisk: nat=no

Compiler SFLPhone

BASEPATH=~/program

#1. common c++2 1.3.6
wget ftp://ftp.gnu.org/pub/gnu/commoncpp/commoncpp2-1.3.6.tar.gz
tar xzvf commoncpp2-1.3.6.tar.gz
cd commoncpp2-1.3.6
PROG_COMMONCPP2=$BASEPATH/commoncpp2
install -d $PROG_COMMONCPP2
./configure --prefix=$PROG_COMMONCPP2
make
#make check
make install
#beaucoup d'avertissement lors de la génération doxygen
#changement root des nouvelles librairies
su -c 'echo "$PROG_COMMONCPP2/lib" >> /etc/ld.so.conf'
export PATH=$PATH:$PROG_COMMONCPP2/bin
cd ..



#2. ccrtp-1.3.0
wget ftp://ftp.gnu.org/pub/gnu/ccrtp/ccrtp-1.3.0.tar.gz
tar xzvf ccrtp-1.3.0.tar.gz
cd ccrtp-1.3.0
PROG_CCRTP=$BASEPATH/ccrtp
install -d $PROG_CCRTP
./configure --prefix=$PROG_CCRTP
make
#make check
make install
su -c 'echo "$PROG_CCRTP/lib" >> /etc/ld.so.conf'
export PATH=$PATH:$PROG_CCRTP/bin
cd ..

#3 libosip2
wget http://ftp.gnu.org/gnu/osip/libosip2-2.2.0.tar.gz
tar xzvf libosip2-2.2.0.tar.gz
cd libosip2-2.2.0
PROG_LIBOSIP2=$BASEPATH/libosip2
install -d $PROG_LIBOSIP2
./configure --prefix=$PROG_LIBOSIP2
make
#make check
make install
su -c 'echo "$PROG_LIBOSIP2/lib" >> /etc/ld.so.conf'
su -c '/sbin/ldconfig'
cd ..

# libeXosip
wget http://savannah.nongnu.org/download/exosip/libeXosip-0.9.0.tar.gz
tar xzvf libeXosip-0.9.0.tar.gz
cd libeXosip-0.9.0
PROG_LIBEXOSIP=$BASEPATH/libexosip
install -d $PROG_LIBEXOSIP
LDFLAGS="-L$PROG_LIBOSIP2/lib" CFLAGS="-DSHOW_MESSAGE -I$PROG_LIBOSIP2/include"  ./configure --prefix=$PROG_LIBEXOSIP --disable-josua

#
# Attention, josua/jcalls.h à besoin de <mediastream.h>
#
# L'ajouter l'option '-fpermissive' au fichier josua/Makefile à la ligne CXXFLAGS = -g -O2
# ce qui donne la ligne:  CXXFLAGS = -g -O2 -fpermissive
# d'après http://forge.novell.com/pipermail/sflphone-dev/2005-January/000005.html
# ne fonctionne pas
# donc, j'ai disable la compilation de josua avec --disable-josua
# selon http://www.atosc.org/pipermail/public/osip/2004-July/004199.html
#
make 
make install

su -c 'echo "$PROG_LIBEXOSIP/lib" >> /etc/ld.so.conf'
su -c '/sbin/ldconfig'
export PATH=$PATH:$PROG_LIBEXOSIP/bin
cd ..

# SFLPhone
wget http://forge.novell.com/modules/xfcontent/private.php/sflphone/0.3/sflphone-0.3.tar.gz
tar xzvf sflphone-0.3.tar.gz
cd sflphone-0.3
PROG_SFLPHONE=$BASEPATH/sflphone
install -d $PROG_SFLPHONE
#
# Attention, il faut modifier le fichier ./configure pour
# mettre les bon répertoire CCPPDIR, CCRTPDIR, OSIPDIR, EXOSIPDIR
# $BASEPATH/nom_lib
#
# Il faut modifier la ligne
# dir=`is_in_path include/ccrtp/rtp.h ${CLASSIC_DIRS}:$CCDIR -p`
# par
# dir=`is_in_path include/ccrtp/rtp.h ${CLASSIC_DIRS}:$CCRTPDIR -p`
#
./configure -prefix $PROG_SFLPHONE

# 
# Attention, il faut modifier la ligne du fichier src/Makefile
# INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include -I../gsm
# par 
# INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOSIPDIR)/include -I/usr/include -I../gsm

# Pour les librairies qui ne sont pas dans le répertoire standart, j'ai aussi modifié la variable LIBS
# LIBS=-L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `$(CCPPDIR)/bin/ccgnu2-config --flags --stdlibs`
# par
# LIBS=-L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound  -L$(CCRTPDIR)/lib -L$(OSIPDIR)/lib -L$(EXOSIPDIR)/lib -L$(CCPPDIR)/bin/ccgnu2-config --flags --stdlibs`

make
make install

Gaffes de compilation

J'avais oublié de recharger le cache de ldconfig pour la compilation de libeXosip et sflphone, donc j'avais fait des liens symboliques vers /usr/lib des librairies de libosip2. À ne pas faire... Il suffit de faire un /sbin/ldconfig en root pour arranger le tout et utiliser les includes dans les options de configuration (-I/path/of/lib) lors du processus de liaison (linking).

Si on s'en aperçoit après la compilation des .cpp, il faut faire un make clean, et refaire la compilation pour éviter des problèmes sérieux de dépendances.

De plus, je n'avais pas lu le README du logiciel sflphone avant de compiler eXosip, qui recommande d'enlever la compilation de josua. Mais au moins, je l'ai trouvé.

Compiler sflphone sur debian à partir du CVS

1. Obtenir les outils nécessaires (en root)
   # apt-get install libcommoncpp2-dev libccrtp-dev libxml2-dev libosip2-dev libexosip2-dev
   # apt-get install cvs ssh
   # apt-get install make autoconf automake1.9 pkg-config
   # apt-get install gcc g++ libstdc++6-4.0-dev 
   Pour la partie QT
     NE PAS INSTALLER # apt-get install xorg-dev (mode texte) CAR IL DÉSINSTALLE GDM!!!
     # apt-get install libqt3-mt-dev 
     
2. Obtenir le source avec cvs
   $ mkdir project && cd project
   $ export CVS_RSH=ssh 
   $ cvs -z3 -d:ext:anonymous@forgecvs1.novell.com:/cvsroot/sflphone co sflphone
3. Compiler
   $ cd sflphone
   $ make -f Makefile.cvs
   $ ./configure    (ou ./configure --enable-debug=full)
4. Batîr
   $ make
5. Essayer
   $ cd src
   $ ./sflphoned
   (dans un autre terminal)
   $ netcat 127.0.0.1 3999
     version a
     getevents s
     stop me

If you get: 
- configure: error: no acceptable C compiler found in $PATH
  # apt-get install gcc
- checking for C compiler default output file name... configure: error: C compiler cannot create executables
  # apt-get install libstdc++6-4.0-dev
- Apparently on your system our assumption sizeof size_t == sizeof unsigned long does not apply.
  # apt-get install g++
- *** The pkg-config script could not be found. Make sure it is
  *** in your path, or set the PKG_CONFIG environment variable
  *** to the full path to pkg-config.
  # apt-get install pkg-config
- /usr/include/cc++2/cc++/pointer.h:55: error: invalid function declaration
  /usr/include/ccrtp/queuebase.h:158: error: expected ';' before '<' token
  /usr/include/ccrtp/queuebase.h: In member function 'ost::PayloadType ost::AppDat aUnit::getType() const':
  Modifier /usr/include/cc++2/cc++/pointer.h et ajouter les lignes avant le namespace
#ifndef CCXX_MISSING_H_
#include <cc++/missing.h>
#endif
  

Qui parle de sflphone?

Logiciel/Software...

Individus/Individuals...