Overblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU
Aquila Networks : Sécurité & Réseaux Étudiant en Master SSI à l'ESMT

ASTERISK PJSIP & Service à valeur ajoute sous ubuntu Server-24

El Hadji M. Diakhate et Rachidatou PAYAO

 

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

 

2.1 Configuration du transport

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

 

 

 

2.2 Configuration des utilisateurs (endpoints)

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

 

2.3 Configuration des AOR (Address of Record)

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

 

2.4 Configuration de l’authentification

 

[1000]
type=auth
auth_type=userpass
username=1000
password=1000

[1001]
type=auth
auth_type=userpass
username=1001
password=1001

 

 

 

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})

 

 

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

 

 

5. Configuration des softphones

Paramètres à configurer :
  • 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

 

 

  • Zoiper

 

 

6. Test de fonctionnement

Une fois les configurations terminées :

  1. Lancez les deux softphones
  2. Connectez-les avec les comptes 1000 et 1001
  3. Effectuez un appel de 1000 vers 1001

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.)

 

 

 

 

 

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

 

 

 

# apt install python3-flask

 

 

# apt install python3-mysql.connector

 

 

2 Installation et configuration de MySQL

Installez le serveur de base de données :

 

# apt install mysql-server

 

 

Démarrage du service

 

# systemctl start mysql

 

Assurez-vous que le service MySQL est bien démarré :

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.

Connexion à MySQL :

 

# mysql

 

Vérification du plugin d’authentification :

 

mysql> SELECT user, authentication_string, plugin, host FROM mysql.user;

 

Vous verrez que l’utilisateur root utilise auth_socket.

 

Modification du mode d’authentification :


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;

 

 

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

 

 

mysql> create database ecole;

 

 

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');


 

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/ 

 

Intégration dans le Dialplan Asterisk

Modifiez le fichier :

 

# vim /etc/asterisk/extensions.conf

 

 

 

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)

Code API (api.py)

 

# 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)
 

Code fichier get_note.py

 

# 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

 

 

 

Tests de fonctionnement

 

Test 1

Envoyer "note" au numéro 1441

 

Vérifier la réponse

 

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

 

Puis redémarrer :

  • Asterisk
  • API Flask

Test 2 

Relancer le test

 

Vérifier la réception correcte de la note

 

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

Pour être informé des derniers articles, inscrivez vous :
Commentaires