Logiciel VOIP Annexe
|
|
|
- Baptiste Gilles Moreau
- il y a 10 ans
- Total affichages :
Transcription
1 Logiciel VOIP Annexe Présenté par : Tuteur : FERRAN Olivier LANUSSE Florian TEBIB Leïla M. Rachid Elazouzi 1 ère de Master RTM Université d Avignon et des Pays de Vaucluse IUP GMI
2 Année
3 Liste des abréviations Présentation Introduction I- Partie théorique 1- Protocole H Définition 1.2- Avantages 1.3- Inconvénients SOMMAIRE : 2- Protocole SIP 2.1- Définition 2.2- Fonctionnement 2.3- Sécurité et authentifications 3- Comparaison entre le protocole H323 et le protocole SIP 4- API JAIN SIP 4.1- Pourquoi Java comme langage de programmation 4.2- Pourquoi cette API 4.3- Spécificités 4.4- Architecture
4 Liste des abréviations : GUI : Graphique User Interface PS: Proxy Server QOS: Quality Of Service RAS: Registration, Admission and Status RFC: Request For Comment RNIS: Réseau Numérique à Intégration de Service RTP: Real-Time Transport Protocol RTCP: Real-Time Control Protocol SDP: Session Description Protocol SIP: Session Initiation Protocol TCP: Transmission Control Protocol UAC: User Agent Server UAS: User Agent Server UDP: User Datagram Protocol URI: Uniform Resource Indicator URL: Uniform Resource Locator
5 Présentation Ce projet de première année de Master Réseaux Télécom et Multimédia se désigne sous l appellation «Logiciel VOIP». Par l analyse des objectifs et des taches induites, ce projet s articule autour de deux groupes de travail de trois étudiants chacun. Nous représentons le groupe n 7 et travaillons de pair avec le groupe de projet n 8, tous deux sous la tutelle de M. Elazouzi. Le travail des deux groupes est complémentaire. Il a nécessité une totale coopération de la part des étudiants, étant donné que le projet a été divisé en deux parties dépendantes l une de l autre. Les taches effectuées sont résumées comme suit : - Le groupe n 7 : o o o o o o Etude du protocole SIP Implémentation de SIP Etude de l API JAISIP et utilisation pour l implémentation de SIP. Imbrication des codecs étudiés par le groupe n 8. Développement de l interface graphique GUI comportant les fonctionnalités développées par le groupe n 8. Intégration de la transmission vidéo. - Le groupe n 8 : Etude des différents Codecs et des protocoles RTP, RTCP. o Etude des différents codecs. o Choix des codecs à implémenter (G711, LPC10-15, GSM et SPEEX). o Etude des protocoles RTP :RTCP o Gestion et réalisation de la QOS ( la qualité de service) o Ajout de fonctionnalités techniques qui incluent l appui de la tonalité o La rédaction d un manuel utilisateur complet. Objectif du projet L objectif du projet est d implémenter un modèle de communication multimédia (voix et vidéo) en temps réel entre deux ordinateurs qui n utilisent pas obligatoirement le même modèle (le même soft phone). Et ce, en nous basant sur la modélisation orientée objet du protocole de signalisation SIP
6 Il s agit ici de développer une application utilisant une interface graphique homme-machine (interface utilisateur). Dès lors, elle permettra un échange de données multimédia (audio, vidéo et messagerie instantanée). Dans le premier chapitre, comporte une première définition du protocole H323 ainsi qu une définition plus approfondie du protocole SIP. En outre, il y figure une comparaison entre ces deux protocoles. Notez ici, que le protocole SIP, considéré à ce jour comme une amélioration du H323, constitue le noyau dur de ce projet. Enfin, une dernière partie présente l API et le langage utilisés pour implémenter et réaliser ce projet. L API, dénommée JainSIP, se base sur le langage Java Dans le second chapitre, nous présenterons le travail réalisé durant le second semestre, l implémentation du protocole SIP, l imbrication des travaux réalisés par les deux groupes ainsi que la création d une interface graphique, comportant les fonctionnalités des deux groupes. A mi-parcours du dernier semestre. Au vu de l avancement du travail et des objectifs déjà atteints, nous avons décidé, avec l accord de notre tuteur, de tenter l intégration de la vidéo au projet. Ceci faisait partie des perspectives pour les projets des prochaines années
7 Introduction Dans le contexte actuel de mondialisation des échanges économiques et de l information, une demande toujours grandissante liée aux télécommunications s exprime. Ainsi, les domaines public et privé d activité emploi de manière croissante les techniques de communications longues distances. Le principal frein au déploiement de ces services réside dans le fort coût de facturation des fournisseurs de service téléphoniques classiques. En parallèle de ce fait, l émergence, aussi violente que rapide de l Internet témoigne des possibilités d accès à l information sans aucune considération liée aux distances. La question est alors posée de savoir comment faire coïncider les deux afin que les besoins de l un profitent des possibilités de l autre. Les utilisateurs du téléphone considère comme acquis un certain mode de facturation : les coûts de communication dépendent à la fois de la distance et de la durée d occupation de la ligne. Par contre, le coût de l Internet suit une tout autre logique : la facturation demeure uniquement forfaitaire. Fort de ce constat, l utilisateur désire voir disparaître le premier au profit du second. A la fois dans un souci d économie, mais aussi de simplicité. A ce fait s ajoute un courant relativement récent, qui vise à une convergence des moyens de communications vers l Internet, ou le «Tout IP». Ces solutions constitueraient dès lors des alternatives uniquement forfaitaire assurant un confort d utilisation équivalent à la téléphonie standard. C est dans ce contexte là que la téléphonie sur IP fut développée. La téléphonie sur IP utilise la technique VOIP (Voice Over IP : VOix sur IP) et doit son succès grandissant aux coûts réduits du transport de l'information via le réseau internet. Plusieurs acteurs de l'informatique se sont lancés dans ce marché extrêmement concurrentiel à l'égard des grands opérateurs de téléphonie classique ; le plus connu est la société luxembourgeoise Skype Technologies SA, dont l'offre commerciale SkypeOut (passerelle SIP sur le réseau téléphonique classique) concurrence directement ces opérateurs. Dans les grandes lignes, la Voix sur IP suit ce principe : Lors de l'émission, un programme appelé codec numérise et compresse un signal audio (la voix humaine par exemple), les données numériques ainsi obtenues sont acheminées jusqu'au destinataire dans des paquets TCP/IP. Le codec du programme récepteur effectue les opérations inverses (décompression, puis restitution analogique du signal audio)
8 1. Protocole H Définition I- Partie théorique Le protocole H323 est utilisé pour l'interactivité en temps réel, notamment la visioconférence (signalisation, enregistrement, contrôle d'admission, transport et encodage). C'est le leader du marché pour la téléphonie IP. Il s'inspire du protocole H320 qui proposait une solution pour la visioconférence sur un réseau numérique à intégration de service (RNIS ou ISDN en anglais), comme par exemple le service numéris proposé par France Telecom. Le protocole H323 est une adaptation de H320 pour les réseaux IP. A l'heure actuelle, la visioconférence sur liaison RNIS est toujours la technique la plus déployée. Les réseaux utilisés sont à commutation de circuits. Ils permettent ainsi de garantir une Qualité de Service (QOS) aux utilisateurs (limite les coupures du son ou de l'image). Aujourd'hui, c'est encore un avantage indiscutable. Par contre, comme pour le téléphone, la facturation est en fonction du débit utilisé, du temps de communication et de la distance entre les appels. Plus qu'un protocole, H323 ressemble d'avantage à une association de plusieurs protocoles différents pouvant être regroupés en trois catégories : la signalisation, la négociation de codec, et le transport de l information. Les messages de signalisation réunissent l ensemble des informations qui ne correspondent pas directement au flux multimédia échangé. Il correspondent par exemple aux messages demandant d être mis en relation avec un interlocuteur, informant que la ligne est occupée ou encore indiquant que le téléphone de l appelé sonne, En H323, la signalisation s appuie sur le protocole RAS pour l enregistrement et l authentification, et le protocole Q.931 pour l initialisation et le contrôle d appel. La négociation est utilisée pour faire correspondre les méthodes de codage des deux éléments en communication. Il est important que les téléphones (ou systèmes) utilisent un langage commun s ils veulent se comprendre. Par ailleurs, si tous permettent l utilisation d une grande variété de codecs, Il est préférable d adapter celui utilisé aux propriétés de la communication. Ce choix peut se faire en fonction des capacités d accès de l utilisateur à Internet, mais aussi de la qualité exigée pour son service (qualité d image et du son, réactivité des échanges, ). Dans tous les cas, Le protocole utilisé pour la négociation de codec est le H.245 Le transport de l information s appuie sur le protocole RTP qui transporte la voix, la vidéo ou les données numérisées par les codecs. Les messages RTCP assure, quant à eux, le contrôle de qualité, et les demandes de renégociation des codecs en cas de changement des propriétés de la ligne
9 Une communication H323 se déroule en cinq phases : Établissement de l appel Échange de capacité et réservation éventuelle de la bande passante à travers le protocole RSVP (Ressource reservation Protocol) Établissement de la communication audio-visuelle Invocation éventuelle de services en phase d'appel (par exemple, transfert d'appel, changement de bande passante, etc.) Libération de l'appel. 1.2.Avantages Il existe de nombreux produits (plus de 30) utilisant ce standard adopté par de grandes entreprises telles Cisco, Nortel, IBM, Intel, Microsoft, Netscape, etc. Les cinq principaux logiciels de visioconférence Picturel 550, Proshare 500, Trinicon 500, Smartstation et Cruiser 150 utilisent sur l IP la norme H323. Un niveau d'interopérabilité très élevé, ce qui permet à plusieurs utilisateurs d'échanger des données audio et vidéo sans faire attention aux types de média qu'ils utilisent. 1.3.Inconvénients Protocole très complexe, manque d interopérabilité entre les différentes implémentations (RadVision, Elemedia-Lucent, ) Difficultés d intégrations dans les rêgles de filtrage des FireWall Support des fonctions avancées de la téléphonie. H450.x très peu utilisé. Sort des standards du modèle OSI assurant l interopérabilité avec l ensemble du parc réseau IP
10 2. Protocole SIP 2.1. Définition Le protocole SIP (Session Initiation Protocol) est un protocole suivant le standard de l'ietf (RFC 3261 et 3265). Il a été conçu afin d établir, de modifier et de terminer des sessions multimédia. Il assure l'authentification et la localisation des différents participants. Il se charge également de la négociation des types de média utilisables. Ceci s effectue à l aide de l encapsulation de messages SDP (Session Description Protocol). SIP ne transporte pas les données échangées durant la session comme la voix ou la vidéo. Il demeure indépendant de la transmission des données. Dès lors, tous types de donnés et de protocoles peuvent être utilisés pour cet échange. SIP est le standard «open» de VoIP (Voice Over IP, voix sur IP). Disposant d une interopérabilité particulièrement étendue, il se destine à devenir le principal standard des télécommunications multimédia (son, image, etc.). SIP n'est donc pas seulement destiné à la VoIP mais pour de nombreuses autres applications telles que la visiophonie, la messagerie instantanée, la réalité virtuelle ou même les jeux vidéo. Application Présentation Session Transport Réseau Liaison Physique SIP dans le model OSI Comme on peut le voir sur ce petit schéma, SIP s est superposé à 3 couches du modèle OSI : la couche Application, la couche Présentation et la couche Session ; ceci afin de faciliter sa programmation, son intégration et son utilisation dans les logiciels de communication. Ainsi, SIP possède l'avantage de ne pas être attaché à un médium particulier et est sensé être indépendant du protocole de transport des couches basses
11 Exemple de communication simple : Ce schéma représente l établissement d une session SIP à travers un proxy entre 2 utilisateurs. Il montre les différentes étapes de cette communication ainsi que quelques requêtes d établissement de session spécifiques au protocole. Un utilisateur peut se connecter avec les utilisateurs d'une session déjà ouverte. Pour ouvrir une session, un utilisateur émet une invitation transportant un descripteur de session permettant aux autres utilisateurs souhaitant communiquer de s'accorder sur la compatibilité de leur média. SIP permet donc de relier des stations mobiles en transmettant ou redirigeant les requêtes vers la position courante de la station appelée
12 2.2. Fonctionnement SIP intervient aux différentes phases de l'appel : Localisation du terminal correspondant, Analyse du profil et des ressources du destinataire, Négociation du type de média (voix, vidéo, données...) et des paramètres de communication, Disponibilité du correspondant, détermine si le poste appelé souhaite communiquer, et autorise l'appelant à le contacter. Etablissement et suivi de l'appel, avertit les parties appelantes et appelées de la demande d'ouverture de session, gestion du transfert et de la fermeture des appels. Gestion de fonctions évoluées : cryptage, retour d'erreurs,... Avec SIP, les utilisateurs qui ouvrent une session peuvent communiquer en mode point à point, en mode diffusif ou dans un mode combinant ceux-ci. SIP permet donc l'ouverture de sessions en mode : Point-à-point - Communication entre 2 machines, on parle d'unicast. Diffusif - Plusieurs utilisateurs en multicast, via une unité de contrôle M.C.U (Multipoint Control Unit) Combinatoire - Plusieurs utilisateurs pleinement interconnectés en multicast via un réseau à maillage complet de connexions. Voici les différents éléments intervenant dans l'ouverture de session : Suivant nature des échanges, choix des protocoles les mieux adaptés (RSVP, RTP, RTCP, SAP, SDP). Détermination du nombre de sessions, comme par exemple, pour véhiculer de la vidéo, 2 sessions doivent être ouvertes (l'une pour l'image et l'autre pour la vidéo). Chaque utilisateur et sa machine est identifié par une adresse que l'on nomme Url SIP et qui se présente comme une Url Mailto. Requête Uri permettant de localiser le proxy server auquel est rattaché la machine de l'appelé. Requête SIP, une fois le client (machine appelante) connecté à un serveur SIP distant, il peut lui adresser une ou plusieurs requêtes SIP et recevoir une ou plusieurs réponses de ce serveur. Les réponses contiennent certains champs identiques à ceux des requêtes, tels que : Call-ID, Cseq, To et From
13 Les échanges entre un terminal appelant et un terminal appelé se font par l'intermédiaire de requêtes : Invite - Cette requête indique que l'application (ou utilisateur) correspondante à l'url SIP spécifié est invité à participer à une session. Le corps du message décrit cette session (par ex : média supportés par l appelant). En cas de réponse favorable, l'invité doit spécifier les médias qu'il supporte. Ack - Cette requête permet de confirmer que le terminal appelant a bien reçu une réponse définitive à une requête Invite. Options - Un proxy server en mesure de contacter l'uas (terminal) appelé, doit répondre à une requête Options en précisant ses capacités à contacter le même terminal. Bye - Cette requête est utilisée par le terminal de l'appelé à fin de signaler qu'il souhaite mettre un terme à la session. Cancel - Cette requête est envoyée par un terminal ou un proxy server à fin d'annuler une requête non validée par une réponse finale comme, par exemple, si une machine ayant été invitée à participer à une session, et ayant accepté l'invitation ne reçoit pas de requête Ack, alors elle émet une requête Cancel. Register - cette méthode est utilisée par le client pour enregistrer l'adresse listée dans l'url TO par le serveur auquel il est relié. Une réponse à une requête est caractérisée, par un code et un motif, appelés code d'état et raison phrase respectivement. Un code d'état est un entier codé sur 3 bits indiquant un résultat à l'issue de la réception d'une requête. Ce résultat est précisé par une phrase, textbased (UTF-8), expliquant le motif du refus ou de l'acceptation de la requête. Le code d'état est donc destiné à l'automate gérant l'établissement des sessions SIP et les motifs aux programmeurs. Il existe 6 classes de réponses et donc de codes d'état, représentées par le premier bit : 1xx = Information - La requête a été reçue et continue à être traitée 2xx = Succès - L'action a été reçue avec succès, comprise et acceptée 3xx = Redirection - Une autre action doit être menée afin de valider la requête 4xx = Erreur du client - La requête contient une syntaxe éronnée ou ne peut pas être traitée par ce serveur 5xx = Erreur du serveur - Le serveur n'a pas réussi à traiter une requête apparemment correcte 6xx = Echec général - La requête ne peut être traitée par aucun serveur Dans un système SIP on trouve deux types de composantes, les users agents (UAS, UAC) et un réseau de serveurs : L'UAS (User Agent Server) - Il représente l'agent de la partie appelée. C'est une application de type serveur qui contacte l'utilisateur lorsqu'une requête SIP est reçue. Et elle renvoie une réponse au nom de l'utilisateur
14 L'U.A.C (User Agent Client) - Il représente l'agent de la partie appelante. C'est une application de type client qui initie les requêtes. Le relais mandataire ou PS (Proxy Server), auquel est relié un terminal fixe ou mobile, agit à la fois comme un client et comme un serveur. Un tel serveur peut interpréter et modifier les messages qu'il reçoit avant de les retransmettre : Le RS (Redirect Server) - Il réalise simplement une association (mapping) d'adresses vers une ou plusieurs nouvelles adresses. (lorsqu'un client appelle un terminal mobile - redirection vers le PS le plus proche - ou en mode multicast - le message émis est redirigé vers toutes les sorties auxquelles sont reliés les destinataires). Notons qu'un Redirect Server est consulté par l'uac comme un simple serveur et ne peut émettre de requêtes contrairement au Ps. Le LS (Location Server) - Il fournit la position courante des utilisateurs dont la communication traverse les Rs et PS auxquels il est rattaché. Cette fonction est assurée par le service de localisation. Le RG (Registrar) - C'est un serveur qui accepte les requêtes Register et offre également un service de localisation comme le LS. Chaque PS ou RS est généralement relié à un Registrar Sécurité et inconvénients : Les messages SIP peuvent contenir des données confidentielles, en effet le protocole SIP possède 3 mécanismes de cryptage : Cryptage de bout en bout du Corps du message SIP et de certains champs d'entête sensibles aux attaques. Cryptage au saut par saut (hop by hop) à fin d'empêcher des pirates de savoir qui appelle qui. Cryptage au saut par saut du champ d'en-tête Via pour dissimuler la route qu'a emprunté la requête. De plus, à fin d'empêcher à tout intrus de modifier et retransmettre des requêtes ou réponses SIP, des mécanismes d'intégrité et d'authentification des messages sont mis en place. Et pour des messages SIP transmis de bout en bout, des clés publiques et signatures sont utilisées par SIP et stockées dans les champs d'en-tête Autorisation. Une autre attaque connue avec TCP ou UDP est le «deny of service», lorsqu'un Proxy Server intrus renvoie une réponse de code 6xx au client (signifiant un échec général, la requête ne peut être traitée). Le client peut ignorer cette réponse. Si il ne l'ignore pas et émet une requête vers le serveur "régulier" auquel il était relié avant la réponse du serveur "intrus", la requête aura de fortes chances d'atteindre le serveur intrus et non son vrai destinataire
15 3. Comparaison entre les protocoles H323 et SIP : La comparaison entre les deux protocoles est résumée dans le tableau suivant SIP H323 Nombre échanges pour 1,5 aller-retour 6 à 7 aller-retour établir la connexion Maintenance du code protocolaire Simple par sa nature textuelle à l'exemple de http Complexe et nécessitant un compilateur Evolution du protocole Protocole ouvert à de nouvelles fonctions Ajout d'extensions propriétaires sans concertation entre vendeurs Fonction de conférence Distribuée Centralisée par l'unité MC Fonction de téléservices Oui, par défaut H.323 v2 + H.450 Détection d'un appel en boucle Oui Inexistante sur la version 1 un appel routé sur l'appelant provoque une infinité de requêtes Signalisation multicast Oui, par défaut Non La simplicité, la rapidité et la légèreté d'utilisation, du protocole SIP sont autant d'arguments qui pourraient permettre à SIP de convaincre les investisseurs. De plus, ses avancées en matière de sécurité des messages sont un atout important par rapport à ses concurrents, d où notre choix d utilisation de ce protocole
16 4. API JAIN SIP : 4.1. Pourquoi Java comme langage de programmation? Tout d abord pour la portabilité de Java qui se prête très bien au développement d applications de téléphonie, des applications qui se doivent d être portables et multiplateformes. De plus, notre groupe de projet possède de bonnes bases en Java et beaucoup d éléments vus au cours de la Licence et de la 1 ère année de Master seront réutilisables dans cette application. Nous avons aussi choisi Java pour la puissance de la Javadoc native ainsi que celle de JAIN SIP Pourquoi l API JAIN SIP? JAIN SIP est un API Java développé par le NIST (National Institut Of Standardisation) et Sun Microsystems. Il a l avantage d être gratuit et sans aucune contrainte de licence. Il bénéficie d une interface propre, complète et documentée (Javadoc, exemples, etc.). De plus cette API est reconnue comme stable depuis la version 1.2 (celle que nous utiliserons). Il existe un support actif de cet API et les derniers petits bugs sont mis à jour constamment. Plusieurs produits ont déjà été développés grâce un JAIN SIP, parmi eux on compte : Un proxy SIP, un AppletPhone
17 4.3. Spécificités de JAIN SIP : JAIN SIP propose un accès total au protocole SIP, il supporte le protocole SIP décrit dans le RFC 3261 ainsi que plusieurs extensions comme : la notification d événement RFC 3265, l envoi de messages instantanés RFC 3428, le transfert d appel RFC L architecture JAIN SIP : JAIN SIP propose 3 interfaces principales : SIPStack, SIPProvider et SIPListener Architecture générale de JAIN SIP
18 4.4.1.SIPListener et SIPProvider L architecture de JAIN SIP a été développée pour l environnement J2SE. Les événements (entrée et sortie de messages SIP) sont donc basés sur un model Listener/Provider (comme pour ActionListener/Component dans les interfaces graphiques SWING). Ainsi, tout type d application JAIN SIP devra implémenter l interface SIPListener et définir les 3 méthodes qui serviront aux traitements des différentes requêtes, réponses et timeouts reçu par l interface. Afin que l interface SIPListener envoie et reçoit les messages SIP, ces derniers sont encapsulés dans un objet de type Event. import java.util.eventlistener; public interface SIPListener extends EventListener { public void processrequest(requestevent requestevent); public void processresponse(responseevent responseevent); public void processtimeout(timeoutevent timeoutevent); Les providers qui devront s enregistrer auprès de l interface SIPListener (à la manière d un JButton par exemple) doivent être associés à une adresse IP ainsi qu un port et le protocole de transport. L avantage de ceci est qu une même application peut communiquer sur plusieurs port, adresse IP et cela en TCP ou UDP. Cela s avérera utile dans autre application sachant que pour la voix et la vidéo il faut établir deux sessions distinctes SIPStack Interface L interface SIPStack permet, entre autre, de créer des «ListeningPoint» qui sont des associations IP:Port /protocole de transport (Ces «ListeningPoint» se chargent en fait de créer des Socket et ServerSocket adéquats pour établir les connexions). L interface SIPstack est donc associée à une/des adresse(s) IP (suivant les ListeningPoint et Providers inscrits) et est chargée de les manager
19 Voici un exemple pour la création d un UAC (User Agent Client) avec un provider : public UAC implements SIPListener { SIPFactory = SIPFactory.getInstance(); SIPStack = SIPFactory.createSIPStack(properties); udplisteningpoint = SIPStack.createListeningPoint(« », 5060, «udp»); SIPProvider = SIPStack.createSIPProvider(udpListeningPoint); SIPProvider.addSIPListener(this);
20 4.4.3.Les messages SIP et leurs entêtes Le protocole SIP (comme le protocole http) définie deux types de messages : Les requêtes et les réponses pour lesquels JAIN SIP définit deux interfaces. Les messages de type requêtes, qui sont envoyés du client au serveur, contiennent une méthode indiquant le type de la requête, ainsi qu un URI qui indique l utilisateur ou le service que l on désire joindre. Les messages de type réponse, qui sont envoyés par le client en réponse à une précédente requête, contiennent un statut indiquant le type de réponse, un URI indiquant l utilisateur ou le service qui était adressé et une phrase indiquant le résultat de la requête. Les entête SIP sont similaires au entête très proche des entêtes http, JAIN SIP offre pour chaque entête une interface spécifique, contrairement à certains modèles qui offrent une interface générique pour traiter toute les informations qu elles contiennent. Ci-dessous, un exemple complet avec le message SIP à gauche et son implémentation avec JAIN SIP à droite :
21 4.4.4.Transactions et dialogues Dans l architecture SIP une transaction est une séquence de messages SIP (une requête et toutes les réponses à cette requête) échangés entre les différents éléments du SIP. A nouveau, JAIN SIP a standardisé ces transactions en deux interfaces : Une interface pour les transactions client et une pour les transactions serveur. Le principe de ces transactions est d associé à une requêtes ou a une réponse un objet transaction (identifiable par un ID) afin que l application prenne en charge certaines fonctions comme, par exemple, l association automatique des réponses à une requête envoyée. A l arrivée d une requetes invite, l application de l appelé pourra créer une Transaction#1 et l associer a la requete INVITE, elle se chargera alors d envoyer automatiquement le Trying, Ringing et le OK
22 Les dialogues dans l architecture SIP sont identifiés en utilisant le call-id, l étiquette From et l étiquette To des messages SIP. Les dialogues sont établit lors de la création de la transaction nécessitant une notion de dialogue (INVITE, SUBSCRIBE ). Les messages dont ces 3 champs sont respectivement identiques appartiennent à un même dialogue. Ainsi un dialogue englobera une ou plusieurs transactions. Architecture Request Respond/Transaction/Dialogue de JAIN SIP
23 La classe SipGUI : import java.awt.*; import javax.swing.*; public class SipGUI implements MouseListener, ActionListener { private JFrame fenetre; private JTextPane textpane; private StyledDocument doc; private JPanel numpanel; private JPanel optionpanel; private JMenuBar menu; private JMenu menufichier; private JMenu menuedition; private JMenu menuaide; private UA ua; private JLabel labelbas; private String adressecontact; private String callid=""; private InterfaceSauvegarde is; private InterfaceHistorique ih; private JButton carnetbutton; private ContactDialog f; private HistoriqueDialog h; private PreferenceTab pf; public SipGUI() throws Exception { fenetre = new JFrame("SIuP Phone"); JFrame.setDefaultLookAndFeelDecorated(true); JPanelFond contentpane = new JPanelFond("images/logoFAC.gif", true); contentpane.setopaque(false); contentpane.setbackground(color.white); //contentpane.setmaximumsize(new Dimension(245,505)); fenetre.setcontentpane(contentpane); fenetre.setlocation(600, 200); fenetre.setsize(240,490); fenetre.setdefaultcloseoperation(jframe.exit_on_close); fenetre.getcontentpane().setbackground(color.white); fenetre.getcontentpane().setlayout(new BoxLayout(fenetre.getContentPane(), BoxLayout.PAGE_AXIS)); fenetre.getrootpane().setbackground(color.white); menu = new JMenuBar(); menufichier = new JMenu("Fichier");
24 JMenuItem itemappeler = new JMenuItem("Appeler"); menufichier.add(itemappeler); JMenuItem itemraccrocher = new JMenuItem("Raccrocher"); menufichier.add(itemraccrocher); JMenuItem itemquitter = new JMenuItem("Quitter"); menufichier.add(itemquitter); menuedition = new JMenu("Edition"); JMenuItem itemajouter = new JMenuItem("Ajouter un contact"); itemajouter.addactionlistener(this); menuedition.add(itemajouter); JMenuItem itemhistorique = new JMenuItem("Historique des appels"); itemhistorique.addactionlistener(this); menuedition.add(itemhistorique); JMenuItem itempreferences = new JMenuItem("Prrences"); itempreferences.addactionlistener(this); menuedition.add(itempreferences); menuaide = new JMenu("Edition"); JMenuItem itemapropos = new JMenuItem("A propos"); menuaide.add(itemapropos); menu.add(menufichier); menu.add(menuedition); menu.add(menuaide); fenetre.setjmenubar(menu); JPanel panelblanc = new JPanel(); panelblanc.setbackground(color.white); panelblanc.setmaximumsize(new Dimension(300,15)); fenetre.add(panelblanc); JPanelFond panelfond = new JPanelFond("images/ecran.png", false); panelfond.setopaque(false); panelfond.setmaximumsize(new Dimension(228,103)); textpane = new JTextPane(); textpane.setpreferredsize(new Dimension(225,103)); textpane.setopaque(false); textpane.setfont(new Font("Trebuchet MS",Font.BOLD,12)); textpane.setforeground(color.black); textpane.seteditable(false); doc = textpane.getstyleddocument(); addstylestodocument(doc); panelfond.add(textpane); fenetre.getcontentpane().add(panelfond, BorderLayout.LINE_START);
25 JPanel optionpanel2 = new JPanel(); optionpanel2.setbackground(color.white); optionpanel2.setmaximumsize(new Dimension(200,40)); JButton audiobutton = new JButton(new ImageIcon("images/audio.png")); audiobutton.addmouselistener(this); audiobutton.setname("audiobutton"); audiobutton.setpreferredsize(new Dimension(30,30)); audiobutton.setborderpainted(false); JButton confbutton = new JButton(new ImageIcon("images/conf.png")); confbutton.addmouselistener(this); confbutton.setname("confbutton"); confbutton.setpreferredsize(new Dimension(30,30)); confbutton.setborderpainted(false); carnetbutton = new JButton(new ImageIcon("images/clipboard2.png")); carnetbutton.addmouselistener(this); carnetbutton.setborderpainted(false); carnetbutton.setname("carnetbutton"); carnetbutton.setpreferredsize(new Dimension(30,30)); optionpanel2.add(confbutton, BorderLayout.CENTER); optionpanel2.add(audiobutton,borderlayout.east); optionpanel2.add(carnetbutton, BorderLayout.WEST); optionpanel2.setopaque(false); fenetre.getcontentpane().add(optionpanel2, BorderLayout.CENTER); optionpanel = new JPanel(); optionpanel.setbackground(color.white); optionpanel.setmaximumsize(new Dimension(200,50)); optionpanel.setopaque(false); JButton callbutton = new JButton(new ImageIcon("images/call.png")); callbutton.setname("callbutton"); callbutton.addmouselistener(this); callbutton.setborder(borderfactory.createemptyborder()); callbutton.setborderpainted(false); callbutton.setbackground(color.white); callbutton.setpreferredsize(new Dimension(71,36)); callbutton.setopaque(false); optionpanel.add(callbutton, BorderLayout.EAST); JButton byebutton = new JButton(new ImageIcon("images/bye.png")); byebutton.setname("byebutton"); byebutton.addmouselistener(this); byebutton.setborder(borderfactory.createemptyborder()); byebutton.setborderpainted(false); byebutton.setbackground(color.white); byebutton.setpreferredsize(new Dimension(71,36)); byebutton.setopaque(false); optionpanel.add(byebutton, BorderLayout.WEST);
26 fenetre.getcontentpane().add(optionpanel, BorderLayout.CENTER); numpanel = new JPanel(); //numpanel.setborder(borderfactory.createlineborder(color.black)); numpanel.setbackground(color.white); numpanel.setmaximumsize(new Dimension(150,200)); numpanel.setlayout(new GridLayout(4,3,5,5)); numpanel.setopaque(false); for(int i=1;i<10;i++) { JButton numbutton = new JButton(); numbutton.addmouselistener(this); numbutton.setborder(borderfactory.createemptyborder()); numbutton.setborderpainted(false); numbutton.setbackground(color.white); numbutton.setmaximumsize(new Dimension(44,44)); numbutton.seticon(new ImageIcon("images/"+i+".png")); numbutton.setopaque(false); numpanel.add(numbutton); JButton etoilebutton = new JButton(); etoilebutton.setborder(borderfactory.createemptyborder()); etoilebutton.setborderpainted(false); etoilebutton.setbackground(color.white); etoilebutton.setmaximumsize(new Dimension(44,44)); etoilebutton.seticon(new ImageIcon("images/etoile.png")); numpanel.add(etoilebutton); JButton OButton = new JButton(); OButton.setBorder(BorderFactory.createEmptyBorder()); OButton.setBorderPainted(false); OButton.setBackground(Color.white); OButton.setMaximumSize(new Dimension(44,44)); OButton.setIcon(new ImageIcon("images/0.png")); numpanel.add(obutton); JButton diesebutton = new JButton(); diesebutton.setborder(borderfactory.createemptyborder()); diesebutton.setborderpainted(false); diesebutton.setbackground(color.white); diesebutton.setmaximumsize(new Dimension(44,44)); diesebutton.seticon(new ImageIcon("images/diese.png")); numpanel.add(diesebutton); fenetre.getcontentpane().add(numpanel); JPanel textlogo = new JPanel(new FlowLayout(FlowLayout.LEFT)); textlogo.setborder(borderfactory.createbevelborder(1, Color.GRAY, Color.LIGHT_GRAY)); textlogo.setbackground(color.white); labelbas = new JLabel("Connexion..."); //textlogo.add(new JLabel(new ImageIcon("clipboard_resize.png"))); textlogo.add(labelbas);
27 //textlogo.setmaximumsize(new Dimension(250,30)); fenetre.getcontentpane().add(textlogo, BorderLayout.PAGE_END); fenetre.setvisible(true); is = new InterfaceSauvegarde(); is.lecturesauvegarde(); ih = new InterfaceHistorique(); ih.lecturehistorique(); ua = new UA(); ua.init(this); f = new ContactDialog(this, ua.getuac()); h = new HistoriqueDialog(this, ua.getuac()); public void addstylestodocument(styleddocument doc) { Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE); Style regular = doc.addstyle("regular", def); StyleConstants.setFontFamily(def, "Trebuchet MS"); Style s = doc.addstyle("italic", regular); StyleConstants.setItalic(s, true); s = doc.addstyle("bold", regular); StyleConstants.setBold(s, true); s = doc.addstyle("small", regular); StyleConstants.setFontSize(s, 10); s = doc.addstyle("large", regular); StyleConstants.setFontSize(s, 16); s = doc.addstyle("couleur", regular); StyleConstants.setForeground(s, Color.BLUE); public static void main(string[] args) throws Exception { new SipGUI(); public void mouseclicked(mouseevent e) { JButton temp = ((JButton)e.getSource()); if(temp.getname().equals("carnetbutton")){ f.actualiser(); f.setvisible(true); f.setlocation(fenetre.getlocation()); fenetre.setalwaysontop(true); Point p = fenetre.getlocation();
28 p.translate(0, 1); for(int i=0; i<f.getwidth()+3; i++){ try { Thread.sleep(1); catch (InterruptedException e1) { e1.printstacktrace(); p.translate(-1, 0); f.setlocation(p); if(temp.getname().equals("byebutton")){ try { System.out.println("Bye Click 颩 ; if(ua.getuac().getencom() ua.getuas().getencom()) { if(ua.getuac().getencom()){ ua.getuac().creerbye(callid, adressecontact); if(ua.getuas().getencom()){ ua.getuas().creerbye(callid, adressecontact); else { //CANCEL!!! odif if(ua.getnbinvite()>0) { System.out.println("Rejet"); ua.rejet(); if(ua.getuac().getessaiinvite()) { ua.getuac().creercancel(callid, adressecontact); catch (Exception e1) { e1.printstacktrace(); if(temp.getname().equals("callbutton")){ ua.coupesonnerie(); ua.setdecroche(); if(temp.getname().equals("confbutton")) { pf = new PreferenceTab(this); public void setcarnetbouttonactif() { carnetbutton.addmouselistener(this);
29 public void mouseentered(mouseevent arg0) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { public JTextPane gettextarea(){ return textpane; public JLabel getlabelbas(){ return labelbas; public void setadressecontact(string s){ adressecontact = s; public void setcallid(string callid) { callid = callid; public void actionperformed(actionevent e) { if(e.getactioncommand().equals("ajouter un contact")) { new NouveauContact(this); if(e.getactioncommand().equals("prrences")) { pf = new PreferenceTab(this); if(e.getactioncommand().equals("historique des appels")) { h.actualiser(); h.setvisible(true); h.setlocation(fenetre.getlocation()); fenetre.setalwaysontop(true); Point p = fenetre.getlocation(); p.translate(0, 1); for(int i=0; i<h.getwidth()+3; i++){ p.translate(-1, 0); h.setlocation(p); public InterfaceSauvegarde getinterfacesauvegarde() { return is; public PreferenceTab getpreferencetab() { return pf;
30 public UA getua() { return ua; public InterfaceHistorique getinterfacehistorique() { return ih;
31 La classe UA : import java.applet.applet; import java.applet.audioclip; import java.io.file; import java.net.inetaddress; import java.text.parseexception; import java.util.properties; import javax.sip.*; * L'interface USER AGENT, cette classe implémente SIPListener, elle est donc le point ou les messages SIP vont arriver et partir * Lors de la réceptions de requêtes, elle déclenche les methodes de traitement de UASsip * et celles de UACSip pour les réponses toulims * public class UA implements SipListener{ private SipProvider sipprovider; private SipStack sipstack; private RequestEvent requesteventinvite; private ServerTransaction stinvite; private ListeningPoint udplisteningpoint; private ClientTransaction invitetid; private Dialog dialog; private String IP; private static String transport = "udp"; private static String realm = "proxy01.sipphone.com"; private Request request; long invco = 1; // Compte le nombre d'invite envoyé long byeco = 1; private boolean decroche = false; private int nbinvite = 0; private UACsip uacsip; private UASsip uassip; private SipGUI sipgui; private AudioClip sonnerie; * Cette méthode permet d'initialiser différentes variables permettant l'échange de messages SIP, * de creer un SipProvider pour un certain ListeningPoint (une sorte de Socket et ServerSockey) sipgui Instance de la fenêtre principale de l'interface graphique Exception public void init(sipgui sipgui) throws Exception {
32 this.sipgui = sipgui; sonnerie = Applet.newAudioClip(new File("sons/sonnerie.wav").toURL()); IP = ""+InetAddress.getLocalHost().getHostAddress(); SipFactory sipfactory = null; sipstack = null; sipfactory = SipFactory.getInstance(); sipfactory.setpathname("gov.nist"); Properties properties = new Properties(); properties.setproperty("javax.sip.outbound_proxy", realm + "/" + transport); properties.setproperty("javax.sip.stack_name", "UA"); properties.setproperty("gov.nist.javax.sip.max_message_size", " "); properties.setproperty("gov.nist.javax.sip.debug_log","uasipauthdebug.txt"); properties.setproperty("gov.nist.javax.sip.server_log","uasipauthlog.txt"); properties.setproperty("gov.nist.javax.sip.trace_level", "16"); properties.setproperty("gov.nist.javax.sip.cache_client_connections","false"); sipstack = sipfactory.createsipstack(properties); System.out.println("SipStack crée: " + sipstack); // Création du ListeningPoint sur le port 5060 (port classique pour SIP) udplisteningpoint = sipstack.createlisteningpoint(ip, 5060, "udp"); sipprovider = sipstack.createsipprovider(udplisteningpoint); sipprovider.addsiplistener(this); // Instanciation de l'uas et l'uac uacsip = new UACsip(); uacsip.init(sipprovider, sipgui); uassip = new UASsip(); uassip.init(sipprovider, sipgui); // Enregistrement de l'utilisateur auprès du registar (domain) Request request = uacsip.creerregister(""); // Create the client transaction. invitetid = sipprovider.getnewclienttransaction(request); // Envoi de la requête REGISTER invitetid.sendrequest(); System.out.println("Enregistrement...:\n" + request); dialog = invitetid.getdialog(); System.out.println(dialog); * Méthode qui lance différentes procédures selon le type de requête reçue
33 public void processrequest(requestevent requeterecue) { request = requeterecue.getrequest(); String adressecontact = ((FromHeader)request.getHeader("From")).getAddress().getURI().toString().substring(4); String callid = ((CallIdHeader)request.getHeader("Call-ID")).getCallId(); sipgui.setadressecontact(adressecontact); sipgui.setcallid(callid); // Extraction de l'objet Transaction serveur de la requête reçue ServerTransaction servertransactionid = requeterecue.getservertransaction(); System.out.println("\n\nRequete " + request.getmethod() + " reçue sur " + sipstack.getstackname() + " avec un id de transation de serveur " + servertransactionid); // Si la requete est un MESSAGE if (request.getmethod().equals(request.message)) try { uacsip.processmessage(request, servertransactionid); catch (Exception e) { e.printstacktrace(); // Si la requete est un INVITE if (request.getmethod().equals(request.invite)) { requesteventinvite = requeterecue; stinvite = servertransactionid; sipgui.gettextarea().settext("appel entrant..."); if(nbinvite==0) { sonnerie.loop(); nbinvite++; // Si l'utilisateur a décoché if(decroche){ try { // On traite la requête INVITE uassip.processinvite(requeterecue, servertransactionid); catch (Exception e) { e.printstacktrace(); // Si la requete est un ACK else if (request.getmethod().equals(request.ack)) { uassip.processack(requeterecue); // Si la requete est un BYE else if (request.getmethod().equals(request.bye)) { try { uassip.processbye(requeterecue.getrequest(), servertransactionid); catch (Exception e) { e.printstacktrace();
34 // Si la requete est un CANCEL else if (request.getmethod().equals(request.cancel)) { try { uassip.processcancel(requeterecue, servertransactionid); catch (PeerUnavailableException e) {e.printstacktrace(); * Lors de la réception d'une réponse, lance la méthode responsable du traitement de l'instance de UACSip public void processresponse(responseevent reponserecue) { uacsip.processresponse(reponserecue); public void processtimeout(timeoutevent arg0) { public void processioexception(ioexceptionevent e) { System.out.println("Une IOException a été levée: " + e.gethost() + " port = " + e.getport()); public void processtransactionterminated(transactionterminatedevent e) { System.out.println("L'événement Fin de transaction a été reçu"); public void processdialogterminated(dialogterminatedevent e) { System.out.println("L'événement Fin de dialogue a été reçu"); * Accesseur de l'objet L'UACsip instancié au début de l'application L'UACsip public UACsip getuac() { return uacsip; * Accesseur de l'objet L'UASsip instancié au début de l'application L'UACSip public UASsip getuas() { return uassip;
35 * Accesseur de l'objet AudioClip sonnerie (qui retentit lors d'un appel) la sonnerie public AudioClip getsonnerie() { return sonnerie; * Méthode qui permet de couper la sonnerie public void coupesonnerie() { sonnerie.stop(); * Méthode qui de mettre la variable decroche sur -true- (lorsque l'utilisateur a decroché) public void setdecroche() { decroche = true; * Accesseur de la variable premierinvite (util pour savoir quand déclencher le "loop" de la sonnerie) premierinvite * Si -true- un seul ou aucun INVITE a été envoyé * Sinon au moins deux public int getnbinvite() { return nbinvite; * Méthode qui de mettre la variable nbinvite à 0 public void resetnbinvite() { nbinvite = 0; public void rejet() throws ParseException, SipException, InvalidArgumentException { uassip.sendindispo(requesteventinvite);
36 La classe UACsip : import gov.nist.javax.sip.header.sipheadernames; import gov.nist.javax.sip.header.wwwauthenticate; import gov.nist.javax.sip.message.sipmessage; import java.net.inetaddress; import java.net.unknownhostexception; import java.text.parseexception; import java.util.*; import javax.sip.*; import avignon.iup.codec.utils; import avignon.iup.rtpsession.avcustomrecv; import avignon.iup.rtpsession.avcustomtrans; * L'interface USER AGENT CLIENT, cette classe permet de produire et envoyer les requêtes SIP * telles que les messages REGISTER, INVITE, BYE, CANCEL, etc. toulims public class UACsip { private SipProvider sipprovider; private AddressFactory addressfactory; private MessageFactory messagefactory; private HeaderFactory headerfactory; private ContactHeader contactheader; private ClientTransaction invitetid; private Dialog dialog; private String IP; private static String transport = "udp"; private String USER_AUTH; private String PASS_AUTH; private String realm; private String monpseudo; private SipGUI sipgui; private AVCustomTrans av=null; private AVCustomRecv rc=null; private boolean essaiinvite = false; private boolean encom = false; private boolean cancelclik = false; long invco = 1; long regco = 1; private int portlibreaudio; private int portlibrevideo;
37 * Cette méthode permet d'initialiser différentes variables permettant l'échange de messages SIP, * de créer des relations avec le SipProvider et l'interface graphique sipprovider Instance de l'objet SipProvider créé dans la classe UA, il est associé à un ListeningPoint sipgui Instance de la fenêtre principale de l'interface graphique UnknownHostException PeerUnavailableException TransportNotSupportedException InvalidArgumentException ObjectInUseException TooManyListenersException Exception public void init(sipprovider sipprovider, SipGUI sipgui) throws UnknownHostException, PeerUnavailableException, TransportNotSupportedException, InvalidArgumentException, ObjectInUseException, TooManyListenersException, Exception { l'audio vidéo System.out.println("Initialisation de l'uac... "); IP = ""+InetAddress.getLocalHost().getHostAddress(); portlibreaudio = Utils.getAvailablePort(); // Selection d'un port libre pour System.err.println("Port Libre pour l'audio: "+portlibreaudio); portlibrevideo = Utils.getAvailablePort(); // Selection d'un port libre pour la System.err.println("Port Libre pour la video: "+portlibrevideo); this.sipgui = sipgui; this.sipprovider = sipprovider; // Extraction du fichier sauvegarde des paramètre du compte SIP USER_AUTH = (String)sipGUI.getInterfaceSauvegarde().getVecteurCompte().get(2); PASS_AUTH = (String)sipGUI.getInterfaceSauvegarde().getVecteurCompte().get(3); realm = (String)sipGUI.getInterfaceSauvegarde().getVecteurCompte().get(4); monpseudo = (String)sipGUI.getInterfaceSauvegarde().getVecteurCompte().get(0); av = null; rc = null; invitetid = null; dialog = null; invco = 1; regco = 1; SipFactory sipfactory = null; // Instanciation des objets permettant la contruction des messages SIP sipfactory = SipFactory.getInstance(); headerfactory = sipfactory.createheaderfactory();
38 addressfactory = sipfactory.createaddressfactory(); messagefactory = sipfactory.createmessagefactory(); * Cette méthode permet de ré-initialiser les variables par exemple lors de la terminaison d'un appel PeerUnavailableException public void reset() throws PeerUnavailableException { av = null; rc = null; essaiinvite = false; encom = false; cancelclik = false; invitetid = null; dialog = null; invco = 1; regco = 1; SipFactory sipfactory = null; sipfactory = SipFactory.getInstance(); headerfactory = sipfactory.createheaderfactory(); addressfactory = sipfactory.createaddressfactory(); messagefactory = sipfactory.createmessagefactory(); sipgui.gettextarea().settext("prêt à composer..."); * Cette méthode traite les messages textes SIP entrant (RFC) request La servertransactionid Exception public void processmessage(request request, ServerTransaction servertransactionid) throws Exception { System.out.println("Message: "+request); if (servertransactionid == null) { // Problème si la requête reçue ne contient pas d'informations System.out.println("TID null."); // sur la transaction serveur return; // Mise à jour de la trace avec les inforamtions sur l'état du Dialogue Dialog dialog = servertransactionid.getdialog(); System.out.println("Etat du Dialogue = " + dialog.getstate()); Response response = messagefactory.createresponse(200, request); servertransactionid.sendresponse(response); System.out.println("Envoi du message OK."); System.out.println("Etat du Dialogue = " + dialog.getstate());
39 * Cette méthode créé le message INVITE et l'envoi au destinataire ou proxy callid est un numéro permettant de distinguer un appel SIP d'un autre * Lors du premier Invite, celui-ci est nul adressecontact L'adresse URI du contact à appelé Le callid qui a été généré Exception public String creerinvite(string callid, String adressecontact) throws Exception{ String fromname = USER_AUTH; String fromsipaddress = realm; String fromdisplayname = monpseudo; //Ajout dans l'historique des appels Vector<String> tmp = new Vector<String>();; GregorianCalendar c = new GregorianCalendar(); int mois = c.get(calendar.month) + 1; String date = c.get(calendar.day_of_month) + "/" + mois + "/" + c.get(calendar.year) + " " + c.get(calendar.hour_of_day) + ":" + c.get(calendar.minute) + ":" + c.get(calendar.second); String pseudo = "Appelé le"; String type = "sortant"; tmp.add(pseudo); tmp.add(date); tmp.add(adressecontact); tmp.add(type); try { sipgui.getinterfacehistorique().sauvegardehistorique(tmp); catch (Exception e1) { e1.printstacktrace(); // Entete FROM SipURI fromaddress = addressfactory.createsipuri(fromname,fromsipaddress); Address fromnameaddress = addressfactory.createaddress(fromaddress); fromnameaddress.setdisplayname(fromdisplayname); FromHeader fromheader = headerfactory.createfromheader(fromnameaddress, " "); // " " est un TagId // Entete TO String[] temp = adressecontact.split("@"); //SipURI toaddress = addressfactory.createsipuri(touser, tosipaddress); //Address tonameaddress = addressfactory.createaddress(toaddress); SipURI toaddress = addressfactory.createsipuri(temp[0], temp[1]); Address tonameaddress = addressfactory.createaddress(toaddress); tonameaddress.setdisplayname(pseudo);
40 ToHeader toheader = headerfactory.createtoheader(tonameaddress,null); // Creation de l'uri SipURI requesturi = addressfactory.createsipuri(temp[0], temp[1]); // Entete VIA ArrayList<ViaHeader> viaheaders = new ArrayList<ViaHeader>(); ViaHeader viaheader = headerfactory.createviaheader(ip, sipprovider.getlisteningpoint(transport).getport(),transport, null); // add via headers viaheaders.add(viaheader); // Entete CONTENTTYPE ContentTypeHeader contenttypeheader = headerfactory.createcontenttypeheader("application", "sdp"); // Entete CALLID CallIdHeader callidheader; callidheader = sipprovider.getnewcallid(); if (callid.trim().length()>0) callidheader.setcallid(callid); // Entete CSEQ CSeqHeader cseqheader = headerfactory.createcseqheader(invco,request.invite); // Entete MAXFORWARDS MaxForwardsHeader maxforwards = headerfactory.createmaxforwardsheader(99); // Creation de la requete Request request = messagefactory.createrequest(requesturi, Request.INVITE, callidheader, cseqheader, fromheader, toheader, viaheaders, maxforwards); // Entete CONTACT String host = IP; SipURI contacturl = addressfactory.createsipuri(fromname, host); contacturl.setport(sipprovider.getlisteningpoint("udp").getport()); // Creation du contact URI SipURI contacturi = addressfactory.createsipuri(fromname, host); contacturi.setport(sipprovider.getlisteningpoint(transport).getport()); Address contactaddress = addressfactory.createaddress(contacturi); // Ajout de l'adresse du contact contactaddress.setdisplayname(fromname); contactheader = headerfactory.createcontactheader(contactaddress); request.addheader(contactheader);
41 // Creation du message SDP String sdpdata = "v=0\r\n" + "o=- 2 2" + " IN IP4 "+IP+"\r\n" + "s=mysessionssession\r\n" + "c=in IP4 "+IP+"\r\n" + "t=0 0\r\n" + "m=audio " + portlibreaudio + " RTP/AVP \r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:110 SPEEX/8000\r\n" + "a=rtpmap:98 ilbc/8000\r\n" + "m=video " + portlibrevideo + " RTP/AVP 31\r\n" + "a=rtpmap:31 H261/90000\r\n" + "a=nortpproxy:yes\r\n" //+ "a=ptime:20\r\n"; + "a=sendrecv\r\n"; byte[] contents = sdpdata.getbytes(); request.setcontent(contents, contenttypeheader); Header callinfoheader = headerfactory.createheader("call- Info","< request.addheader(callinfoheader); SIP) // On cree la transaction client invitetid = sipprovider.getnewclienttransaction(request); // On envoi la requete invitetid.sendrequest(); essaiinvite = true; System.out.println("INVITE envoyé:\n" + request); dialog = invitetid.getdialog(); System.out.println("Dialog apres INVITE: "+dialog); // On retourne le CallId généré plus haut (car l'invite est le premier échange return callidheader.getcallid(); * Cette méthode créé le message REGISTER et l'envoi Registar callid Ici null La requête SIP REGISTER Exception public Request creerregister(string callid) throws Exception{ //sipgui.gettextarea().settext("enregistrement de l'utilisateur"+user_auth+" sur "+realm+"..."); String fromname = USER_AUTH; String fromsipaddress = realm; String fromdisplayname = monpseudo; String tosipaddress = realm;
42 String touser = USER_AUTH; String todisplayname = monpseudo; // Entete FROM SipURI fromaddress = addressfactory.createsipuri(fromname,fromsipaddress); Address fromnameaddress = addressfactory.createaddress(fromaddress); fromnameaddress.setdisplayname(fromdisplayname); FromHeader fromheader = headerfactory.createfromheader(fromnameaddress, " "); // Entete TO SipURI toaddress = addressfactory.createsipuri(touser, tosipaddress); Address tonameaddress = addressfactory.createaddress(toaddress); tonameaddress.setdisplayname(todisplayname); ToHeader toheader = headerfactory.createtoheader(tonameaddress,null); // Creation de l'uri SipURI requesturi = addressfactory.createsipuri(null, realm); // Entete VIA ArrayList<ViaHeader> viaheaders = new ArrayList<ViaHeader>(); ViaHeader viaheader = headerfactory.createviaheader(ip, sipprovider.getlisteningpoint(transport).getport(),transport, null); // add via headers viaheaders.add(viaheader); // Entete CALLID CallIdHeader callidheader; callidheader = sipprovider.getnewcallid(); sipgui.setcallid(callidheader.getcallid()); if (callid.trim().length()>0) { System.out.println("test callid"); callidheader.setcallid(callid); // Entete CSEQ CSeqHeader cseqheader = headerfactory.createcseqheader(regco,request.register); // Entete MAXFORWARDS MaxForwardsHeader maxforwards = headerfactory.createmaxforwardsheader(99); // Creation de la requete Request request = messagefactory.createrequest(requesturi, Request.REGISTER, callidheader, cseqheader, fromheader,
43 toheader, viaheaders, maxforwards); // Entete CONTACT String host = IP; SipURI contacturl = addressfactory.createsipuri(fromname, host); contacturl.setport(sipprovider.getlisteningpoint("udp").getport()); // Creation du contact URI SipURI contacturi = addressfactory.createsipuri(fromname, host); contacturi.setport(5060); Address contactaddress = addressfactory.createaddress(contacturi); // Ajout de l'adresse du contact contactaddress.setdisplayname(fromname); contactheader = headerfactory.createcontactheader(contactaddress); request.addheader(contactheader); Header callinfoheader = headerfactory.createheader("call- Info","< request.addheader(callinfoheader); return request; * Cette méthode créé le message BYE pour mettre fin à un appel callid est un numéro permettant de distinguer un appel SIP d'un autre adressecontact SipException public void creerbye(string callid, String adressecontact) throws SipException{ Request byerequest = dialog.createrequest(request.bye); ClientTransaction ct = sipprovider.getnewclienttransaction(byerequest); // Le message BYE est envoyé grâce aux informations contenu // dans l'objet dialog (mis à jour à chaque échange SIP) dialog.sendrequest(ct); public void creercancel(string callid, String adressecontact) throws SipException { sipgui.gettextarea().settext("annulation en cours..."); Request cancelrequest = invitetid.createcancel(); // L'envoi d'un message CANCEL doit se trouver dans une nouvelle transaction invitetid = sipprovider.getnewclienttransaction(cancelrequest); invitetid.sendrequest(); // Si le streaming RTP a eu le temps de s'ouvrir, on le ferme if(av!=null && rc!=null) { av.stop(); rc.close();
44 sipgui.getua().resetnbinvite(); // On re-initialise l'uac et l'uas reset(); sipgui.getua().getuas().reset(); cancelclik = true; * Classe permettant de re-envoyer le message REGISTER contenant le hachage MD5 si celui-ci est requis response La reponse SIP à une précédente requête REGISTER où était requis un champs d'authentification urireq L'adresse URI du Registrar La requête REGISTER avec le champs d'authentification public Request processresponseauthorization(response response, URI urireq){ Request requestauth = null; try { System.out.println("processResponseAuthorization()"); String schema = ((WWWAuthenticate)(response.getHeader(SIPHeaderNames.WWW_AUTHENTICATE))).g etscheme(); String nonce = ((WWWAuthenticate)(response.getHeader(SIPHeaderNames.WWW_AUTHENTICATE))).g etnonce(); AuthorizationHeader proxyauthheader = headerfactory.createauthorizationheader(schema); proxyauthheader.setrealm(realm); proxyauthheader.setnonce(nonce); proxyauthheader.setalgorithm("md5"); proxyauthheader.setusername(user_auth); proxyauthheader.seturi(urireq); DigestClientAuthenticationMethod digest=new DigestClientAuthenticationMethod(); //CSeqHeader cseqheader=(cseqheader)response.getheader(cseqheader.name); //if (cseqheader.getmethod().equals(request.invite)){ String callid = ((CallIdHeader) response.getheader(callidheader.name)).getcallid(); requestauth = this.creerregister(callid); digest.initialize(realm,user_auth,urireq.tostring(),nonce,pass_auth,((cseqheader) response.getheader(cseqheader.name)).getmethod(),null,"md5"); System.out.println("Proxy Response antes de modificarlo : " + proxyauthheader.getresponse()); String respuestam = digest.generateresponse(); proxyauthheader.setresponse(respuestam);
45 requestauth.addheader(proxyauthheader); // catch (ParseException pa){ System.out.println("processResponseAuthorization() ParseException:"); System.out.println(pa.getMessage()); pa.printstacktrace(); catch (Exception ex){ System.out.println("processResponseAuthorization() Exception:"); System.out.println(ex.getMessage()); ex.printstacktrace(); return requestauth; * Cette méthode traite toutes les réponses éventuelles aux requêtes envoyéés reponserecue La réponse (encapsulée dans un événement) reçue par le SipListener public void processresponse(responseevent reponserecue) { " + cseq ); System.out.println("Une réponse a été reçue..."); Response response = (Response) reponserecue.getresponse(); // Extraction de l'objet Transaction Client contenu dans la réponse reçue ClientTransaction tid = reponserecue.getclienttransaction(); CSeqHeader cseq = (CSeqHeader) response.getheader(cseqheader.name); dialog=(dialog)tid.getdialog(); System.out.println("Response reçue : Status = "+ response.getstatuscode() + " // MàJ du texte dans l'écran de l'interface graphique sipgui.getlabelbas().settext(""+response.getstatuscode()+ " " + cseq); if (tid == null) { System.out.println("Réponse parasite"); return; //System.out.println("transaction state is " + tid.getstate()); //System.out.println("Dialog = " + tid.getdialog()); //System.out.println("Dialog State is " + tid.getdialog().getstate()); try { // Si la réponse est un OK if (response.getstatuscode() == Response.OK) { // Si la réponse est un OK a une requete INVITE if (cseq.getmethod().equals(request.invite) && cancelclik==false) { Request ackrequest = dialog.createrequest(request.ack); System.out.println("Sending ACK");
46 // Envoi d'un ACK dialog.sendack(ackrequest); response); String IPrtp = UtilSDP.getIP((SIPMessage) response); String Portrtp = ""+UtilSDP.getPortAudio((SIPMessage) System.out.println("SDP recu:"); UtilSDP.afficherSDP((SIPMessage) response); System.out.println(UtilSDP.getCodecChoisi((SIPMessage) response)); String codecchoisi = UtilSDP.getCodecChoisi((SIPMessage) response); av = new AVCustomTrans (IPrtp, Portrtp, codecchoisi); rc = new AVCustomRecv (IP, portlibreaudio, 50); // On démarre la réception et l'émission RTP Thread tone = new Thread (av); Thread ttwo = new Thread (rc); tone.start(); ttwo.start(); sipgui.gettextarea().settext("en communication...\n"+"codec Audio: "+codecchoisi); encom = true; composer..."); // Si la réponse est un OK a une requete REGISTER if (cseq.getmethod().equals(request.register)) { sipgui.gettextarea().settext("utilisateur enregistré"); sipgui.getlabelbas().settext("enregistré...prêt à // Si la réponse est un OK a une requete BYE if (cseq.getmethod().equals(request.bye)) { System.out.println("OK reçue pour la requete BYE..."); if(encom){ //UAC a initialisé l'appel System.out.println("Ici..."); // On ferme le streaming RPT instancié par l'uac av.stop(); rc.close(); // On ré-initialise l'uac et l'uas sipgui.getua().getuas().reset(); sipgui.getua().resetnbinvite(); reset(); else { //UAS a initialisé l'appel // On ferme le streaming RPT instancié par l'uas sipgui.getua().getuas().gettrans().stop(); sipgui.getua().getuas().getrecv().close(); sipgui.getua().getuas().reset();
47 sipgui.getua().resetnbinvite(); reset(); the dialog. // Si la réponse est un OK a une requete CANCEL else if (cseq.getmethod().equals(request.cancel)) { if (dialog.getstate() == DialogState.CONFIRMED) { // oops cancel went in too late. Need to hang up /*System.out.println("Envoi du message BYE"); Request byerequest = dialog.createrequest(request.bye); ClientTransaction ct = sipprovider.getnewclienttransaction(byerequest); dialog.sendrequest(ct); if(av!=null && rc!=null) { av.stop(); rc.close(); reset(); sipgui.getua().resetnbinvite(); sipgui.getua().getuas().reset(); // Si la reponse est un PROXY_AUTHENTICATION_REQUIRED (du registar) else if ( response.getstatuscode()==response.proxy_authentication_required response.getstatuscode()==response.unauthorized) { URI urireq = tid.getrequest().getrequesturi(); // On récupere la requête REGISTER avec le champs d'authentification généré Request authrequest = processresponseauthorization(response, urireq); invitetid = sipprovider.getnewclienttransaction(authrequest); invitetid.sendrequest(); System.out.println("Message REGISTER avec authorisation envoyé:\n"+authrequest); regco++; catch (Exception ex) {ex.printstacktrace();system.exit(0); * Traite les exceptions d'entréé/sortie e L'événement exception public void processioexception(ioexceptionevent e) {
48 e.getport()); System.out.println("Une IOException a été levée: " + e.gethost() + " port = " + * Traite la fin d'une transaction e L'événement fin de transaction public void processtransactionterminated(transactionterminatedevent e) { System.out.println("L'événement Fin de transaction a été reçu"); * Traite la fin d'un dialogue e L'événement fin de dialogue public void processdialogterminated(dialogterminatedevent e) { System.out.println("L'événement Fin de dialogue a été reçu"); * Accesseur de la variable encom encom * Si -true- une communication est en cours * Sinon aucune communication public boolean getencom() { return encom; * Accesseur de l'objet servant à la transmission RTP L'AVCustomTrans public AVCustomTrans gettrans() { return av; * Accesseur de l'objet servant à la réception RTP L'AVCustomRecv public AVCustomRecv getrecv() { return rc; * Accesseur de la variable essaiinvite essaiinvite * Si -true- l'application à essaye d'effectuer un appel
49 * Sinon aucune activité public boolean getessaiinvite() { return essaiinvite;
50 La classe UASsip : import gov.nist.javax.sip.message.sipmessage; import java.net.inetaddress; import java.text.parseexception; import java.util.calendar; import java.util.gregoriancalendar; import java.util.vector; import javax.sip.*; import avignon.iup.codec.utils; import avignon.iup.rtpsession.avcustomrecv; import avignon.iup.rtpsession.avcustomtrans; * L'interface USER AGENT SERVER, cette classe permet de traiter et envoyer les réponses aux requêtes SIP reçues toulims public class UASsip { private static AddressFactory addressfactory; private static MessageFactory messagefactory; private static HeaderFactory headerfactory; private static String myaddress = ""; private static final int myport = 5060; private String IP; protected ServerTransaction invitetid; private Response okresponse; private Request inviterequest; private Dialog dialog; private SipProvider sipprovider; private AVCustomTrans av=null; private AVCustomRecv rc=null; private String IPrtp; private String Portrtp; private int portlibreaudio; private int portlibrevideo; private boolean encom = false; private SipGUI sipgui; * Cette méthode permet d'initialiser différentes variables permettant l'échange de messages SIP, * de créer des relations avec le SipProvider et l'interface graphique sipprovider Instance de l'objet SipProvider créé dans la classe UA, il est associé à un ListeningPoint sipgui Instance de la fenêtre principale de l'interface graphique Exception
51 public void init(sipprovider sipprovider, SipGUI sipgui) throws Exception { l'audio vidéo IP = ""+InetAddress.getLocalHost().getHostAddress(); System.out.println("UAS initialisé..."); portlibreaudio = Utils.getAvailablePort(); // Selection d'un port libre pour System.err.println("Port Libre pour l'audio: "+portlibreaudio); portlibrevideo = Utils.getAvailablePort(); // Selection d'un port libre pour la System.err.println("Port Libre pour la video: "+portlibrevideo); this.sipgui = sipgui; this.sipprovider = sipprovider; av = null; rc = null; dialog = null; invitetid = null; // Instanciation des objets permettant la contruction des messages SIP SipFactory sipfactory = null; sipfactory = SipFactory.getInstance(); headerfactory = sipfactory.createheaderfactory(); addressfactory = sipfactory.createaddressfactory(); messagefactory = sipfactory.createmessagefactory(); myaddress = ""+InetAddress.getLocalHost().getHostAddress(); * Cette méthode permet de ré-initialiser les variables par exemple lors de la terminaison d'un appel PeerUnavailableException public void reset() throws PeerUnavailableException { av = null; rc = null; encom = false; dialog = null; invitetid = null; SipFactory sipfactory = null; sipfactory = SipFactory.getInstance(); headerfactory = sipfactory.createheaderfactory(); addressfactory = sipfactory.createaddressfactory(); messagefactory = sipfactory.createmessagefactory(); sipgui.gettextarea().settext("utilisateur enregistré"); * Permet juste de vérifier que la reqête ACK à été reçue
52 * car cette requête n'attend aucune réponse requestevent La requête encapsulée dans un événement public void processack(requestevent requestevent) { System.out.println("Requete ACK recue! "); System.out.println("Dialog State = " + dialog.getstate()); * Méthode qui traite un message INVITE et y répond par un message OK * Elle extrait aussi les Codecs du SDP contenu dans le message et lance l'émission et la réception RTP requestevent La requête encapsulée dans un événement servertransaction Objet représentant une transaction (coté serveur) Exception public void processinvite(requestevent requestevent, ServerTransaction servertransaction) throws Exception { SipProvider sipprovider = (SipProvider) requestevent.getsource(); Request request = requestevent.getrequest(); // Ajout dans l'historique des appels Vector<String> tmp = new Vector<String>();; GregorianCalendar c = new GregorianCalendar(); int mois = c.get(calendar.month) + 1; String date = c.get(calendar.day_of_month) + "/" + mois + "/" + c.get(calendar.year) + " " + c.get(calendar.hour_of_day) + ":" + c.get(calendar.minute) + ":" + c.get(calendar.second); FromHeader tfromheader = (FromHeader) request.getheader(fromheader.name); String pseudo = "Reçu le"; String adresse = tfromheader.getaddress().geturi().tostring(); System.out.println("Test de l'adresse"); System.out.println(adresse); adresse.replaceall("sip:",""); System.out.println(adresse); String type = "entrant"; tmp.add(pseudo); tmp.add(date); tmp.add(adresse); tmp.add(type); try { sipgui.getinterfacehistorique().sauvegardehistorique(tmp); catch (Exception e1) { e1.printstacktrace(); // Extraction des informations de connexion RTP contenu dans le SDP IPrtp = UtilSDP.getIP((SIPMessage) request); Portrtp = ""+UtilSDP.getPortAudio((SIPMessage) request);
53 System.out.println("SDP recu de l'appelant:"); UtilSDP.afficherSDP((SIPMessage) request); Response response = messagefactory.createresponse(response.trying, request); ServerTransaction st = requestevent.getservertransaction(); if (st == null) { // Generation d'un nouvel objet Transaction serveur st = sipprovider.getnewservertransaction(request); dialog = st.getdialog(); st.sendresponse(response); // Choix du meilleur Codecs parmi ceux en commun aux deux applications String codec = UtilSDP.getCodecChoisi((SIPMessage) request); String ligne=""; if(!codec.equals("echec")) { if(codec.equals("ulaw/rtp")) { ligne = "a=rtpmap:0 PCMU/8000\r\n"; if(codec.equals("speex/rtp")) { ligne = "a=rtpmap:110 SPEEX/8000\r\n"; if(codec.equals("ilbc/rtp")) { ligne = "a=rtpmap:98 ilbc/8000\r\n"; ContentTypeHeader contenttypeheader = headerfactory.createcontenttypeheader("application", "sdp"); // Construction du SDP String sdpdata = "v=0\r\n" + "o=- 2 2" + " IN IP4 "+IP+"\r\n" + "s=mysessionssession\r\n" + "c=in IP4 "+IP+"\r\n" + "t=0 0\r\n" + "m=audio " + portlibreaudio + " RTP/AVP "+codec+"\r\n" + ligne + "m=video " + portlibrevideo + " RTP/AVP 31\r\n" + "a=rtpmap:31 H261/90000\r\n" + "a=nortpproxy:yes\r\n" //+ "a=ptime:20\r\n"; + "a=sendrecv\r\n"; byte[] contents = sdpdata.getbytes(); this.okresponse = messagefactory.createresponse(response.ok, request, contenttypeheader, contents); Address address = addressfactory.createaddress("shootme <sip:" + myaddress + ":" + myport + ">"); ContactHeader contactheader = headerfactory.createcontactheader(address);
54 response.addheader(contactheader); ToHeader toheader = (ToHeader) okresponse.getheader(toheader.name); toheader.settag("4321"); // Application is supposed to set. okresponse.addheader(contactheader); this.invitetid = st; this.inviterequest = request; // Envoi de la réponse OK à l'invite reçue st.sendresponse(okresponse); String codecchoisi ="ULAW/rtp"; av = new AVCustomTrans (IPrtp, Portrtp, Utils.ULAW_RTP); rc = new AVCustomRecv (IP, portlibreaudio, 50); // On démarre le streaming RTP Thread tone = new Thread (av); Thread ttwo = new Thread (rc); tone.start(); ttwo.start(); sipgui.gettextarea().settext("en communication...\n"+"codec Audio: "+codecchoisi); encom = true; else { sipgui.getlabelbas().settext("echec negociation codecs..."); Cette méthode créé le message BYE pour mettre fin à un appel callid est un numéro permettant de distinguer un appel SIP d'un autre adressecontact SipException public void creerbye(string callid, String adressecontact) throws Exception{ Request byerequest = dialog.createrequest(request.bye); ClientTransaction ct = sipprovider.getnewclienttransaction(byerequest); dialog.sendrequest(ct); /*public void sendinviteok() { try { if (invitetid.getstate()!= TransactionState.COMPLETED) { System.out.println("shootme: Dialog state before 200: " + invitetid.getdialog().getstate()); invitetid.sendresponse(okresponse); System.out.println("shootme: Dialog state after 200: " + invitetid.getdialog().getstate()); catch (SipException ex) { ex.printstacktrace(); catch (InvalidArgumentException ex) { ex.printstacktrace();
55 public void sendindispo(requestevent requestevent) throws ParseException, SipException, InvalidArgumentException { Response response = messagefactory.createresponse(response.busy_everywhere, requestevent.getrequest()); ServerTransaction st = requestevent.getservertransaction(); if (st == null) { // Generation d'un nouvel objet Transaction serveur st = sipprovider.getnewservertransaction(requestevent.getrequest()); dialog = st.getdialog(); st.sendresponse(response); public void processbye(request request, ServerTransaction servertransactionid) throws Exception { System.out.println("L'interlocuteur a mis fin à l'appel..."); if (servertransactionid == null) { System.out.println("TID null."); return; Dialog dialog = servertransactionid.getdialog(); System.out.println("Etat du Dialogue = " + dialog.getstate()); Response response = messagefactory.createresponse(200, request); servertransactionid.sendresponse(response); System.out.println("Envoi du message OK."); System.out.println("Etat du Dialogue = " + dialog.getstate()); if(encom==true){ // UAS a initialisé l'appel av.stop(); rc.close(); sipgui.getua().getuac().reset(); sipgui.getua().resetnbinvite(); reset(); else { // UAC a initialisé l'appel sipgui.getua().getuac().gettrans().stop(); sipgui.getua().getuac().getrecv().close(); sipgui.getua().getuac().reset(); sipgui.getua().resetnbinvite(); reset(); * Méthode qui traite un message CANCEL et y répond par un message OK
56 * Elle se charge aussi de stoper le streaming RTP si celui-ci a été lancé requestevent La requête encapsulée dans un événement servertransactionid Objet représentant une transaction (coté serveur) PeerUnavailableException public void processcancel(requestevent requestevent, ServerTransaction servertransactionid) throws PeerUnavailableException { //SipProvider sipprovider = (SipProvider) requestevent.getsource(); Request request = requestevent.getrequest(); try { System.out.println("shootme: got a cancel."); if (servertransactionid == null) { System.out.println("shootme: null tid."); return; Response response = messagefactory.createresponse(200, request); servertransactionid.sendresponse(response); if (dialog.getstate()!= DialogState.CONFIRMED) { response = messagefactory.createresponse( Response.REQUEST_TERMINATED, inviterequest); // Envoi de la réponse OK invitetid.sendresponse(response); catch (Exception ex) { ex.printstacktrace(); System.exit(0); // Fermeture du streaming RTP av.stop(); rc.close(); reset(); sipgui.getua().resetnbinvite(); sipgui.getua().getuac().reset(); /*public void processok(request request, ServerTransaction servertransactionid) throws Exception { /*public void processtimeout(javax.sip.timeoutevent timeoutevent) { Transaction transaction; if (timeoutevent.isservertransaction()) { transaction = timeoutevent.getservertransaction(); else { transaction = timeoutevent.getclienttransaction(); System.out.println("state = " + transaction.getstate());
57 System.out.println("dialog = " + transaction.getdialog()); System.out.println("dialogState = " + transaction.getdialog().getstate()); System.out.println("Transaction Time out"); * Accesseur de l'objet servant à la transmission RTP L'AVCustomTrans public AVCustomTrans gettrans() { return av; * Accesseur de l'objet servant à la réception RTP L'AVCustomRecv public AVCustomRecv getrecv() { return rc; * Accesseur de la variable encom encom * Si -true- une communication est en cours * Sinon aucune communication public boolean getencom() { return encom;
58 La classe UtilSDP : import gov.nist.javax.sip.message.sipmessage; import java.util.vector; import javax.sdp.*; * Cette classe posséde un ensemble de méthodes pour traiter les messages SDP, extraire certaines lignes, * les codecs, etc. toulims public class UtilSDP { public static SdpFactory sdpf; * Permet d'afficher dans le System.out simplement le contenu du message SDP message Le message SIP (requête ou réponse) contenant du SDP SdpParseException public static void affichersdp(sipmessage message) throws SdpParseException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); System.out.println(sd.toString()); System.out.println(sd.getConnection().getAddress()); * Permet d'extraire l'adresse IP de l'hôte en vue de l'envoi du flux RTP message Le message SIP (requête ou réponse) contenant du SDP L'adresse IP de l'hôte SdpParseException public static String getip(sipmessage message) throws SdpParseException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); System.out.println(sd.getConnection().getAddress()); return sd.getconnection().getaddress(); * Permet d'extraire le port choisi pour l'audio de l'hôte en vue de l'envoi du flux RTP message Le message SIP (requête ou réponse) contenant du SDP
59 Le port audio de l'hôte SdpException public static int getportaudio(sipmessage message) throws SdpException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); System.out.println(((MediaDescription)sd.getMediaDescriptions(true).get(0)).getMedia().get MediaPort()); return ((MediaDescription)sd.getMediaDescriptions(true).get(0)).getMedia().getMediaPort(); * Permet d'extraire le port choisi pour la vidéo de l'hôte en vue de l'envoi du flux RTP message Le message SIP (requête ou réponse) contenant du SDP Le port vidéo de l'hôte SdpException public static int getportvideo(sipmessage message) throws SdpException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); if(sd.getmediadescriptions(true).size()<1){ System.out.println(((MediaDescription)sd.getMediaDescriptions(true).get(1)).getMedia().get MediaPort()); return ((MediaDescription)sd.getMediaDescriptions(true).get(1)).getMedia().getMediaPort(); else return 1; /* public static void getaudiocodecs(sipmessage message) throws SdpException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); Vector v = ((MediaDescription)sd.getMediaDescriptions(true).get(0)).getMedia().getMediaFormats(true) ; for(int i=0;i<v.size();i++) { System.out.println(((String)v.get(i)));
60 * Méthode permettant de retourner le Codec choisi par l'application (par rapport aux codecs disponibles de l'appelant) message Le message SIP (requête ou réponse) contenant du SDP Le Codec choisi SdpException public static String getcodecchoisi(sipmessage message) throws SdpException { sdpf = SdpFactory.getInstance(); byte[] content = ( (byte[]) ( (SIPMessage) message).getcontent() ); String temp = new String(content); SessionDescription sd = sdpf.createsessiondescription(temp); Vector listecodecs = ((MediaDescription)sd.getMediaDescriptions(true).get(0)).getMedia().getMediaFormats(true) ; if(listecodecs.contains("0")) { return "ULAW/rtp"; else if(listecodecs.contains("110")) { return "speex/rtp"; else if (listecodecs.contains("98")) { return "ilbc/rtp"; else return "echec"; // Pas le choix pour la video -> un seul codec
61 Les classes de la partie vidéo : 1. La classe CaptureVideo : package video_; import java.awt.choice; import java.awt.color; import java.awt.flowlayout; import java.awt.gridlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.itemevent; import java.awt.event.itemlistener; import java.io.file; import java.net.inetaddress; import java.util.vector; import javax.media.capturedeviceinfo; import javax.media.capturedevicemanager; import javax.media.format; import javax.media.manager; import javax.media.format.videoformat; import javax.media.protocol.datasource; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import Interface.ImagePanel; ************************************************************************* ******** * La Classe qui permet de détecter les péripheriques (webcam) de capture de vidéo * choisir dans une liste le péripherique à utliser et aussi de retourner les * selections dans les listes deroulantes *************************************************************************** ******* public class CaptureVideo extends JFrame implements ActionListener, ItemListener { private static final long serialversionuid = 1L; JFrame win; boolean configurationchange = false; Vector devices;
62 Vector videodevices; Vector videoformats; Choice webcamcombo; Choice videoformatcombo; CaptureDeviceInfo videocdi = null; String videodevicename = null; Format videoformat; DataSource ds = null; DataSource[] datasources = null; InetAddress addr = null; ************************************************************************* ******** * Dans le constructeur on crée la fenêtre qui affiche les listes des peripheriques * detectés et la format de le vidéo dans des listes déroulantes ainsi que les * boutons de validation des choix *************************************************************************** ******* public CaptureVideo() { // ******* La fenêtre d'affichage ******* super("choix de périphérique"); this.setsize(480, 140); this.setlayout(new GridLayout(1, 1)); // Création et ajout du Panel "p" à la Frame File file = new File("fond3.jpg"); ImagePanel P = new ImagePanel(file,0,0,480, 140); this.add(p); P.setLayout(new GridLayout(2,1)); JPanel p = new JPanel(); p.setlayout(new GridLayout(2,4)); p.setopaque(false); P.add(p); panel JLabel l2 = new JLabel("WebCam(s) disponible(s)"); l2.setopaque(false); l2.setforeground( Color.WHITE ); // On ajoute les étiquettes (label), la liste déroulante (Choice) et les bouttons au p.add(l2); webcamcombo = new Choice(); p.add(webcamcombo);
63 déroulante webcamcombo.additemlistener(this); //ajout d'un ItemListenner sur la liste JLabel l4 = new JLabel("Format(s) Vidéo"); l4.setopaque(false); l4.setforeground( Color.WHITE ); p.add(l4); videoformatcombo = new Choice(); p.add(videoformatcombo); // Panel contenant les boutons ************* JPanel pp = new JPanel(); pp.setlayout(new FlowLayout (FlowLayout.RIGHT)); pp.setopaque(false); P.add(pp); JButton OKbutton = new JButton("OK"); OKbutton.setOpaque(false); OKbutton.setBackground(Color.CYAN); OKbutton.setForeground(Color.white); pp.add(okbutton); OKbutton.addActionListener(this); // Ajout d'une ecoute sur le bouton JButton cancel = new JButton("Annuler"); cancel.setopaque(false); cancel.setbackground(color.cyan); cancel.setforeground(color.white); pp.add(cancel); cancel.addactionlistener(this); // Ajout d'une ecoute sur le bouton // ****************************************** //En passant null en paramètre, on capture tous les périphériques vidéo devices = CaptureDeviceManager.getDeviceList(null); //On va ensuite les grouper CaptureDeviceInfo cdi; if (devices!= null && devices.size() > 0) { int devicecount = devices.size(); videodevices = new Vector(); Format[] formats; for (int i = 0; i < devicecount; i++) { cdi = (CaptureDeviceInfo) devices.elementat(i); formats = cdi.getformats(); for (int j = 0; j < formats.length; j++) { if (formats[j] instanceof VideoFormat) { videodevices.addelement(cdi); break;
64 //On rajoute les choix des périphériques vidéo à la liste déroulante for (int i = 0; i < videodevices.size(); i++) { cdi = (CaptureDeviceInfo) videodevices.elementat(i); webcamcombo.additem(cdi.getname()); displayvideoformats(); // end if devices!=null && devices.size>0 else { //Pas de périphériques de captures trouvés System.out.println("Pas de périphériques de captures detectés"); this.setvisible(true); void displayvideoformats() { ****************************************************************** Cette mèthode permet de récuperer tous les formats du périphérique vidéo sélectionné et de les rajouter à la liste des formats vidéo ******************************************************************* CaptureDeviceInfo cdi; videoformatcombo.removeall(); int i = webcamcombo.getselectedindex(); //i = -1 --> pas d'index sélectionné if (i!= -1) { cdi = (CaptureDeviceInfo) videodevices.elementat(i); if (cdi!= null) { Format[] formats = cdi.getformats(); videoformats = new Vector(); for (int j = 0; j < formats.length; j++) { videoformatcombo.add(formats[j].tostring()); videoformats.addelement(formats[j]); ********************************************************** * Fonction qui retourne le périphérique vidéo *********************************************************** public CaptureDeviceInfo getvideodevice() {
65 CaptureDeviceInfo cdi = null; if (webcamcombo!= null) { int i = webcamcombo.getselectedindex(); cdi = (CaptureDeviceInfo) videodevices.elementat(i); return cdi; *********************************************** * Fonction qui retourne le format video ************************************************ public Format getvideoformat() { Format format = null; if (videoformatcombo!= null) { int i = videoformatcombo.getselectedindex(); format = (Format) videoformats.elementat(i); return format; ********************************************************************* * Fonction qui permet l'affichage des formats supportés en fonction * du périphérique sélectionné ********************************************************************** public void itemstatechanged(itemevent ie) { System.out.println(ie.getSource().toString()); if (ie.getsource().equals(webcamcombo)) displayvideoformats(); ************************************************************************* ********** * Fonction qui permet de récupérer les périphériques de captures et leur configuration *************************************************************************** ********** void registerdevices() { videocdi = getvideodevice(); if (videocdi!= null) { videodevicename = videocdi.getname(); System.out.println("Nom du périphérique video: " + videodevicename);
66 //Récupération des formats sélectionnés pour créer la DataSOurce videoformat = getvideoformat(); *********************************************************************** * Fonction qui va enregistrer la validation du choix des périphériques * Lancer l'enregistrement des périphériques * Créer les DataSources * Lancer l'émission ************************************************************************ DataSource capture() { if ( videocdi==null) registerdevices(); try { if (!(videocdi == null)) { datasources = new DataSource[2]; System.out.println("Creation de DataSource"); datasources[0] = Manager.createDataSource(videoCDI.getLocator()); ds = Manager.createMergingDataSource(dataSources); else System.out.println("CDI non trouvé."); catch (Exception e) { System.out.println(e.toString()); return ds; public void actionperformed(actionevent e) { // TODO Auto-generated method stub String command = e.getactioncommand().tostring(); *************************************************************** * Action sur le bouton OK qui enregistre la validation des choix * et lance l'emission du flux en appelant la classe "Emission" **************************************************************** if (command.equals("ok")) { registerdevices(); new test1(); new Emission(capture()); this.setvisible(false); else if (command.equals("annuler"))
67 { this.setvisible(false); this.dispose(); 2. La classe test() : package video_; import java.io.ioexception; import javax.media.capturedeviceinfo; import javax.media.capturedevicemanager; import javax.media.manager; import javax.media.medialocator; import javax.media.nodatasourceexception; import javax.media.noplayerexception; import javax.media.noprocessorexception; import javax.media.player; import javax.media.protocol.datasource; import javax.swing.jframe; **************************************************************** * Cette classe crée une nouvelle fenêtre qui offre la possibilité * de vionner le flux capturé en local ***************************************************************** public class test { public test() { // récupérer le périphérique détecté CaptureDeviceInfo capturedevice = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0"); MediaLocator medialocator = capturedevice.getlocator(); try { DataSource ds = Manager.createDataSource(mediaLocator); ds.connect(); //Création d'un player connecté sur le datasource Player player = Manager.createPlayer(ds); player.realize(); //Création de la fenêtre qui affichera le résultat de la lecture JFrame frame = new JFrame("Vidéo");
68 frame.setsize(500,400); frame.getcontentpane().add(player.getvisualcomponent()); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); // Démarrage de la lecture player.start(); try { Thread.sleep(2000); catch (InterruptedException e) { e.printstacktrace(); catch (NoDataSourceException e) { e.printstacktrace(); catch (IOException e) { e.printstacktrace(); catch (NoProcessorException e) { e.printstacktrace(); catch (NoPlayerException e) { e.printstacktrace(); public static void main (String[] argv) { new test(); 3. La classe Emission() : package video_; import java.io.ioexception; import java.net.inetaddress; import java.net.unknownhostexception; import javax.media.capturedeviceinfo; import javax.media.capturedevicemanager; import javax.media.format; import javax.media.manager; import javax.media.medialocator; import javax.media.nodatasourceexception; import javax.media.noplayerexception; import javax.media.noprocessorexception; import javax.media.player; import javax.media.processor;
69 import javax.media.control.trackcontrol; import javax.media.protocol.contentdescriptor; import javax.media.protocol.datasource; import javax.media.protocol.pushbufferdatasource; import javax.media.protocol.pushbufferstream; import javax.media.rtp.rtpmanager; import javax.media.rtp.sendstream; import javax.media.rtp.sessionaddress; import javax.swing.jframe; import javax.swing.joptionpane; *************************************************************** * C'est dans cette classe qu'on crée le processor * qui encapsulera le flux vidéo et qui sera appeler et utiliser * par les sessions RTP pour transporter le flux. **************************************************************** public class Emission { private Processor Processor = null; InetAddress addr = null; public Emission(DataSource ds) { //Affichage de fenêtre de visualisation CaptureDeviceInfo capturedevice = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):0"); MediaLocator medialocator = capturedevice.getlocator(); try { //DataSource ds = Manager.createDataSource(mediaLocator); ds.connect(); Player player = Manager.createPlayer(ds); player.realize(); JFrame frame = new JFrame("Vidéo"); frame.setsize(500,400); frame.getcontentpane().add(player.getvisualcomponent()); frame.setvisible(true); frame.setdefaultcloseoperation(jframe.exit_on_close); player.start(); try { Thread.sleep(2000); catch (InterruptedException e) { e.printstacktrace();
70 /******** catch (NoDataSourceException e) { e.printstacktrace(); catch (IOException e) { e.printstacktrace(); catch (NoProcessorException e) { e.printstacktrace(); catch (NoPlayerException e) { e.printstacktrace(); //configuration de la source webcam System.out.println("Configuration de la source (webcam)"); try { //creation du processor a partir de la webcam trouvee System.out.println("Creation du processor"); Processor = Manager.createProcessor(ds);//ici on met nos datasources fusionnées catch (NoProcessorException ex) { catch (IOException ex) { //appel des differentes methodes pour l'envoi du flux video System.out.println("Configuration du processor"); this.configure(processor); System.out.println("Mise au bon format du flux"); this.setsupportedformat(processor); System.out.println("Processor pret!"); Processor = this.realize(processor); System.out.println("Demarrage du processor"); this.demarre(processor); System.out.println("Creation du RTPManager"); //this.creatertpmanager(processor); **************************************************************** Pour pouvoir transmettre un flux, le prossesor doit passer par différentes étapes, elle sont définies comme suit: ***************************************************************** **************************************************************** 1- Configuration du Processor (démultiplexe le flux d entrée et obtient des informations sur le format des données d entrée) *****************************************************************
71 public Processor configure(processor p) { //Attendre tant que le Processor n'est pas configuré. while (p.getstate() < Processor.Configured) { //Configuration du Processor p.configure(); return p; **************************************************************** 2- Mise des differentes pistes du flux dans un format supporté ***************************************************************** public void SetSupportedFormat(Processor p) { //On met la description du contenu de sortie à RAW_RTP pour limiter les formats supportés ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP); p.setcontentdescriptor(cd); //On obtient les différentes pistes du processor TrackControl track[] = p.gettrackcontrols(); for (int i = 0; i < track.length; i++) { //on obtient les formats supportés pour cette piste Format suppformats[] = track[i].getsupportedformats(); //Si il y a au moins un format supporté alors on met le premier if (suppformats.length > 0) { track[i].setformat(suppformats[0]); System.err.println("Piste " + i + " transmise au format: "+ suppformats[0].tostring()); else { track[i].setenabled(false); **************************************************************** * 3- Realisation du processor => processor pret! ***************************************************************** public Processor realize(processor p) { //Attendre tant que le Processor n'est pas réalisé. while (p.getstate() < Processor.Realized) { //Réalisation du Processor p.realize(); return p;
72 **************************************************************** 4- Demarrage du procesor ***************************************************************** public void Demarre(Processor p) { p.start(); ***************************************************************** * Transmission du flux video * * Partie RTP * ***************************************************************** **************************************************************** * Mèthode qui permet de retourner le processor private de la classe ***************************************************************** public Processor getprocess() { return this.processor; /* * Utilisation d'un RTPManager public void creatertpmanager(processor p) { 4. La classe Reception : package video_; import java.awt.borderlayout;
73 import java.awt.color; import java.io.ioexception; import java.net.inetaddress; import javax.media.cannotrealizeexception; import javax.media.manager; import javax.media.noplayerexception; import javax.media.player; import javax.media.rtp.receivestream; import javax.media.rtp.event.newreceivestreamevent; import javax.media.rtp.event.receivestreamevent; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; ****************************************** * La reception est gerée dans cette classe. ******************************************* public class Reception { private JPanel contentpanel; private JLabel label1; JFrame mainfra; public Reception() { mainfra = new JFrame("Réception"); mainfra.setsize(200,100); contentpanel = (JPanel) mainfra.getcontentpane(); contentpanel.setbackground(color.white); contentpanel.setlayout(new BorderLayout()); label1 = new JLabel("En attente d'un flux..."); contentpanel.add(label1,borderlayout.center); mainfra.setvisible(true); ************************************************************************* ******************** * Partie RTP : * Instanciation du RTPManager * Ouverture des sessions RTP. * Ajout du Listener de Reception de Stream dans le RTPManager (on attend l'arrivee d'un flux)
74 *************************************************************************** ******************** *********************************************************************** ********************** * Gestion de l évènement ReceiveStreamEvent: * Cette méthode est exécutée quand on reçoit un flux: * En premier lieu, on s'assure que c est un nouveau flux. * Ensuite, on récupère le DataSource de ce flux et on crée un Player. * Enfin, si c est un flux vidéo, on ajoute le composant visuel dans une nouvelle fenêtre. ************************************************************************* ********************** public void update(receivestreamevent event) { //Verification que l'évènement est nouveau if (event instanceof NewReceiveStreamEvent) { System.out.println("Réception d'un flux"); mainfra.dispose(); //Nouveau Flux Reçu obtenu ReceiveStream rs = event.getreceivestream(); try { *************Creation du Player sur ce flux*********** Player p = Manager.createRealizedPlayer(rs.getDataSource()); ** Si le player a un composant visuel alors on crée une nouvelle fenêtre* if (p.getvisualcomponent()!= null) { JFrame fenetre = new JFrame("Vidéo de mon correspondant"); fenetre.setsize(320, 280); fenetre.getcontentpane().add(p.getvisualcomponent()); fenetre.setvisible(true); fenetre.setlocation(100,0); *******Demarrage du Player **** p.start(); label1.settext("flux reçu"); catch (NoPlayerException e) { catch (CannotRealizeException e) { catch (IOException e) {
75 5. La classe ImagePanel() : package video_; import java.awt.image.*; import javax.imageio.*; import javax.swing.*; import java.awt.*; import java.io.*; ********************************************************** * Cette classe charge une image dans un JPanel * permet de s'en servir par d'autre classe comme un JPane ********************************************************** public class ImagePanel extends JPanel { * private static final long serialversionuid = 1L; private BufferedImage image; private int w; // largeur de l'image private int h; // hauteur de l'image private int x,y;// coordonnées du coin sup gauche ****************************************** * Le constructeur : * img le fichier de l'image. * x coordonnée x du coin supérieur gauche. * y coordonnée y du coin supérieur gauche. * width largeur de l'image. * height hauteur de l'image. ******************************************* public ImagePanel(File fileimg,int x,int y,int width,int height) { super(); try { image = ImageIO.read(fileImg);
76 catch (IOException e) { image = null; System.err.println("Fichier invalide"); this.x = x; this.y = y; w = width; h = height; setvisible(true); ******************************************************************* * Gere l'affichage graphique du JPanel, ainsi que le refraichissement. ******************************************************************** public void paintcomponent(graphics g) { super.paintcomponent(g); g.drawimage(image,x,y,w,h,null);
La VOIP :Les protocoles H.323 et SIP
La VOIP :Les protocoles H.323 et SIP PLAN La VOIP 1 H.323 2 SIP 3 Comparaison SIP/H.323 4 2 La VOIP Qu appelle t on VOIP? VOIP = Voice Over Internet Protocol ou Voix sur IP La voix sur IP : Le transport
SIP. Sommaire. Internet Multimédia
Internet Multimédia Le Protocole SIP 2011 André Aoun - Internet Multimédia SIP - 1 Sommaire 1. Présentation 2. Entités SIP 3. Méthodes et réponses 4. User Agent 5. Registrar 6. Proxy 7. Redirect Server
SIP. 2007 A. Aoun - La Visioconférence SIP - 1
Internet Multimédia Le Protocole SIP 2007 A. Aoun - La Visioconférence SIP - 1 Présentation (1) Session Initiation Protocol (dont le sigle est SIP) est un protocole récent (1999), normalisé et standardisé
SIP. Plan. Introduction Architecture SIP Messages SIP Exemples d établissement de session Enregistrement
SIP Nguyen Thi Mai Trang LIP6/PHARE [email protected] UPMC - M2 Réseaux - UE PTEL 1 Plan Introduction Architecture SIP Messages SIP Exemples d établissement de session Enregistrement UPMC -
Protocole SIP et rc o d n o C ée yc L N E S ro P c a B
Protocole SIP 1 - La définition du protocole SIP, signifiant Session Initiation Protocole, vient du monde de l'informatique contrairement aux autres. SIP a été initié à l'origine par le groupe MMusic (Multiparty
Voix sur IP. Généralités. Paramètres. IPv4 H323 / SIP. Matériel constructeur. Asterisk
Voix sur IP Généralités Paramètres IPv4 H323 / SIP Matériel constructeur Asterisk 38 Généralités Voix sur IP, ou VoIP : technologie(s) de transport de la voix, en mode paquet, par le protocole IP. Téléphonie
La voix sur IP n'est pas un gadget, et présente de réels bénéfices pour l'entreprise.
VOIX SUR IP - VoIP Comprendre la voix sur IP et ses enjeux La voix sur IP n'est pas un gadget, et présente de réels bénéfices pour l'entreprise. Introduction La voix sur IP (Voice over IP) est une technologie
Couche Session M1 Info Z. Mammeri - UPS 1. Concept de session
Introduction à SIP (Session Initiation Protocol) M1 Info Cours de Réseaux Z. Mammeri Couche Session M1 Info Z. Mammeri - UPS 1 1. Introduction Concept de session Session : période pendant laquelle un groupe
VOIP. QoS SIP TOPOLOGIE DU RÉSEAU
VOIP QoS SIP TOPOLOGIE DU RÉSEAU La voix sur réseau IP, parfois appelée téléphonie IP ou téléphonie sur Internet, et souvent abrégée en ''VoIP'' (abrégé de l'anglais Voice over IP), est une technique qui
Partie 2 (Service de téléphonie simple) :
TRAVAUX PRATIQUES Partie 1 (Prologue) : Afin de connaitre la topologie du réseau, nous avons utilisé les commandes suivantes dans le prompt (en ligne de commande) : - «ipconfig» afin de connaitre notre
Voix sur IP Étude d approfondissement Réseaux
Voix sur IP Étude d approfondissement Réseaux Julien Vey Gil Noirot Introduction Ce dont nous allons parler L architecture VoIP Les protocoles Les limites de la VoIP Ce dont nous n allons pas parler Le
La VoIP et ToIP. - Les constructeurs de réseaux : Anciens : Alcatel, Ericsson, Nortel, Siemens, Lucent, NEC Nouveaux venus : NetCentrex, Cirpack
La VoIP et ToIP Introduction En 2002, le projet Asterisk sort au grand jour et fait son entrée dans un marché encore naissant. C est un PBX (Private Branch exchange) : auto commutateur matériel ou logiciel
RCS : Rich Communication Suite. EFORT http://www.efort.com
1 Introduction RCS : Rich Communication Suite EFORT http://www.efort.com Rich Communications Services (RCS) est une plate-forme offrant des services de communication incluant la messagerie instantanée
Stéphanie Lacerte. Document technique. Connextek. 31 mai 2013. Cloudtel
Stéphanie Lacerte Document technique Connextek 31 mai 2013 Cloudtel Introduction Le logiciel Cloudtel a été conçu dans le langage de programmation Java. Ce logiciel utilisant la voix sur IP, communique
LA VoIP LES PRINCIPES
LA VoIP LES PRINCIPES 1 PLAN La VoIP Définition VoIP & ToIP Concepts de la VoIP Les principaux protocoles de la VoIP Transport Signalisation La sécurité dans la VoIP 2 Définition VoIP est l abréviation
La ToIP/VoIP. Voix et téléphonie sur IP - Convergence voix et données
La ToIP/VoIP Voix et téléphonie sur IP - Convergence voix et données Evolution de la ToIP la téléphonie sur IP représentait en 2005 8% du parc total des lignes dans le monde. VoIP ou Voice over Internet
C a h p a i p tre e 4 Archi h t i ectur u e e t S i S g i n g a n li l s i atio i n o n SI S P
Chapitre 4 Architecture et Signalisation SIP Ver 01-09 4-1 Objectifs du Chapitre Voir comment SIP appréhende la signalisation Identifier les possibilités de SIP Etablir différents modèles de communication
La VoIP: Les protocoles SIP, SCCP et H323. Jonathan BRIFFAUT Alexandre MARTIN
La VoIP: Les protocoles SIP, SCCP et H323 Jonathan BRIFFAUT Alexandre MARTIN Plan Rappel VOIP SIP H323 SCCP 2 Rappel Bref sur la VOIP Voix sur IP (1996) Le transport sur IP est moins cher que le RTC La
Guide de configuration de la Voix sur IP
Le serveur Icewarp Guide de configuration de la Voix sur IP Version 11 Mai 2014 i Sommaire Guide de configuration VoIP 1 Présentation... 1 Configuration... 1 Configuration réseau... 1 Configuration du
Introduction de la Voix sur IP
Voix sur IP (VoIP) Introduction de la Voix sur IP La Voix sur IP, aussi connue sous le nom de téléphonie Internet, est une technologie qui vous permet de téléphoner via un réseau d ordinateurs basé sur
M1 Informatique, Réseaux Cours 9 : Réseaux pour le multimédia
M1 Informatique, Réseaux Cours 9 : Réseaux pour le multimédia Olivier Togni Université de Bourgogne, IEM/LE2I Bureau G206 [email protected] 24 mars 2015 2 de 24 M1 Informatique, Réseaux Cours
ÉCOLE DE TECHNOLOGIE SUPÉRIEURE UNIVERSITÉ DU QUÉBEC MÉMOIRE PRÉSENTÉ À L ÉCOLE DE TECHNOLOGIE SUPÉRIEURE
ÉCOLE DE TECHNOLOGIE SUPÉRIEURE UNIVERSITÉ DU QUÉBEC MÉMOIRE PRÉSENTÉ À L ÉCOLE DE TECHNOLOGIE SUPÉRIEURE COMME EXIGENCE PARTIELLE À L OBTENTION DE LA MAÎTRISE EN GÉNIE ÉLECTRIQUE M. ING. PAR MOURAD EL
Téléphonie. sur IP. 2 e édition
Téléphonie sur IP 2 e édition SIP, H.323, MGCP, QoS et sécurité, Asterisk, VoWiFi, offre multiplay des FAI, Skype et autres softphones, architecture IMS Laurent Ouakil Guy Pujolle Table des matières Avant-propos................................................
Implémentation du serveur de téléphonie (ASTERISK) dans le cadre de projet de création d un centre d appel
Implémentation du serveur de téléphonie (ASTERISK) dans le cadre de projet de création d un centre d appel Rapport de Projet de Fin d Etudes En vue obtention du titre : Licence Appliquée en Sciences et
Projet TOIP RENATER. D Azémar Jérôme Dransart Florian Cossu Jean-Valère Leseur Johnatan. Groupe n 1. Rapport de projet
Groupe n 1 Projet TOIP RENATER Rapport de projet Master 1 informatique Université d Avignon D Azémar Jérôme Dransart Florian Cossu Jean-Valère Leseur Johnatan Sommaire Sommaire... 2 Introduction... 3 Gestion
Configuration du driver SIP dans ALERT. V2
Micromedia International Etude technique Configuration d Alert pour SIP Auteur : Pierre Chevrier Société : Micromedia International Date : 26/08/2013 Nombre de pages : 19 Configuration du driver SIP dans
Étude et Mise en place d'une Solution VOIP Sécurisée
Étude et Mise en place d'une Solution VOIP Sécurisée Réalisé par : Mlle. Rebha Bouzaida MEMOIRE DE PROJET DE FIN D ÉTUDES Pour l obtention du Master Professionnel En Nouvelles Technologies Des Télécommunications
Interfaces graphiques avec l API Swing
Interfaces graphiques avec l API Swing Les Swing Les classes graphiques Swing dérivent de la classe JComponent, qui hérite ellemême de la classe AWT (Abstract Window Toolkit). Tous les composants Swing
VoIP et "NAT" VoIP et "NAT" 1/ La Traduction d'adresse réseau. 1/ La traduction d'adresse réseau. 1/ La traduction d'adresse réseau
VoIP et "NAT" VoIP et "NAT" Traduction d'adresse dans un contexte de Voix sur IP 1/ La Traduction d'adresse réseau("nat") 3/ Problèmes dus à la présence de "NAT" 1/ La Traduction d'adresse réseau encore
TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.
Université Paris 7 M2 II Protocole Internet TP3 Mail Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose. 1 Protocole SMTP 1. Le protocole SMTP est définit dans
Téléphonie. sur IP. Module Voix et Téléphonie sur IP. Téléphonie sur IP. Sujet 4 Identification et localisation dans le protocole SIP
uakil st Docteur de et Marie Curie ur puis chef de dustrie depuis, il a encadré jets de téléphoauteur de nomtions scientiles réseaux et rsité Paris 6 et ris 8. Ses trales plateformes t de services de IP,
Master e-secure. VoIP. RTP et RTCP
Master e-secure VoIP RTP et RTCP Bureau S3-354 Mailto:[email protected] http://saquet.users.greyc.fr/m2 Temps réel sur IP Problèmes : Mode paquet, multiplexage de plusieurs flux sur une même ligne,
Gregory DENIS. Nicolas MENECEUR. pour le California Institute of Technology [email protected]. [email protected]. Ciren 2010
Gregory DENIS pour le California Institute of Technology [email protected] Nicolas MENECEUR pour le RENATER [email protected] FONCTIONNALITÉS AVANCÉES Modération H.323/SIP Téléphone Skype Gregory DENIS
Services Réseaux - Couche Application. TODARO Cédric
Services Réseaux - Couche Application TODARO Cédric 1 TABLE DES MATIÈRES Table des matières 1 Protocoles de gestion de réseaux 3 1.1 DHCP (port 67/68)....................................... 3 1.2 DNS (port
Passerelle VoIP pour PBX
Passerelle VoIP pour PBX Les produits «IP-PBX pour central analogique ou ISDN» permettent d'ouvrir votre installation téléphonique classique au monde de la téléphonie de dernière génération, la téléphonie
Calcul de la bande passante réelle consommée par appel suivant le codec utilisé
Voix et téléphonie sur IP Déscription : Comprendre les aspects techniques et les méthodes d analyse permettant d intégrer le transport de la voix dans un réseau IP.Les différents protocoles de signalisation
Configuration d'un trunk SIP OpenIP sur un IPBX ShoreTel
Configuration d'un trunk SIP OpenIP sur un IPBX ShoreTel Note d application Produit : ShoreTel SIP Trunks OpenIP Version système: 14.2 Version système : 14.2 ShoreTel & SIP trunk OpenIP 1 ShoreTel & SIP
Déploiement sécuritaire de la téléphonie IP
Déploiement sécuritaire de la téléphonie IP Simon Perreault Viagénie {sip,mailto}:[email protected] http://www.viagenie.ca À propos du conférencier Consultant en réseautique et VoIP chez Viagénie
SEMINAIRES & ATELIERS EN TÉLÉCOMMUNICATIONS RESEAUX
SEMINAIRES & ATELIERS EN TÉLÉCOMMUNICATIONS & RESEAUX SEMINAIRE ATELIER SUR LA TELEPHONIE ET LA VOIX SUR IP (T-VoIP): DE LA THEORIE A LA PRATIQUE DEPLOIEMENT D UNE PLATEFORME DE VoIP AVEC ASTERIK SOUS
Spécifications de raccordement au service de Téléphonie sur IP (ToIP) de RENATER
Spécifications de raccordement au service de Téléphonie sur IP (ToIP) de RENATER Documentation Auteurs: Simon Muyal SSU-SPEC-ToIP_FR_20101221.doc 1 / 20 Table des matières 1 Sommaire... 4 2 A qui s adresse
Les messages d erreur d'applidis Client
Fiche technique AppliDis Les messages d erreur d'applidis Client Fiche IS00313 Version document : 1.00 Diffusion limitée : Systancia, membres du programme Partenaires AppliDis et clients ou prospects de
SIP : Session Initiation Protocol
SIP : Session Initiation Protocol Simon ZNATY et Jean-Louis DAUPHIN EFORT http://www.efort.com 1 Introduction SIP (Session Initiation Protocol) est un protocole de signalisation défini par l IETF (Internet
Voix et Téléphonie sur IP : Protocoles et Standards
Voix et Téléphonie sur IP : Protocoles et Standards Alex Corenthin Département Génie Informatique Laboratoire de traitement de l Information Ecole Supérieure Polytechnique Université Cheikh Anta Diop de
Appliance FAST360 Technical Overview. Sécurité de la VoIP. Copyright 2008 ARKOON Network Security
Appliance 360 Technical Overview Copyright 2008 ARKOON Network Security 2/13 Sommaire I. Introduction sur la VoIP...3 1. Qu est ce que la VoIP?... 3 2. Les protocoles de VoIP... 3 II. Les vulnérabilités
Proxy et reverse proxy. Serveurs mandataires et relais inverses
Serveurs mandataires et relais inverses Qu'est-ce qu'un proxy? Proxy = mandataire (traduction) Un proxy est un service mandataire pour une application donnée. C'est à dire qu'il sert d'intermédiaire dans
TRIXBOX. Tutorial et fonctions avancées
TRIXBOX Tutorial et fonctions avancées Sommaire C est quoi TRIXBOX?... 4 Quelques définitions:... 4 L'interface principale trixbox :... 5 L'interface web FreePBX pour gérer le PBX Asterisk.... 5 Le téléphone
Notice d installation et d utilisation SIP PBX 100
SIP PBX 100 Etat Draft Référence TTSIPPBX100UM_1.0Fr Version logicielle 201 Copyright 2007 TeQTeL communications SAS. Tous droits réservés. La distribution et la copie de ce document, ainsi que l utilisation
Veille Technologique : la VoIP
Veille Technologique : la VoIP CESI LA Vatine Intervenant : FACORAT Fabrice Sommaire Présentation de la VoIP Histoire Terminologie et Protocoles Enjeux de la VoIP H323 SIP Usages actuels de la VoIP Les
RMI le langage Java XII-1 JMF
Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine
SIP : Protocole d initialisation de session
Groupe de travail Réseau J. Rosenberg ; dynamicsoft Request for Comments : 3261 H. Schulzrinne ; Columbia U. Rendue obsolète : 2543 G. Camarillo ; Ericsson Catégorie : En cours de normalisation A. Johnston
Remote Method Invocation (RMI)
Remote Method Invocation (RMI) TP Réseau Université Paul Sabatier Master Informatique 1 ère Année Année 2006/2007 Plan Objectifs et Inconvénients de RMI Fonctionnement Définitions Architecture et principe
Programmer en JAVA. par Tama ([email protected]( [email protected])
Programmer en JAVA par Tama ([email protected]( [email protected]) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes
Bilan UREC et résultat de quelques tests
Téléphonie sur IP : I Téléphonie sur IP : Philippe LECA, [email protected] CNRS / UREC Jean-Luc ARCHIMBAUD, [email protected] CNRS / UREC Entre mai et juillet 99, 2 stagiaires,
18 TCP Les protocoles de domaines d applications
18 TCP Les protocoles de domaines d applications Objectifs 18.1 Introduction Connaître les différentes catégories d applications et de protocoles de domaines d applications. Connaître les principaux protocoles
Les Réseaux Privés Virtuels (VPN) Définition d'un VPN
Les Réseaux Privés Virtuels (VPN) 1 Définition d'un VPN Un VPN est un réseau privé qui utilise un réseau publique comme backbone Seuls les utilisateurs ou les groupes qui sont enregistrés dans ce vpn peuvent
Mise en place d une plateforme de téléphonie et interconnexion de sites distants
L étudiant Le tuteur C est vrai qu Nom : Prénom : Promotion : Année scolaire : VA : P. JULIEN 2008 2006/2007 RCM Nom : W. Prénom : STANISLAW Fonction : TECHNICAL DIRECTOR Service/Departement : NETWORK
TP 2 : ANALYSE DE TRAMES VOIP
TP 2 : ANALYSE DE TRAMES VOIP I REPRÉSENTER SON RÉSEAU Remettez en état votre petit réseau VOIP et réalisez-en le schéma (avec Vision 2010 éventuellement) II PEAUFINER LE PARAMÉTRAGE Pour activer la messagerie
Réunion du 1er Avril 2005. VoIP : théorie et réalité opérationnelle. [email protected]
Réunion du 1er Avril 2005 VoIP : théorie et réalité opérationnelle [email protected] Les infos échangées IPercom: intégre&gère des solutions voix et IP Services et solutions VoIP opérationnelles La VoIP:
as Architecture des Systèmes d Information
Plan Plan Programmation - Introduction - Nicolas Malandain March 14, 2005 Introduction à Java 1 Introduction Présentation Caractéristiques Le langage Java 2 Types et Variables Types simples Types complexes
Guide de configuration Aastra 5000 pour le raccordement d un trunk Sip OPENIP
Trunk SIP OPENIP A5000 R5.4 Guide de configuration Aastra 5000 pour le raccordement d un trunk Sip OPENIP Auteur Approbateur Autorisation Fonction/ Nom:. Fonction/ Nom:. Fonction/ Nom:.. Fonction/ Nom:
Introduction. Adresses
Architecture TCP/IP Introduction ITC7-2: Cours IP ESIREM Infotronique Olivier Togni, LE2I (038039)3887 [email protected] 27 février 2008 L Internet est basé sur l architecture TCP/IP du nom
FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères
FORMATION PcVue Mise en œuvre de WEBVUE Journées de formation au logiciel de supervision PcVue 8.1 Lieu : Lycée Pablo Neruda Saint Martin d hères Centre ressource Génie Electrique Intervenant : Enseignant
DHCP et NAT. Cyril Rabat [email protected]. Master 2 ASR - Info09115 - Architecture des réseaux d entreprise 2012-2013
DHCP et NAT Cyril Rabat [email protected] Master 2 ASR - Info09115 - Architecture des réseaux d entreprise 22-23 Cours n 9 Présentation des protocoles BOOTP et DHCP Présentation du NAT Version
2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant. http://robert.cireddu.free.
2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES 2.2 Architecture fonctionnelle d un système communicant Page:1/11 http://robert.cireddu.free.fr/sin LES DÉFENSES Objectifs du COURS : Ce cours traitera essentiellement
Voix et Téléphonie sur IP : Architectures et plateformes
Voix et Téléphonie sur IP : Architectures et plateformes Alex Corenthin Département Génie Informatique Laboratoire de traitement de l Information Ecole Supérieure Polytechnique Université Cheikh Anta Diop
Table des matières. Tables des matières SOMMAIRE. Remerciements
SOMMAIRE Tables des matières Table des matières Remerciements I) Introduction... 1 II) Historique... 2 1) Centrex IP : L origine... 2 2) L évolution téléphonique... 2 3) L évolution informatique... 3 4)
Téléphone IP SPA942 à quatre lignes avec commutateur deux ports de Cisco. Téléphones IP de Cisco pour petites entreprises
Téléphone IP SPA942 à quatre lignes avec commutateur deux ports de Cisco Téléphones IP de Cisco pour petites entreprises Téléphone IP multiligne avancé aux multiples fonctionnalités pour service SIP de
Introduction aux Technologies de l Internet
Introduction aux Technologies de l Internet Antoine Vernois Université Blaise Pascal Cours 2006/2007 Introduction aux Technologies de l Internet 1 Au programme... Généralités & Histoire Derrière Internet
Session Initiation Protocol
Session Initiation Protocol G.Vanwormhoudt 1 Préambule (1) Evolution RTC (1ère gen) vers Réseaux Intelligents Réseaux Intelligents Introduction de l informatique dans les réseaux téléphoniques avec pour
HYBIRD 120 GE POUR LES NULS
HYBIRD 120 GE POUR LES NULS 1. Connexion au réseau du client... 6 1.1 En utilisant le DHCP du client... 6 1.2 En utilisant l hybird 120 GE comme DHCP... 7 1.3 Accès au PABX à distance... 9 2. Téléphones
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
Le service FTP. M.BOUABID, 04-2015 Page 1 sur 5
Le service FTP 1) Présentation du protocole FTP Le File Transfer Protocol (protocole de transfert de fichiers), ou FTP, est un protocole de communication destiné à l échange informatique de fichiers sur
MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE CONSERVATOIRE NATIONAL DES ARTS ET METIERS CENTRE REGIONAL ASSOCIE DU MANS
MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE CONSERVATOIRE NATIONAL DES ARTS ET METIERS CENTRE REGIONAL ASSOCIE DU MANS MEMOIRE BIBLIOGRAPHIQUE Présenté en vue d obtenir L EXAMEN PROBATOIRE
TAGREROUT Seyf Allah TMRIM
TAGREROUT Seyf Allah TMRIM Projet Isa server 2006 Installation et configuration d Isa d server 2006 : Installation d Isa Isa server 2006 Activation des Pings Ping NAT Redirection DNS Proxy (cache, visualisation
Nmap (Network Mapper) Outil d exploration réseau et scanneur de ports/sécurité
Nmap (Network Mapper) Outil d exploration réseau et scanneur de ports/sécurité 1. Présentation Nmap est un outil open source d'exploration réseau et d'audit de sécurité, utilisé pour scanner de grands
Architectures de déploiement de la VoIP/SIP
ModuledeParoleTéléphonique(PTel) 2005 2006 Architecturesdedéploiementdela VoIP/SIP AUTEURS: DJIBRILCAMARA,ALPHAA.DIALLOETJEANM.PATER {[email protected],[email protected],[email protected]} Master2Réseauxinformatiques
Visio Kit. Mode d'emploi
Visio Kit Mode d'emploi Mode d'emploi 2 Table des matières Chapitre 1 - Que peut-on faire avec le visio-kit?... 4 1. Contexte d'utilisation 4 2. Les deux types de conférences 4 3. L'équipement des correspondants
Installation d'un serveur DHCP sous Windows 2000 Serveur
Installation d'un serveur DHCP sous Windows 2000 Serveur Un serveur DHCP permet d'assigner des adresses IP à des ordinateurs clients du réseau. Grâce à un protocole DHCP (Dynamic Host Configuration Protocol),
Cisco CCVP. Configuration de CUCM
Cisco CCVP Configuration de CUCM Contenu Eléments de configuration et ajout de téléphones Auto enregistrement BAT et TAPS Ajout manuel des téléphones Paramètres de configuration des téléphones Cisco CCVP
RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.
RMI Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. Méthode proche de RPC. Outils et classes qui rendent l'implantation d'appels de méthodes d'objets distants aussi simples
Ecole Supérieure d Informatique et Applications de Lorraine. ESIAL Troisième année Année universitaire 2002 2003 UNIVERSITE HENRI POINCARE NANCY I
UNIVERSITE HENRI POINCARE NANCY I Ecole Supérieure d Informatique et Applications de Lorraine Xavier AMEZIANE Sébastien LEVEQUE Lionel ZEINER ESIAL Troisième année Année universitaire 2002 2003 PROJET
Configuration du driver SIP dans ALERT
Micromedia International Etude technique Configuration d Alert pour SIP Auteur : Pierre Chevrier Société : Micromedia International Date : 05/06/2012 Nombre de pages : 14 Configuration du driver SIP dans
PROJET TRIBOX-2012-A
PROJET TRIBOX-2012-A Auteur : MORELLE Romain Clients VOIP + Rôle du PBX Membres du projet: GUITTON Jordan MORELLE Romain SECK Mbaye Gueye Responsable de la formation: MOTAMED Cina Client: DUSSART Dominique
Téléphone IP. Téléphone IP aux nombreuses fonctions avancées pour une utilisation professionnelle et au prix abordable FICHE PRODUIT
Téléphone IP Téléphone IP aux nombreuses fonctions avancées pour une utilisation professionnelle et au prix abordable FICHE PRODUIT Téléphone IP professionnel toutes fonctionnalités à 1 ligne qui prend
VoIP - TPs Etude et implémentation
VoIP - TPs Etude et implémentation Auteurs : RUIZ Nicolas, LOR Maurice, Julien FERNANDES Relecture : Version 3.0 23 Novembre 2005 SUPINFO - Ecole Supérieure d Informatique de Paris 23. rue de Château Landon
LABO TELEPHONIE. Etude et réalisation de la Téléphonie sur IP (VoIP) avec Cisco Call Manager et Asterisk
LABO TELEPHONIE Etude et réalisation de la Téléphonie sur IP (VoIP) avec Cisco Call Manager et Asterisk Colas Florian Nourdine Abdallah Ouleddiaf Sami SOMMAIRE 1. Présentation 2. Diagramme de Gantt 3.
SÉCURISATION DES CONNEXIONS À DISTANCE SUR LES RÉSEAUX DE CONTRÔLE
PUBLICATION CPA-2011-102-R1 - Mai 2011 SÉCURISATION DES CONNEXIONS À DISTANCE SUR LES RÉSEAUX DE CONTRÔLE Par : François Tremblay, chargé de projet au Centre de production automatisée Introduction À l
Informatique Générale Les réseaux
Informatique Générale Les réseaux 1 Réseaux locaux, étendus, Internet Comment permettre à l information de circuler d un ordinateur à un autre. 2 Les réseaux le modèle OSI les topologies adressage du matériel
La Voix Sur IP (VoIP)
La Voix Sur IP (VoIP) Sommaire 1. INTRODUCTION 2. DÉFINITION 3. POURQUOI LA TÉLÉPHONIE IP? 4. COMMENT ÇA MARCHE? 5. LES PRINCIPAUX PROTOCOLES 6. QU'EST-CE QU'UN IPBX? 7. PASSER À LA TÉLÉPHONIE SUR IP 8.
H.323. Internet Multimédia. Sommaire
Internet Multimédia La Visioconférence H.323 2011 André Aoun - Internet Multimédia H.323-1 Sommaire 1. Présentation 2. La Norme 3. 4. Appel H.323 Les Gatekeepers 5. Les ponts multipoints (MCU) 6. Les terminaux
Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.
Note technique W4 Engine Extension SSO Java Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java. 1 Présentation 3 2 Custom SSO Java 4 3 Bilan 10 Sommaire Référence
Configurer ma Livebox Pro pour utiliser un serveur VPN
Solution à la mise en place d un vpn Configurer ma Livebox Pro pour utiliser un serveur VPN Introduction : Le VPN, de l'anglais Virtual Private Network, est une technologie de Réseau Privé Virtuel. Elle
Mr. B. Benaissa. Centre universitaire Nâama LOGO
Mr. B. Benaissa Centre universitaire Nâama Dans ce chapitre, nous allons examiner le rôle de la couche application. Nous découvrirons également comment les applications, les services et les protocoles
Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6
Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6 1 BERNIER François http://astronomie-astrophotographie.fr Table des matières Installation d un serveur HTTP (Hypertext Transfer
VOIP : Un exemple en Afrique
VOIP : Un exemple en Afrique JRES 2003 Lille - FRANCE Division Informatique. École Supérieure Multinationale des Télécommunications BP 10.000 Dakar SENEGAL Plan de l exposé: 1- Présentation du réseau VOIP
Présentation du modèle OSI(Open Systems Interconnection)
Présentation du modèle OSI(Open Systems Interconnection) Les couches hautes: Responsables du traitement de l'information relative à la gestion des échanges entre systèmes informatiques. Couches basses:
1- Principe général : 2- Architecture réseau pour ToIP : 3 Bilan. Qu est-ce que la VoIP/ToIP? IPBX/Protocoles utilisés
1 1- Principe général : Qu est-ce que la VoIP/ToIP? IPBX/Protocoles utilisés 2- Architecture réseau pour ToIP : Machine hébergeant Asterisk Postes téléphoniques Monde extérieur 3 Bilan Intérêts pour la
Protocoles réseaux. Abréviation de Binary Digit. C'est la plus petite unité d'information (0, 1).
Chapitre 5 Protocoles réseaux Durée : 4 Heures Type : Théorique I. Rappel 1. Le bit Abréviation de Binary Digit. C'est la plus petite unité d'information (0, 1). 2. L'octet C'est un ensemble de 8 bits.
Couche application. La couche application est la plus élevée du modèle de référence.
Couche application La couche application est la plus élevée du modèle de référence. Elle est la source et la destination finale de toutes les données à transporter. Couche application La couche application
