ASTERISK PJSIP & Service à valeur ajoute sous ubuntu Server-24
/image%2F7223427%2F20260329%2Fob_b40375_chatgpt-image-29-mars-2026-21-55-23.png)
Description du projet
Ce projet porte sur la mise en œuvre d’une plateforme de services à valeur ajoutée (SVA) basée sur le logiciel de téléphonie open-source Asterisk, déployé sous Ubuntu Server 24. Il a pour objectif de concevoir et de configurer un système de communication capable de fournir des services interactifs, notamment la consultation des notes via des appels vocaux et des messages SMS.
Dans ce cadre, le protocole PJSIP a été utilisé pour la gestion des communications VoIP, permettant une meilleure flexibilité, sécurité et performance dans le traitement des appels. L’architecture mise en place intègre des outils libres et des scripts permettant d’automatiser les interactions avec les utilisateurs, tout en assurant une liaison avec des bases de données pour l’accès aux informations.
Ce projet a été réalisé par El Hadji M. Diakhate et Rachidatou PAYAO, sous la supervision du Docteur Kachallah Abagana Mahamat, dans le but de démontrer l’efficacité des solutions open-source dans la mise en œuvre de services télécoms à dimension commerciale et éducative.
Introduction
Asterisk est une solution de téléphonie open-source largement utilisée pour concevoir des systèmes de communication vocale avancés. Il permet de déployer des infrastructures VoIP flexibles, évolutives et performantes.
Parmi les différentes options de configuration disponibles, l’utilisation du protocole PJSIP se distingue par une gestion optimisée des appels, une meilleure modularité ainsi que des fonctionnalités avancées adaptées aux environnements modernes.
Dans ce document, nous présentons les différentes étapes nécessaires à la configuration d’Asterisk avec PJSIP, illustrées par des exemples pratiques et fonctionnels.
1. Installation d’Asterisk
La première étape consiste à installer Asterisk sur votre système d’exploitation.
https://aquila-networks.overblog.fr/preview/b9201d6f317ef5ab622c36368784dd64a67ccd11
Des guides détaillés permettent de faciliter cette installation, notamment sur Ubuntu Server 24, qui constitue un environnement stable et recommandé pour les solutions de téléphonie VoIP.
2. Configuration de PJSIP
La configuration du protocole PJSIP s’effectue à travers le fichier pjsip.conf, situé dans le répertoire /etc/asterisk/.
Pour modifier ce fichier :
# vim /etc/asterisk/pjsip.conf
Dans un premier temps, il est nécessaire de définir le type de transport utilisé.
PJSIP prend en charge plusieurs protocoles tels que UDP, TCP et TLS, permettant d’adapter la communication selon les exigences de performance et de sécurité.
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
/image%2F7223427%2F20260330%2Fob_0ccd00_capture-d-ecran-2026-03-25-232300.png)
Chaque utilisateur SIP est défini à travers plusieurs sections : endpoint, aor et auth.
;La configuration d'un utilisateur se fait dans une section ressemblant à ceci
[1000]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=1000
aors=1000
[1001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=1001
aors=1001
Cette section définit le nombre maximal de connexions simultanées pour chaque utilisateur.
;Cette section définit le nombre maximal de contacts pour cet utilisateur à 1.
[1000]
type=aor
max_contacts=1
remove_existing=yes
[1001]
type=aor
max_contacts=1
remove_existing=yes
[1000]
type=auth
auth_type=userpass
username=1000
password=1000
[1001]
type=auth
auth_type=userpass
username=1001
password=1001
/image%2F7223427%2F20260330%2Fob_580e2f_capture-d-ecran-2026-03-25-234049.png)
3. Configuration du plan de numérotation
Le plan de numérotation est défini dans le fichier extensions.conf.
# vim /etc/asterisk/extensions.conf
[from-internal]
exten => 1000,1,Dial(PJSIP/1000)
exten => 1001,1,Dial(PJSIP/1001)
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
/image%2F7223427%2F20260330%2Fob_6217af_capture-d-ecran-2026-03-25-234923.png)
Cette configuration permet :
- des appels directs entre les extensions 1000 et 1001
- des appels dynamiques pour toutes les extensions commençant par 1
4. Rechargement de la configuration
Accédez à la console Asterisk :
#asterisk -rvvvvvvvvvvvvvvvvvvvv
Puis exécutez :
- CLI> core reload
- CLI> dialplan reload
/image%2F7223427%2F20260330%2Fob_f1197a_capture-d-ecran-2026-03-29-223415.png)
5. Configuration des softphones
- User / Username : 1000 ou 1001
- Password : 1000 ou 1001
- Domain / Host : adresse IP du serveur Asterisk
- Port : 5060
Pour tester votre système VoIP, vous pouvez utiliser des logiciels clients SIP tels que :
- MicroSIP
/image%2F7223427%2F20260330%2Fob_64e406_capture-d-ecran-2026-03-29-223752.png)
- Zoiper
/image%2F7223427%2F20260330%2Fob_27ce4a_whatsapp-image-2026-03-29-at-22-41-09.jpeg)
6. Test de fonctionnement
Une fois les configurations terminées :
- Lancez les deux softphones
- Connectez-les avec les comptes 1000 et 1001
- Effectuez un appel de 1000 vers 1001
/image%2F7223427%2F20260330%2Fob_ff6ff4_capture-d-ecran-2026-03-29-225023.png)
Si la configuration est correcte :
- l’appel est établi
- la communication audio fonctionne correctement
Conclusion
La configuration d’Asterisk avec PJSIP permet de mettre en place un système de téléphonie VoIP robuste, flexible et performant.
Grâce à cette architecture :
- les utilisateurs peuvent communiquer facilement
- le système est extensible
- et les fonctionnalités peuvent être enrichies selon les besoins (messagerie vocale, IVR, etc.)
/image%2F7223427%2F20260330%2Fob_6e126f_chatgpt-image-30-mars-2026-12-31-23.png)
Mise en place du système API + Base de données
Dans cette partie, nous allons intégrer une application externe à Asterisk permettant de récupérer dynamiquement des informations (ici : des notes) via une API développée en Python.
1 Installation des dépendances Python
# apt install python3-pip
/image%2F7223427%2F20260330%2Fob_087543_capture-d-ecran-2026-03-28-160953.png)
# apt install python3-flask
/image%2F7223427%2F20260330%2Fob_53a727_capture-d-ecran-2026-03-28-161103.png)
# apt install python3-mysql.connector
/image%2F7223427%2F20260330%2Fob_6a2f93_capture-d-ecran-2026-03-28-161143.png)
2 Installation et configuration de MySQL
Installez le serveur de base de données :
# apt install mysql-server
/image%2F7223427%2F20260330%2Fob_223b12_capture-d-ecran-2026-03-28-161223.png)
Démarrage du service
# systemctl start mysql
Assurez-vous que le service MySQL est bien démarré :
/image%2F7223427%2F20260330%2Fob_472642_capture-d-ecran-2026-03-28-161331.png)
3 Sécurisation de l’utilisateur root
Par défaut, MySQL utilise le plugin auth_socket pour l’utilisateur root, empêchant la connexion par mot de passe. Voici comment le modifier.
# mysql
mysql> SELECT user, authentication_string, plugin, host FROM mysql.user;
/image%2F7223427%2F20260330%2Fob_9ad754_capture-d-ecran-2026-03-28-161421.png)
Vous verrez que l’utilisateur root utilise auth_socket.
Choisissez le plugin mysql_native_password ou caching_sha2_password. Par exemple :
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Note : caching_sha2_password est recommandé pour la sécurité, mais certains outils comme phpMyAdmin ne le supportent pas bien.
Étape 4 : Appliquer les modifications
mysql> FLUSH PRIVILEGES;
/image%2F7223427%2F20260330%2Fob_49fe91_capture-d-ecran-2026-03-28-161508.png)
4 Création de la base de données
Créer un utilisateur dédié pour vos applications est une bonne pratique :
# mysql -u root -p
/image%2F7223427%2F20260330%2Fob_1109d1_capture-d-ecran-2026-03-28-161543.png)
mysql> create database ecole;
/image%2F7223427%2F20260330%2Fob_22de3d_capture-d-ecran-2026-03-30-095100.png)
mysql> use ecole;
CREATE TABLE notes (
extension VARCHAR(10) PRIMARY KEY,
note VARCHAR(20)
);
INSERT INTO notes (extension, note) VALUES
('1000', '16/20'),
('1001', '14/20'),
('1002', '19/20');
/image%2F7223427%2F20260330%2Fob_9ac2f7_capture-d-ecran-2026-03-28-161623.png)
5 Préparation de l’environnement Asterisk
Création du répertoire pour stocker les scripts et résultats :
# mkdir -p /var/lib/asterisk/note/
# touch /var/lib/asterisk/note/api.py
# touch /var/lib/asterisk/note/get_note.py
# chown -R asterisk:asterisk /var/lib/asterisk/note/
# chmod -R 777 /var/lib/asterisk/note/
/image%2F7223427%2F20260330%2Fob_1ec0ab_capture-d-ecran-2026-03-28-161710.png)
Intégration dans le Dialplan Asterisk
Modifiez le fichier :
# vim /etc/asterisk/extensions.conf
/image%2F7223427%2F20260330%2Fob_a24fe2_capture-d-ecran-2026-03-28-161907.png)
Ajoutez les règles suivantes :
;[message]
exten => _10XX,1,NoOp(==> Message reçu de ${MESSAGE(from)} pour ${MESSAGE(to)})
same => n,Set(TO=${EXTEN})
same => n,Set(FROM=${MESSAGE(from)})
same => n,Set(MSG=${MESSAGE(body)})
same => n,Set(MESSAGE(body)=${MSG})
same => n,MessageSend(pjsip:${TO},${FROM})
same => n,NoOp(==> Message envoyé à ${TO})
same => n,Hangup()
exten => 1441,1,NoOp(==> Message reçu de ${MESSAGE(from)})
same => n,Set(FROM=${MESSAGE(from)})
same => n,Set(MSG=${MESSAGE(body)})
same => n,Set(EXT_RAW=${CUT(FROM,<,2)})
same => n,Set(EXT_RAW=${CUT(EXT_RAW,@,1)})
same => n,Set(EXT=${CUT(EXT_RAW,:,2)})
same => n,NoOp(Numero : ${EXT})
; Vérifie le contenu du message
same => n,GotoIf($["${MSG}" = "note"]?call_api,1)
; Sinon, message inconnu
same => n,Set(MESSAGE(body)=Commande inconnue. Envoyez \"note\" à 1441.)
same => n,MessageSend(pjsip:${EXT},pjsip:1441)
same => n,Hangup()
exten => call_api,1,System(/usr/bin/python3 /var/lib/asterisk/note/get_note.py ${EXT})
;new line
same => n,Set(NOTE=${FILE(/var/lib/asterisk/note/note_${EXT}.txt)})
same => n,NoOp(==> Contenu du fichier : ${NOTE})
; Si le fichier est vide ou n'existe pas, envoyer un message "Note non trouvée"
same => n,GotoIf($["${NOTE}" = ""]?file_not_found)
; Si NOTE n'est pas vide, envoyer la note
same => n,Set(MESSAGE(body)=Votre note est : ${NOTE})
same => n,MessageSend(pjsip:${EXT},pjsip:1441)
same => n,Hangup()
exten => file_not_found,1,Set(MESSAGE(body)=Note non trouvée pour l’extension ${EXT})
same => n,MessageSend(pjsip:${EXT},pjsip:1441)
same => n,Hangup()
Développement de l’API (Flask)
# vim /var/lib/asterisk/note/api.py
from flask import Flask, request, jsonify
import mysql.connector
app = Flask(__name__)
@app.route('/note', methods=['GET'])
def get_note():
ext = request.args.get('extension')
if not ext:
return jsonify({"status": "error", "message": "Extension manquante"}), 400
try:
conn = mysql.connector.connect(
host='localhost',
user='root',
password='passer',
database='ecole'
)
cursor = conn.cursor()
cursor.execute("SELECT note FROM notes WHERE extension = %s", (ext,))
row = cursor.fetchone()
conn.close()
if row:
return jsonify({"status": "success", "note": row[0]})
else:
return jsonify({"status": "error", "message": "Aucune note trouvée"}), 404
except Exception as e:
return jsonify({"status": "error", "message": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# vim /var/lib/asterisk/note/get_note.py
#!/usr/bin/env python3
import sys
import requests
import os
ext = sys.argv[1]
note = "Note indisponible"
try:
resp = requests.get(f'http://localhost:5000/note?extension={ext}', timeout=3)
if resp.status_code == 200:
note = resp.json().get('note', 'Aucune note')
else:
note = f"Erreur API: code {resp.status_code}"
except Exception as e:
note = f"Erreur de connexion à l’API: {e}"
# Crée le dossier si nécessaire
path = f'/var/lib/asterisk/note'
os.makedirs(path, exist_ok=True)
# Écrit la note dans le fichier
with open(f'{path}/note_{ext}.txt', 'w') as f:
f.write(note)
Chargement des modules Asterisk
Dans la console Asterisk :
# asterisk -rvvvvvvvvvvvvvv
- CLI> module load app_system.so
- CLI> module load func_cut.so
- CLI> module load func_env.so
- CLI> module load func_channel.so
- CLI> module load func_shell.so
- CLI> module load func_curl.so
Lancement de l’API
Dans un autre terminal :
# python3 /var/lib/asterisk/note/api.py
/image%2F7223427%2F20260330%2Fob_b44008_capture-d-ecran-2026-03-28-161804.png)
Tests de fonctionnement
Test 1
Envoyer "note" au numéro 1441
/image%2F7223427%2F20260330%2Fob_159fa7_capture-d-ecran-2026-03-28-162223.png)
Vérifier la réponse
/image%2F7223427%2F20260330%2Fob_d6395d_capture-d-ecran-2026-03-28-162123.png)
Problème courant : erreur API (code 500)
Problem rencontrer API: Code 500 pas de panique si ca vous est arriver aussi
Solution :
# pip install --upgrade mysql-connector-python --break-system-packages
/image%2F7223427%2F20260330%2Fob_86d506_capture-d-ecran-2026-03-28-162335.png)
Puis redémarrer :
- Asterisk
- API Flask
Test 2
Relancer le test
/image%2F7223427%2F20260330%2Fob_da4cff_capture-d-ecran-2026-03-28-162431.png)
Vérifier la réception correcte de la note
/image%2F7223427%2F20260330%2Fob_be70a2_capture-d-ecran-2026-03-28-162525.png)
Résultat : le système fonctionne correctement !
Conclusion
Cette architecture permet d’intégrer un service à valeur ajoutée (SVA) dans Asterisk en combinant :
- VoIP (PJSIP)
- API REST (Flask)
- Base de données (MySQL)
Ce type de solution peut être étendu pour :
- consultation de solde
- notifications automatiques
- services interactifs (IVR, SMS SIP, etc.)
Test d'Apple interne