Rapport de projet fin d étude Client VoIP/SIP RATP Encadré par : Sébastien LERICHE Laurent BERNARD Yves PREMEL-CABIC Alaeddine MESBAHI Shuting WANG
Contenu 1. Contexte... 4 2. Expression des besoins... 4 a. Besoins utilisateurs... 5 b. Propositions de mise en œuvre... 5 3. Choix d un système d exploitation mobile... 5 4. Client SIP... 6 5. Propositions d'interfaces graphiques... 11 6. Interactions SIP entre client et serveur... 14 7. Architecture technique et fonctionnelle... 15 a. Appel SIP... 16 b. Ajout d un compte... 17 c. Java Native Interface:... 18 d. PJSIP:... 18 e. Caractéristique technique de PJSIP :... 18 f. PJSUA & PJSIP-JNI :... 19 g. Une architecture en couche :... 20 8. Diagramme de séquence... 21 9. Spécifications techniques... 26 a. Appel SIP... 26 i. Création d un vue... 26 ii. La classe principale «HandiDialer.java»... 27 iii. Intégration la classe «HandiDialer.java» au «SipHome.java»... 29 b. Comptes... 30 i. Gestion automatique des comptes au démarrage de l application... 30 ii. Ajouter d un compte... 30 iii. Résolution DNS... 31 10. Tests... 32 a. Environnement de test... 32 b. Test qualité de la voix... 33 c. Test communication avec adresse IP... 33 d. Test avec résolution DNS... 34 e. Téléchargement et installation de l application... 34
11. Planning prévisionnel d'implémentation... 35 12. Conclusion... 37
1. Contexte La RATP souhaite mettre à la disposition de ses usagers à mobilité réduite des outils leur facilitant l utilisation du réseau ferré d île de France. Dans le cadre de cette politique de modernisation, une mission étudie la faisabilité de la mise en place d un service permettant à une personne à mobilité réduite d établir une communication vocale rapidement et simplement avec un agent de la RATP pour qu il puisse lui venir en aide. Cette communication sera établie à partir du téléphone mobile de l usager à travers le réseau sans fil déployé au sein de la station RATP et par conséquent sans passer par le réseau GSM/3G d un opérateur. Ce service a pour vocation d être proposé sur des smartphones supportant l installation d applications tierces, comme l iphone d Apple ou les terminaux utilisant l OS libre Android de Google, et nécessitera la mise en œuvre de différentes technologies gravitant autour de la voix sur IP. La solution sans fil ciblée dans cette étude est la technologie WiFi. 2. Expression des besoins Le but du projet est développer une application mobile d interphonie sur IOS ou Android au-dessus d une couche WIFI. Description globale du besoin : Choix d un système d exploitation mobile Choix d un client SIP open source existant sur cet OS Développement d une application «Interphone» à partir ce client Tests de l application sur des serveurs de VoIP (OpenSIPS, Asterisk) Optionnel : Implémentation de la partie serveur en se basant sur des briques SIP libres (OpenSIPS/Asterisk) Utilisateurs : Equipe projet RATP
a. Besoins utilisateurs Ce chapitre décrit les besoins utilisateurs concernant l application Client SIP. BU-1 Mise en place une interface graphique L application doit avoir une interface graphique d accueil, qui a deux fonctions principales : Appel et Raccroche. BU-2 Fonction Initialisation L application doit avoir une fonction d initialisation, qui permet de configure et initialiser logiciel. BU-3 Fonction Ajout un compte L application doit avoir une fonction d ajouter un compte SIP, le nom d utilisateur, le Domain et le mot de passe. BU-4 Fonction Appel L application doit avoir une fonction d appeler qui permet de réaliser une communication vocale. BU-5 Fonction Raccroche L application doit avoir une fonction d raccrocher qui permet de terminer la communication vocale. BU-6 Fonction Destruction L application doit avoir une fonction de purger l espace utilisée. b. Propositions de mise en œuvre Ce scénario consiste à fournir une solution aux besoins utilisateurs cités ci-dessus. On traitera les parties suivantes : Interactions SIP entre client et serveur Choix d un système d exploitation mobile Interface proposée Choix d un client SIP open source existant sur cet OS La description du fonctionnement globale de l application 3. Choix d un système d exploitation mobile Dans cette partie, nous allons comparer les deux systèmes d exploitation mobiles Android et IOS. IPhone ios L environnement de développement pour l iphone est Xcode. Iphone est basé sur le système MAC OS ou UNIX, il n est donc pas compatible avec Windows. Le développement d applications pour iphone OS se fait avec Objective C, une extension du langage C, orienté objet et réflexif.
Andoid Le développement d applications pour Android se fait en Java. Java est un puissant langage orienté objet, utilisé très largement dans le monde du développement. Le développement d applications Android est possible aussi bien sur Eclipse, que sur Apache Ant ou JDK. C est pourquoi le développement d applications Android est possible aussi bien sur Windows que sur Linux ou Mac. Après la comparaison, nous avons choisi Android comme support d application. 4. Client SIP Plusieurs clients SIP sur android ont été comparés sur plusieurs aspects, le but de cette étude comparative est de choisir le client open-source qui correspond aux besoins du projet, et qui permettra d avoir une bonne assise pour la suite du projet. IMSDroid IMSDroid est le premier client open-source IMS pour les plateformes android. Le but principal de ce projet basé sur la plateforme doubango est de proposer un client IMS complet à la communauté open-source. Doubango est un projet expérimental open-source pour les framework 3GPP IMS/LTE à la fois pour les systèmes embarqué (Android, Windws Mobile, Symbian, iphone, ) et les postes de travail (Windows XP/Vista/7, MAC OS X, GNU Linux, ). L implémentation SIP est basée sur le RFC 3261 et 3GPP TS 24.229 Rel-9, ce qui le rend compatible avec tous les SIP registrar. Le projet offre un nombre très impressionnant de fonctionnalités orienté IMS :
SIP (RFC 3261, 3GPP TS 24.229 Rel-9) IMS-AKA (RFC 3310, 3GPP TS 33.203, 35.205, 35.206, 35.207, 35.208 and 35.909) Private extension headers for 3GPP IPv4/IPv6 dual stack UDP, TCP, TLS and SCTP Service-Route Discovery (RFC 3608) Proxy-CSCF discovery using DHCPv4/v6 or/and DNS NAPTR SigComp (RFC 3320, 3485, 4077, 4464, 4465, 4896, 5049, 5112 and 1951) IPSec Security Agreement (RFC 3329) NAT Traversal (STUN, TURN and ICE) Preconditions (RFC 3312, 4032 and 5027) SMS over IP (3GPP TS 23.038, 24.040, 24.011, 24.341 and 24.451) ENUM (RFC 3761) The tel URI for Telephone Numbers (RFC 3966) SIP SIMPLE (Presence Subscription/Publication and Pager Mode IM) MMTel (UNI) SDP (RFC 3264) RTP/RTCP XCAP (RFC 4825) MSRP (RFC 4975 and 5547) Audio/Video (AMR, Speex, G.711, GSM, H.264, H.263, Theora...)... Protocole supportés : SIP/SigComp SDP RTP/RTCP XCAP (RFC 4825) MSRP/MSRPS (RFC 4975 and 5547) HTTP/HTTPS (RFC 2616 and 2617)
DHCPv4 (RFC 2131) DHCPv6 (RFC 3315) DNS (RFC 1034, 1035, 3401, 3402, 3403, 3404, 3596, 2035, 2671, and 2782) Le projet IMSDroid est un géré bar bossiel@yahoo.fr responsable de l évolution et des versions officielles. Le projet est très actif sur le plan code et la documentation est relativement abondante. Le projet reste cependant complexe, et propose un nombre très important de fonctionnalités qui ne sont pas en relation avec ce projet. asip Le projet asip dont le but était de développer la pile SIP pour android est inactif depuis des années (15 septembre 2008). Le code du projet est toujours disponible sur le site de google code, sauf que qu aucune documentation n est disponible, et personne n anime le projet. Linphone
L entreprise Linphone propose une variété de client SIP open-source sur plusieurs plateformes (Linux, Windows, Android, ). Son client VoIP fonctionnant sur wifi et 3G est très stable et suit une ligne de développement fixe. Nous avons cependant eu énormément de difficultés pour avoir des informations sur le fonctionnement interne ou sur la documentation du projet. La mailing list [linphone-developpers] sert principalement à annoncer les nouvelles fonctionnalités et les trains d évolution du projet. SipDroid Sipdroid est un client VOIP open-source donnant la possibilité de passer et de recevoir des appels téléphoniques par Internet en utilisant un compte SIP. Le projet SIPDroid est très actif avec une communauté de développeurs assez large. SIPDroid ne s insprie dans son développement d aucun projets externes, ce qui oblige à tout refaire depuis le début.
Le forum dédié au projet est très actif, plus de 1000 message ont été posté, et plus de 30 membre participe activement à ce projet. Le code de SIPDroid est assez complexe comparé aux autres projets. De plus la documentation technique ne couvre que la configuration et la manipulation de l outil. Aucune documentation n aborde les aspects techniques du développement. D un point de vue qualité sonore et ergonomie, malgré les avancées qu a réalisées l outil depuis ses débuts, l application reste difficile à manipuler, et la qualité sonore est très mauvaise. CSIPSimple CSIPsimple est un nouveau projet comparé à son concurrent SIPDroid. Le principal avantage de cet outil est sa qualité sonore du fait qu il se base sur une librairie SIP externe dédiée aux systèmes embarqués. La communauté active sur le projet se compose de 5 membres et la documentation reste assez rare. Cependant le projet PJSIP sur lequel est basé CSIPSimple est très mature, la documentation est de très bonne qualité et le cycle de développement est très stable.
CSIPSimple étant dans ses débuts, le code reste relativement simple comparé à SIPDroid. CSIPSimple bénéficie d une excellente qualité sonore, et reste très facile à manipuler et configurer. 5. Propositions d'interfaces graphiques RATP a besoin une interface graphique offrant deux fonctionnalités : «appel» et «raccroche». Nous nous sommes inspirés du code source d applications existantes «VoiDroid» dont voici l interface de ce logiciel :
Le fichier «main.xml» géré le modèle d interface. Après avoir bien compris la structure de ce fichier, nous avons changé le style de l interface : 1. Nom de logiciel : HandiRATP 2. Un logo de RATP 3. Deux buttons «call» et «Hangup» pour les fonctions «appel» et «raccroche» Voici une proposition beta de test de l interface :
Ceci est l interface du prototype finale. Le bouton Hangup a été supprimé, et une nouvelle activité est chargée au moment de l appel. Cette activité rappelle l état de la communication (En appel, En conversation, ).
6. Interactions SIP entre client et serveur Dans ce schéma : 1. Le SmartPhone se connecte au réseau WIFI et demande une adresse IP 2. Le Serveur de l agence RATP distribue une adresse IP 3. Configuration du Client SIP et appel de l agentratp 4. Le Serveur transmet l appel au Téléphone IP 5. Appel accepté
6. Connexion vocale est en cours 4. Transmission de l appel 1. Demande l adresse IP 2. Distribution de l adresse IP3. Appel du Agence RATP 6. Appel accepté 5. Appel accepté 7. Architecture technique et fonctionnelle Nous avons commencé par la manipulation du code Voidroid et la libraire PJSUA, ce qui nous a permis de bien comprendre le processus des communications SIP. Après avoir consacré plusieurs semaines de travailler dessus, nous avons constaté qu il était très difficile de reconstruire le processus des communications SIP à partir Voidroid pour les raisons suivantes : - Voidroid ne fonctionne pas sur mobile - Les fonctions Voidroid sont incomplètes Nous avons donc décidé d utiliser CSipSimple et de modifier son code natif. Nous avons modifié deux parties du code source du CSipSimple principalement : Appel SIP et Comptes
CSipSimple Appel classique Appel sip Configuration Comptes Média Réseau a. Appel SIP Dans la classe «SipHome.java» qui gère la page d accueil, plusieurs Tabs sont disponibles. En appuyant sur chaque tab, vous pouvez accéder à la vue qui y correspond. - Vue «Tél» : CSipSimple a deux interfaces dans la vue «Tél», L interface «Numéro» et l interface «SIP Adress». En prenant comme argument le numéro de téléphone ou l adresses SIP, on peut appeler le client en appuyant sur le bouton «appel». - Vue «Appels» : Vue «Appels» se charge d enregistrer tous les appels dans l historique. Dans le cadre de notre application, L URI SIP est intégré dans l outil. Nous avons utilisé un fichier XML «main.xml» se trouvant dans «res/layout/» pour décrire le style de la page d accueil d HandiRATP. Dans cette vue, le bouton à l extrémité de l interface est lié à la même fonction que CSipSimple.
CSipSimple HandiRATP b. Ajout d un compte Quand nous utilisons CSipSimple de façon normale, et afin de créer un compte avec une adresse IP, il faut se trouver dans le menu «Comptes» et choisir le type de compte «LOCAL», et par la suite entrer le nom du compte. Ci-dessous est le processus d ajout d un compte local dans CSipSimple : AccountList.java WizardsChooser.java BasePrefsWizards.java (Utilisant le model du «LOCAL» Dans notre cas, nous avons défini un compte par défaut avec l URI «usager@adresse IP», pendant l utilisation d HandiRATP, ce compte est utilisé pour appeler et recevoir.
c. Java Native Interface: JNI est un framework de programmation permettant à un code Java tournant sur une machine virtuelle (JVM) d appeler ou d être appelé par une application native (Programme ou application spécifique à un hardware ou un système d exploitation), des librairies ou une application codé dans un autre langage (C/C++, assembleur). d. PJSIP: PJSIP est une librairie SIP open-source sous licence GPL, dont la principale caractéristique est la performance et l empreinte digitale très petite et très adaptée pour les systèmes embarqués. La libraire est écrite en C afin de garantir le niveau de performance et d évolutivité requis. En plus de la vocation de servir pour des systèmes embarqués, la libraire PJSIP permet de créer des applications avec des stacks protocolaire très performant. Elle a d ailleurs été utilisé dans plusieurs client SIP. Pour n en citer que quelques un : CSIPSimple Yass Siphon PuppySIP e. Caractéristique technique de PJSIP : Portabilité : PJSIP a été conçu dans le but d être extrêmement portable et fonctionnant sur plusieurs plateformes logicielle et matérielles (16 bit, 32 bit, 64 bit, big endian, little endian, multi-proc). Taille : L un des point pris en compte lors du développement de PJSIP est la taille très petite de la libraire afin qu elle soit adaptée pour les systèmes embarquée avec de forte contrainte d espace de stockage. Performance : PJSIP permet d avoir les meilleures performances sur la machine hôte, chose que nous avons constaté lors de nos tests de CSIPSimple et SIPDroid, qui était largement moins performant en qualité sonore. Allocation mémoire : Afin d assurer les performance les plus optimales, PJSIP n utilise pas la fonction malloc() pour l allocation de mémoire, mais puise ses ressources dans un espace mémoire allouée au
début de lancement de l application. Ce choix d architecture permet des gains de performance allant à 30 plus rapide avec certaine configuration. Abstraction du système d exploitation : PJSIP est capable de faire abstraction des fonctionnalités suivantes du système d exploitation, souvent non portable entre système d exploitation : Threads Thread Local Storage. Mutexes. Semaphores. Atomic Variables Critical sections. Lock Objects Event Object. Time Data Type and Manipulation. High Resolution Timestamp etc. f. PJSUA & PJSIP-JNI : PJSUA est théoriquement la couche supérieure de PJSIP. Elle offre un nombre très importants de fonctions et méthodes dont le but est d abstraire les couches inférieur (réseau socket, codec, QoS, ), tout en faisant appel aux méthodes simples, comme l enregistrement, l appel, PJSUA est la seule partie de PJSIP avec des interfaces JNI. Le projet open-source PJSIP-JNI a été utilisé par le projet CSIPSimple pour s interfacer avec PJSIP. Le projet a appliqué quelques modifications sur le PJSIP-JNI afin de le rendre plus adapté pour l environnement android.
g. Une architecture en couche : L architecture de notre application s inspire de l architecture de CSIPSimple. Cette dernière utilise un interfaçage JNI avec la librairie PJSIP afin de profiter de la puissance et la performance de PJSIP écrite en C++ tout en gardant le confort la simplicité proposée par la machine virtuelle d android. Le fonctionnement de l application est très simple. La gestion des évènements, l interface graphique et l intelligence de l application sont toutes dans la partie client écrite en JAVA. Pour faire appel aux fonctions PJSIP, comme l enregistrement ou la réalisation d un appel, le client fait appel aux interfaces JNI de PJSIP, ou pour être plus précis, de la partie PJSUA de PJSIP. L interface JNI fait appel à son tour aux vraies fonctions PJSUA pour réaliser les fonctions d enregistrement et d appel.
8. Diagramme de séquence Quand le client lance l application «HandiRATP», elle sera initialisée premièrement, ensuite elle attend des actions. Si le client appuie sur Botton «Call», l application va lancer la fonction Appel, nous allons spécifier l action «Appel» en diagramme de séquence :
h HandiRATP pj pjsua Lancer l application Lancer l appel Terminer l appel destroy() Nous nous sommes inspiré des sources de l application «VoiDroid», et les libraires de «CSipSimple» pour ce projet :
Voici le code de la fonction «OnCreate» de «VoiDroid»:
Ci-dessous les algorithmes des fonctions modifiées: Initialisation : Created = false; Creating = false; Si Created et Creating sont vrais faire Status = 0 : Int Configuration globale Configuration log Configuration media Status=pjsua.initialisation() Si Status n est pas 1 alors faire
Pjsua.destroy() Created = false Creating = false Retourner ; Fin si Ajouter Tansport UDP Status = pjsua.start() Si stauts n est pas 1 alors Pjsua.destroy () Created = false Creating = false Retourner Fin si Created = true Creating = false Fin si Ajout un compte SIP Status=0 : Int accid = int[1] : int[] Cfg : pjsua_acc_config Username : pj_str_t Domain : pj_str_t Password : pj_str_t Data: pjsip_cred_info Data.setRealm(domain) Data.setUsername(username) Data.setData(password) Cfg.setId(sip:username@domain) Status = pjsua.acc_add(cfg, accid) Si status n est pas 1 alors acc_id = acid[0]; Fin Si Retourner status Appel Status : int Adress : pj_str_t // adresse SIP cible Status = pjsua.call_make_call (status, adresse) Return Status Voici le diagramme de séquence de la fonction «Appel» :
h HandiRATP pj pjsua Action appel = R f >0 Status=pjsua_verify_sip_url( url) f S >0 Raccroche Status : int Adress : pj_str_t // adresse SIP cible Status = pjsua.call_hangup_all (status, adresse) Pjsua.destroy(); Return Status 9. Spécifications techniques L objet du présent chapitre est de détailler les spécifications techniques pour l application android HandiRATP. Ce document est destiné : - Aux enseignants - Aux étudiants qui poursuivront le développement de l application - A la RATP HandiRATP se base sur le code source de CSipSimple. Ci-dessous l architecture de ce dernier : Nous avons modifié deux parties du code source du CSipSimple : Appel SIP et Comptes. Nous avons également modifié les options de résolution DNS de l outil. Ce rapport détaillera les modifications et changements apportées. a. Appel SIP i. Création d un vue Dans répertoire «res/layout», se trouve le fichier «main.xml» décrivant le style de la page d accueil :
TextView ImageView Botton ii. La classe principale «HandiDialer.java» Cette classe est créée à partir d une classe «Dialer.java», elle permet : - La création automatique d un compte automatique (Voir 2.2.2.) - L intégration de l interface «main.xml» dans la classe principale - L ajout d une fonction «placecall» associée au bouton «Call»
Dans la classe «HandiRATP», l identifiant de l usager et de l agent RATP «agent@ratp.fr» ont été définis. Pour démarrer un appel, il faut utiliser la fonction «placecall». Dans cette fonction, n appel à la méthode «makecall» se charge de lancer le service SIP.
iii. Intégration la classe «HandiDialer.java» au «SipHome.java»
b. Comptes i. Gestion automatique des comptes au démarrage de l application Après le lancement de CSipSimple, l activité Comptes est lancée dans le cas où c est le premier démarrage de l application, sinon, HandiRATP désactive cette activité. ii. Ajouter d un compte Pour créer un compte SIP dans «CSipSimple», il faut procéder de façon manuelle. Nous utilisons l identifiant : «usager@adresse IP» comme URI SIP pour la création du compte. Au lancement de l application, le compte est créé automatiquement. Ce type de compte identifié avec adresse IP est associé au compte «LOCAL», déjà défini dans «CSipSimple». D où l utilisation de l identifiant LOCAL dans le WIZARD_ID qui indique le template à utiliser : Ensuite le transmettre à une autre activité «BasePrefsWizard», «LOCAL»: qui aide à créer un compte
La classe «BasePrefsWizard.java» vérifie si compte est déjà créé, sinon procède à sa création : iii. Résolution DNS L architecture réseau se basait sur des requêtes DNS type SRV, conformément à la norme SIP. L activation de ce type de résolution DNS est gérée par le HashMap BOOLEAN_PREFS. Src/utils : preferencewrapper.java : Res/xml: prefs_network.xml
Fichier «prefs_network.xml» gère l activation de l option DNS SRV sur l interface graphique (Cocher ou pas) ; «preferencewraper.java» gère pour sa part la vraie configuration réelle de cette option. 10. Tests Ceci sont les principaux jalons sur lesquels nous avons travaillé durant les phases de tes : Qualité de voix CSipSimple Code Java HandiRATP Etablissement de la connexion (Appel à 10.0.0.x) Résolution DNS (Appel à agent@ratp.fr) Prototype a. Environnement de test L environnement de test qui a été mis à notre disposition se compose des briques suivantes : - Une machine virtuelle sous Debian Lenny - Serveur DHCPDHCP3 - Serveur SIP OpenSIPS - Serveur DNS BIND9 - Borne wi-fi linksys - Téléphone samsung sous android v1.6 - Téléphone HTC Hero sous android 2.0 Toutes les briques logicielles utilisées sont issues du monde opensource et requiert un effort de configuration relativement important. Sur le serveur DHCP, il faut indiquer le bloc IP géré, les adresses du serveur DNS, du gateway et le mask du bloc IP. Le serveur DNS est responsable (master) du domaine ratp.fr, et référence l adresse du serveur SIP (sip.ratp.fr). Le serveur SIP est en charge de l enregistrement des agents de la RATP, dans notre cas, «agent@ratp.fr».
Un softphone SIP est installé sur une des machines de test, et permet de simuler le poste du client de l agent de la RATP. b. Test qualité de la voix Le premier test que nous avons effectué dans le cadre de ce projet, est le test de la qualité Voix des deux softphones CSIPSimple et SipDroid. L environnement de test est très simple, en configurant de comptes locaux sur les softphones et en requêtant le client SIP sur nos machines de test, on était capable de tester, d une part la facilité de configurations de ces clients, et deuxièmement c. Test communication avec adresse IP Ce test a pour but de s assurer que l application respectait le échanges SIP, et que les champs modifiés (SIP URI, Domain_Name) était bien prise en compte. Nous avons donc pu établir des communications avec un client SIP sur une des machines de test. Durant ces phases de test, notre application avait un champ spécial pour indiquer l adresse du client à contacter, afin de faciliter et simplifier les tests.
d. Test avec résolution DNS Les tests de résolution DNS avaient pour but de s assurer que l application effectuait correctement l opération de résolution du nom de domaine ratp.fr. En utilisant un capteur de trafic installé sur le serveur DNS, il était possible d écouter les requêtes émises (ou non émises) par l application HandiRATP. Comme indiqué dans les chapitres précédents, nous avons constaté plusieurs problèmes de résolution DNS que nous avons résolu en modifiant le type de requête émises par l application. e. Téléchargement et installation de l application Un des scénarios qui nous a été inspiré M. LERICHE était l utilisation d une affiche publicitaire avec un tag QRCode renvoyant vers le lien de l application.
11. Planning prévisionnel d'implémentation
12. Conclusion Nous espérons que ce rapport fournit une idée claire sur le fonctionnement d HandiRATP, et sur les différentes modifications appliquées à CSIPSimple. La section spécification technique détaille le fonctionnement de l application, et a pour but de faciliter la reprise de ce projet pour de nouvelles évolutions. Une des points importants que nous avons constaté durant nous travaux, est l importance de l environnement de test, en passant par le téléphone mobile, la borne wifi jusqu au serveur. Il est primordial que toutes ces briques soient opérationnelles, car il est souvent impossible de déterminer la cause de plusieurs difficultés et problèmes de connexion et de communication que nous avons constatée. Nous tenons finalement à remercier tous nos encadrants pour leurs soutien et leurs aide précieuse, que sans, sera projet n aurait certainement pas pu aboutir à sa fin.