Lorsqu’un développeur lit PJSIP pour la première fois, une question apparaît : pourquoi une requête SIP INVITE traverse-t-elle autant de fichiers, modules, callbacks et machines d’état ?
La réponse est l’abstraction en couches. PJSIP transforme le transport, la mémoire et les événements en objets applicatifs tels que comptes, appels, dialogues, sessions média et endpoints.
Becke Telcom peut appliquer ce modèle aux plateformes SIP, dispatching, passerelles RoIP, téléphones industriels, interphones d’urgence et communications unifiées.

PJSIP comme système logistique en couches
PJSIP se comprend comme une logistique : l’utilisateur veut seulement lancer l’appel, mais derrière se trouvent règles, transport, documents et services.
Chaque couche masque une partie de la complexité et expose une interface plus pratique.
| Couche PJSIP | Analogie logistique | Rôle technique |
|---|---|---|
| PJLIB | Routes et véhicules | Mémoire, threads, sockets, temporisateurs et infrastructure multiplateforme. |
| PJSIP Core | Règles et documents | Analyse, route, envoie et reçoit les messages SIP selon RFC 3261. |
| PJSIP-UA | Centre de tri | Transforme les messages SIP en dialogues, sessions et comportement user-agent. |
| PJSUA / PJSUA2 | Interface applicative | API haut niveau pour comptes, appels, médias, enregistrement et logique. |
PJLIB et PJLIB-UTIL : couche d’infrastructure
PJLIB et PJLIB-UTIL résolvent les bases : mémoire, compatibilité, sockets, temporisateurs, événements, threads, journaux et utilitaires.
RFC 3261 décrit SIP, mais pas la gestion mémoire ou la concurrence en C. PJLIB permet aux couches supérieures de se concentrer sur signalisation et médias.
Abstraction de pool mémoire : pj_pool_t
Le parsing SIP crée chaînes, en-têtes, URI et structures temporaires. Des malloc/free fréquents peuvent fragmenter la mémoire.
pj_pool_t alloue par cycle de vie et libère un pool entier à la fin d’une transaction, d’un dialogue ou d’un contexte.
Abstraction I/O : pj_ioqueue
Les systèmes SIP utilisent UDP, TCP et TLS avec des modèles comme epoll, IOCP et kqueue.
pj_ioqueue masque ces différences et rend les applications PJSIP portables.
PJLIB résout le problème du fonctionnement fiable : mémoire, concurrence, temporisateurs, sockets et événements.
PJSIP Core : couche de pipeline de signalisation
PJSIP Core est le centre de la signalisation SIP. Il ne définit pas la logique métier, mais un pipeline standardisé de messages SIP.
Il gère parsing, création de messages, transport, endpoint, modules, transactions et routage.
Endpoint et modules
pjsip_endpoint est le point central. Les pjsip_module séparent transactions, événements, user-agent et application.
Les paquets entrants deviennent pjsip_rx_data et passent par parsing, transport, transaction, UA et callbacks.
Modèle en oignon SIP
Chaque module peut inspecter ou modifier les messages sans réécrire le cœur.
Une plateforme de dispatching peut intercepter INVITE, vérifier l’identité, appliquer des routes et envoyer l’appel vers des agents ou terminaux.
Transaction : pjsip_tsx
Une requête SIP et ses réponses forment une transaction avec Timer A, Timer B et Timer D.
pjsip_tsx devient une machine d’état et expose on_tsx_state.

