WebRTC and the question of interoperability with SIP

De Ensiwiki
Révision de 8 juin 2016 à 07:46 par Rousfran (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
WebRTC and the question of interoperability with SIP
Projet Projet de spécialité 2A 2013
Thème Information & Communications
Étudiants Guy SEKA (TEL)
Benoit LE QUEAU (TEL)
Mouhcine MENDIL (TEL)
Ornella ANNICCHIARICO (TEL)
Date 21 Mai - 19 Juin 2013
Tuteur Olivier ALPHAND


Introduction

Autour de webRTC

WebRTC est une API javascript. Elle permet de développer des applications de communication en temps réel et de très bonne qualité.
les applications developpées avec webRTC (pages HTML) ne nécessitent aucune installation de plugins. L'architecture de WebRTC repose sur 3 API :

  • MediaStream: donne l'accès aux ressources media ( camera, microphone du PC)
  • RTCPeerconnection: permet d'établir les appels audios et vidéos
  • RTCDatachannel: permet de transférer des données en peer to peer (text, fichier...)


Archi.png


Comme le montre l'architecture de webRTC sur la figure ci-dessus, on peut constater que webRTC se charge du transport (SRTP) et formattage (codecs audio, video) des paquets media et n'implémente pas la gestion de la signalisation.
Ainsi webRTC se limite au plan media tandis que la partie signalisation est gérée par le protocole SIP(session Initiate Protocol)tout au long de cette page.


Le protocole SIP nécessite la connaissance de la SDP du client pour construire les paquets SIP. Cette SDP est fournie par webRTC.
Il existe plusieurs API qui implémentent la partie signalisation pour webRTC, parmi lesquelles on peut citer:

  • jsSIP
  • sipML5

Ces technologies (sipML5,jsSIP) ont besoin d'une infrastructure appropriée reposant sur des serveurs SIP (proxy SIP, registrar, etc...). Dans ce document, nous avons choisi de présenter un exemple de SIP serveur ici Asterisk du fait de sa facilité de configuration , et son large eventail de services (proxy; registrar; voiceMail, conférence; WebSocket serveur, etc...)

Les slides de la soutenance de ce projet, présentant théorie et résultats sont disponibles via la commande :

 wget https://ensiwiki.ensimag.fr/images/6/62/Soutenance_webrtc.pdf

Installation pas à pas d'Asterisk

Important: ce tutoriel a été réalisé pour la version 11.2.2 d’Asterisk. Ce n’est pas la version la plus récente de ce logiciel (actuellement 11.4.0) mais c’est la dernière version permettant d’appliquer le patch fourni par l’équipe Doubango Telecom pour Sipml5.

Note sur ce document : le but est de décrire toutes les étapes de l’installation sans pour autant expliciter le fonctionnement de chaque paramètre. Pour en savoir plus, consultez les sources listées en fin de document. Elles sont rangées par ordre d’importance.

Fonctionnalités: cette version permettra de:

  • avoir Asterisk sur une machine virtuelle ou un boot dédié
  • assurer la compatibilité entre Asterisk et WebRTC
  • créer des utilisateurs compatibles WebrRTC, conférence audio et de notifier leur présence

Prérequis :

  • un .iso d’Ubuntu Ensilinux 20121001
  • Chrome (fonctionne bien en WebRTC sur Windows, Mac et Linux)

Remarque: Firefox Nightly inclut aussi WebRTC mais n'est pas fonctionnel pour cette application.

1.Installation de la machine virtuelle

Type de la machine : Ubuntu 64 bit 12.04 à jour

Librairies requises :

sudo su
apt-get install libsrtp0-dev libsrtp0 libgtk-3-dev libsqlite3-dev sqlite3 libncursesw5-devel libxml2-dev openssl libssl-dev

À propos du réseau: si vous utilisez une machine virtuelle, optez pour l’option de réseau ponté. La machine virtuelle sera ainsi dans le même sous-réseau que toutes les autre entités. Cela simplifie grandement la configuration réseau.

ex. dans VirtualBox clic-droit sur la machine virtuelle “configuration” onglet “réseau”

Votre environnement est maintenant prêt à recevoir Asterisk.

2.Installation de base d’Asterisk

sudo su
cd /usr/src/
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.2.2.tar.gz
tar -zxvf asterisk-11.2.2.tar.gz
cd asterisk-11.2.2
./configure

Cette étape vérifie que tout est présent dans votre machine pour l’installation

make
make install
make config
make samples

À cette étape Asterisk est installé et accessible.

Attention: À l'avenir, lors de nouvelles compilations d'Asterisk, ne plus faire le make sample sinon les fichiers de configurations seront écrasés.

L’étape suivante installe un menu interactif permettant d’activer des modules supplémentaires. Toujours dans /usr/src/asterisk-11.2.2:

make menuselect

Relancer la même commande en prenant soin de redimensionner la fenêtre de votre console pour qu’elle soit suffisamment grande (cf. l’erreur lancée dans le cas contraire).

Une fois dans le menu, allez à Resources modules et vérifiez que res_srtp est bien coché.

3.Lancement d’Asterisk

Depuis n’importe quel répertoire, pourvu que vous soyez sur votre compte root, Asterisk se lance avec la commande:

asterisk

Vous pouvez accéder à la console d’Asterisk avec la commande:

asterisk -r
Les commandes sont listées grâce à :
core show help

Chargez le module srtp dans Asterisk:

asterisk -r
module load srtp

Ultime vérification: dans la console d’Asterisk, entrez:

module show

Vérifiez que le module res_srtp se trouve bien dans le liste retournée. Si ce n’est pas le cas, référez vous à l’annexe “Installation du module SRTP” de ce document.

4.Activation de WebRTC

Asterisk embarque une serveur Http simple qu’il faut activer comme suit :

sudo su
cd /etc/asterisk/

Note: tous les fichiers de configuration sont dans ce répertoire.

gedit http.conf &

Dans le fichier qui s’ouvre les changements suivant sont à effectuer : (dans certains cas, il s’agit de décommenter en supprimant le “;” en début de ligne.

[general]
enabled=yes
bindport=8088
bindadress= <mettez l’adresse IP de votre machine>

Pour qu’Asterisk prenne en compte ces modifications, rendez vous dans la console d’Asterisk et entrez : core reload

Test du serveur Websocket: ouvrez Firefox Nightly ou Chrome ou Chromium et allez à cette adresse :

http:// <l’adresse IP de bindadress> : <bindport> /ws

Vous devriez voir une erreur de WebSocket avec un “null” sur la page. C’est tout à fait normal et montre que l’activation a réussi.

Si ce n’est pas le cas: rendez vous dans la console d’Asterisk et affichez la liste des modules (voir ci-dessus) et vérifiez que res_http_websocket est bien présent.

5.Utilisateurs compatibles WebRTC

Pour ajouter des utilisateurs compatibles webRTC, se référer à la partie [Ajout d'utilisateurs].

6.Prise en charge de la vidéo

WebRTC supporte actuellement uniquement le codec VP8. Or, ce codec est absent d'Asterisk. Il existe deux méthodes pour pallier ce problème :

  1. patcher Asterisk avec un codec expérimental pour la prise en charge de VP8
  2. installer la solution de doubango Telecom incluant webrtc2sip : contient le RTCWeb Breaker et la Media Encoder qui agissent comme un B2BUA pour faire du transcoding entre Asterisk et la page web

Cette seconde solution n'est pas traitée ici. L'installation de l'application de Doubango serait indispensable mais restrictive et conditionnerait l'installation. Pour plus d'information voici le lien du site officiel : https://code.google.com/p/webrtc2sip/wiki/Building_Source_v2_0 Nous nous attardons ici sur la première solution.

Patch VP8

Deux solutions de patch on été trouvées :

  1. sur le site de Doubango : changement d'un fichier de patch d'Asterisk r106 : https://code.google.com/p/sipml5/source/detail?r=106
  2. en appliquant cette commande :
wget https://raw.github.com/AutoStatic/asterisk-vp8/master\
/asterisk_11_vp8_passthrough_support.patch
patch -p1 -i asterisk_11_vp8_passthrough_support.patch

Il faut ensuite relancer :

./configure

Et recompiler Asterisk.

Attention : Il s'agit en fait du même patch, il est recommandé d'appliquer la commande ci-dessus. Cependant, ce patch est expérimental. C'est pourquoi les résultats ne sont pas garantis.

Annexe 1 : Installation du module SRTP

N’appliquez ce tutoriel uniquement si vous avez des problèmes à l’ajout du module res_srtp dans Asterisk !

  1. Allez dans le répertoire des fichiers .c :
    /usr/src/asterisk/res/
  2. Compilez le fichier res_srtp.c avec la commande suivante:
    gcc -shared res_srtp.c -o res_srtp.so -lsrtp [-fPIC si le système est en 64 bits]
  3. Copiez ensuite le fichier compilé dans le répertoire des modules d’Asterisk :
    cp res_srtp.so /usr/lib/asterisk/modules
  4. Lancez Asterisk:
     asterisk
  5. Lancer la console Asterisk:
    asterisk -r
  6. Exécutez :
    module load res_srtp
  7. Avec la commande module show, vous devriez voir le module res_srtp.so

Annexe 2 : Désinstallation d’Asterisk

sudo su
cd /usr/src/asterisk-11.2.2/
make distclean
make clean
./configure
make uninstall

Asterisk est alors désinstallé. Cependant, le dossier de fichiers de configurations est encore présent à /etc/asterisk/ ainsi que d’autres fichiers moins visibles. Si vous souhaitez vraiment supprimer toute votre installation, exécutez :

make uninstall-all

Ajout d'utilisateurs

Si vous avez fini l'installation d'Asterisk, vous êtes fin prêts à ajouter des utilisateurs.

Les étapes sont les suivantes :
1. Déclaration d'un utilisateur
2. Modification du DialPlan
3. Relance d'Asterisk

Il existe deux types d'utilisateurs :

  • Les utilisateurs SIP/WebRTC
  • Les téléphones SIP

Utilisateurs SIP/WebRTC

Les utilisateurs SIP/WebRTC sont destinés à communiquer à partir d'une page web. L'ajout se fait en deux étapes :

Déclarer l'utilisateur

Ouvrez le fichier : /etc/asterisk/sip.conf. A la fin du fichier, vous pouvez déclarer un utilisateur de la manière suivante :

;; Configuration générale
[user_name];Nom de l'utilisateur
context=user_context;Context pour le DialPlan
type=friend;Permet d'avoir une communication en double sens
host=dynamic;Obtenir une adresse IP dynamique en DHCP
secret=user_password;Pour s'identifier sur Asterisk
callerid=user_name <user_number>;Nom affiché lors d'un appel + numero de téléphone
disallow=all ; Désactive tous les codecs
allow=alaw ; Active le codec alaw
allow=ulaw ; Active le codec ulaw
icesupport=yes
directmedia=no
;; Configuration pour WebRTC
transport=udp,wss,ws;Permet d'utiliser du websocket et de l'udp pour le transport 
avpf=yes;Active l'utilisation de l'AVPF/SAVPF + l'acceptation du media stream
encryption=yes;Active l'encryption media

Note : Tout ce qui vient après le ';' est considéré comme commentaire et n'est pas pris en compte par Asterisk.

En WebRTC, les messages SIP sont encapsulés par websocket. Donc :

transport=wss,ws

WebRTC nécessite aussi l'utilisation de SRTP, par conséquent :

avpf=yes
encryption=yes

Modifier le DialPlan

Ouvrez le fichier /etc/asterisk/extensions.conf et ajoutez à la suite:

[user_contexte] ;remplacer par le nom de contexte choisi dans l'étape précédente 
exten => user_num,1,Dial(SIP/user_name,15)
exten => user_num,n,Hangup

Nous avons ainsi spécifié l'extension associée au numéro "user_num", c'est à dire la suite d'action que déclenche l'appel du numéro "user_num". Ici, nous avons déclaré qu'en premier lieu (priorité 1), l'action à exécuter est d'appeler user_name (qui a le numéro user_num). Si user_name ne répond pas après 15 secondes, on passe à l'étape suivante qui est de raccrocher.

Note : La priorité n signifie next. On aurait également pu mettre 2 à la place de n dans l'exemple précendant.

Téléphones SIP

Si par contre on veut communiquer à partir d'un téléphone SIP (ou de manière équivalente un softphone), la configuration est la suivante :

Déclarer le téléphone

Comme pour un utilisateur SIP/WebRTC, ouvrez le fichier : /etc/asterisk/sip.conf. A la fin du fichier, vous pouvez déclarer un téléphone de la manière suivante :

;; Configuration générale
[user_name];Nom de l'utilisateur
context=user_context;Context pour le DialPlan
type=friend;Permet d'avoir une communication en double sens
host=dynamic;Obtenir une adresse IP dynamique en DHCP
secret=user_password;Pour s'identifier sur Asterisk
callerid=user_name <user_number>;Nom affiché lors d'un appel + numero de téléphone
disallow=all; Désactive tous les codecs
allow=alaw; Active le codec alaw
allow=ulaw; Active le codec ulaw
icesupport=yes
directmedia=no
;; Configuration pour téléphone
transport=udp; Permet d'utiliser l'udp pour le transport 
avpf=no
encryption=no

La configuration générale est commune aux deux types d'utilisateurs. Le changement à effectuer concerne les attributs avpf et encryption qu'il faut désactiver.

Modifier le DialPlan

Même procédure que pour un utilisateur SIP.

Relance d'asterisk

Pour qu'Asterisk prenne en compte ces modifications, exécutez dans la console d'Asterisk:

sip reload
dialplan reload

Pour faire communiquer cet utilisateur, créez maintenant un autre utilisateur en réitérant ces étapes avec les informations le concernant.
Attention, il est important que les deux utilisateurs soient dans le même contexte afin qu'ils puissent communiquer entre-eux. Il faut donc que les champs context des deux utilisateurs soient les mêmes et simplement ajouter la nouvelle extension à la suite du contexte nouvellement créé dans le fichier extensions.conf.

Pour visualiser les utilisateurs pris en compte dans Asterisk ainsi que leur contexte, exécutez la commande:

sip show users

Pour tester

1. Théorie sur l'architecture

Les instructions précédentes vous ont permis d'installer Asterisk et ses configurations. Il manque la page contenant notre application utilisant WebRTC.

Ajout de la HTML5 webapp

Une page HTML incluant une application sipML5 peut être hébergée de deux manières :

  • sur le serveur http interne à asterisk
  • sur un serveur tomcat ou (apache)

Dans cette partie on décrira le déploiement basée sur la première solution.

Notre application

Voici la commande à entrer pour récupérer nos sources : Fichier:SrcWebRTC SIP.tar.gz

wget https://ensiwiki.ensimag.fr/images/f/f6/SrcWebRTC_SIP.tar.gz 

Suivez ensuite le tutoriel ci-dessous pour que ces fichiers soient déployés dans Asterisk.

Deploiement sur le serveur HTTP d'Asterisk

  • Tout d'abord allez dans le dossier
sudo su
cd /etc/asterisk/
gedit http.conf &
  • décommentez la ligne :
 enablestatic=yes 
  • redémarrez asterisk à partir de la console d'asterisk
 core restart now 
  • Dès lors, vous pouvez déposer toutes vos pages html dans le dossier
 /var/lib/asterisk/static-http/

Pour contacter la page, il faudra donc rentrer le modèle d'adresse suivant:

http://<bindaddr>:<bindport>/static/<votre_page>

Fonctionnalités avancées

Le présentiel

Si vous souhaitez connaître l'état de l'un de vos contacts, vous êtes au bon endroit !
Dans le répertoire /etc/asterisk, ouvrez le fichier extensions.conf et ajoutez dans le bon context:

 exten => name_or_num,hint,SIP/user_name 

Cette extension permet d'indiquer quel utilisateur est mappé avec le name_or_num demandé dans SUBSCRIBE.

Audioconférence

Pour communiquer en audioconférence, il faut fixer un point de rendez-vous pour les utilisateurs : C'est ce que l'on appelle conference room.

La conference room nécessite l’utilisation d’un des deux modules suivants :

  • ConfBridge : pour accéder à l’application ConfBridge() dans le dialplan.
  • MeetMe : pour accéder à l’application MeetMe() dans le dialplan.

Après l’installation du module (cf annexe pour plus de détails sur l'installation), l’ajout d’une room se fait en deux étapes :

  • Ajout de la configuration de la room (numéro, pin user, pin admin) dans le fichier meetme.conf (ou confbridge.conf selon le module installé) :
[room] 
conf => room_num,user_pass,admin_pass 
  • Ajout de l’extension associée dans le dial plan (extensions.conf) :
 exten => room_num,1,MeetMe(room_num); ou exten => room_num,1,ConfBridge(room_num) 

Note 1 : Les utilisateurs destinés à utiliser la conference room doivent être présent dans le context de la room.

SMS

Pour pouvoir envoyer et recevoir des messages instantanés, effectuez les ajouts suivants :

  • Dans sip.conf ajoutez à la configuration de l'utilisateur concerné ce qui suit :
accept_outofcall_message=yes 
outofcall_message_context=smsContext 
  • Ouvrez extensions.conf et créez le context suivant :
[smsContext]
exten => _.,1,NoOp(SMS receiving dialplan invoked)
exten => _.,n,NoOp(To ${MESSAGE(to)})
exten => _.,n,NoOp(From ${MESSAGE(from)})
exten => _.,n,NoOp(Body ${MESSAGE(body)})
exten => _.,n,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)})
exten => _.,n,MessageSend(${ACTUALTO},${MESSAGE(from)})
exten => _.,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})
exten => _.,n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg)
exten => _.,n,Hangup() 
;
; Gestion d'erreurs
exten => _.,n(sendfailedmsg),Set(MESSAGE(body)="[${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}] Your message to ${EXTEN} has failed. Retry later.")
exten => _.,n,Set(ME_1=${CUT(MESSAGE(from),<,2)})
exten => _.,n,Set(ACTUALFROM=${CUT(ME_1,@,1)})
exten => _.,n,MessageSend(${ACTUALFROM},ServiceCenter)
exten => _.,n,Hangup()
exten => _.,n,Hangup()

Annexe 1 : Installation du module de conférence

Placez vous dans le répertoire asterisk :

cd /usr/src/asterisk 

Ensuite, lancez le menu :

./configure
make menuselect 

Dans le menu qui apparaît, cochez le module MeetMe (ou ConfBridge) et sauvegardez vos changements.

Puis :

make
make install

Vérifiez que le module a bien été ajouté avec la commande suivante :

Asterisk*CLI> core show applications

Fichiers de capture et slides

Bibliographie

Installation d'Asterisk

Ajout d'utilisateurs

Conférence

Vidéo

SMS