PJSIP-UA : des messages aux sessions
RFC 3261 parle de messages, mais un agent pense à répondre, mettre en attente, transférer et raccrocher.
PJSIP-UA convertit les messages SIP en objets comme dialogues et sessions invite.
Dialogue : pjsip_dlg
SIP identifie les dialogues avec Call-ID, From tag et To tag.
pjsip_dlg maintient CSeq, routes, correspondance, réponses et état.
Session INVITE : pjsip_inv_session
Un appel SIP peut inclure INVITE, 100 Trying, 180 Ringing, 183 Session Progress, 200 OK, ACK, PRACK, UPDATE, re-INVITE et BYE.
pjsip_inv_session relie ces transactions et utilise SDP avec PJMEDIA, RTP, codecs et audio.
pjsip-simple : présence, messages et événements
Dans l’UC, la voix n’est qu’une partie. Présence, messages, abonnements, notifications et événements sont également nécessaires.
Chez Becke Telcom, ces concepts peuvent afficher disponibilité, état de dispatching, alarmes et présence opérateur.
PJSUA et PJSUA2 : frameworks haut niveau
La plupart des applications n’ont pas besoin d’utiliser PJLIB ou Core directement. PJSUA et PJSUA2 offrent des API pratiques.
PJSUA : API C
PJSUA encapsule comptes, appels, enregistrements, médias et audio. pjsua_call_make_call() crée INVITE, dialogue, SDP, médias et état.
PJSUA2 : API C++ orientée objet
Endpoint, Account et Call permettent de développer softphones, clients de centre d’appels et consoles sans SIP brut.

Comment PJSIP soutient call center et dispatching
Un centre d’appels gère enregistrement, appels, sonnerie, réponse, attente, transfert, conférence, enregistrement, routage, médias et états.
PJSIP permet des endpoints avec PJSUA2 et des serveurs avancés avec modules bas niveau, politiques, gateways et intégrations.
Enregistrement et authentification
Chaque agent ou appareil SIP a souvent besoin d’un compte. PJSUA2 encapsule enregistrement, authentification et état.
Contrôle d’appel
Les appels deviennent des objets avec états comme calling, ringing, confirmed, disconnected ou held.
Médias et SDP
La voix est négociée par SDP et transportée par RTP. PJSIP et PJMEDIA gèrent codecs, audio, ports et flux.
Gateways et endpoints industriels
Les solutions Becke Telcom intègrent téléphones SIP, téléphones industriels, stations d’urgence, RoIP, paging, diffusion et consoles.
Perspective technique Becke Telcom
Un centre de contrôle peut nécessiter trunk SIP, IP PBX, téléphones industriels, interphones, gateway radio, PA, CCTV et dispatching.
Une architecture fiable sépare transport, ressources, signalisation SIP, dialogue, session et workflows métier.
PJSIP est puissant parce qu’il sépare la complexité du protocole du développement métier.
Pourquoi PJSIP utilise autant de couches
Les couches gèrent la complexité de RFC 3261 : PJLIB exécute, PJSIP Core traite les messages, PJSIP-UA gère les sessions, et PJSUA and PJSUA2 accélère les applications.
Il convient donc à l’embarqué, l’IoT, les softphones, la vidéo, les conférences, le dispatching et les centres d’appels.
Valeur pour les développeurs
Meilleure maintenabilité
Les problèmes se localisent par couche : mémoire, retransmission, état d’appel ou métier.
Meilleure évolutivité
Les modules ajoutent authentification, routage, logs, surveillance, enregistrement et sécurité sans réécrire le stack.
Meilleure réutilisation
La même base SIP peut servir téléphones, agents, consoles, gateways et endpoints industriels.
Conclusion
PJSIP semble complexe parce qu’un INVITE traverse de nombreuses couches, mais cette complexité est volontaire.
Pour Becke Telcom, le modèle montre qu’une bonne plateforme sépare transport, signalisation, session, médias et logique métier.
FAQ
Pourquoi un INVITE traverse-t-il tant de fichiers ?
Parce que PJSIP sépare transport, parsing, endpoint, transaction, dialogue, session, SDP et callbacks.
Quel est le rôle de PJLIB ?
Il fournit mémoire, sockets, temporisateurs, événements, threads, logs et abstraction multiplateforme.
Différence entre Core et UA ?
Core traite messages et transactions ; UA gère dialogues, sessions et cycle d’appel.
À quoi sert PJSUA2 ?
À développer softphones, clients de call center, dispatching et outils SIP en C++.
Comment cela aide Becke Telcom ?
Cela fournit un modèle pour call center SIP, dispatching, RoIP, téléphones industriels et communications unifiées.