PRISE EN MAIN ARI

Publié le par Kachallah Abagana Mahamat

Introduction

Asterisk 12 introduit l’interface REST Asterisk, un ensemble d’API RESTful pour la création d’applications basées sur Asterisk. Cet article vous guidera tout au long de la mise en place et du fonctionnement d’ARI.

La création d’une application ARI comporte trois composants principaux.

Le premier, évidemment, est l’API RESTful elle-même. L’API est documentée à l’aide de Swagger, une spécification légère pour documenter les API RESTful. Les documents de l’API Swagger sont utilisés pour générer des validations et des passe-partout dans Asterisk lui-même, ainsi que de la documentation wiki statique et de la documentation interactive à l’aide de Swagger-UI.

Ensuite, Asterisk doit envoyer des événements asynchrones à l’application (nouveau canal, canal laissé un pont, canal raccroché, etc.). Cela se fait à l’aide d’un WebSocket sur /ari/events. Les événements sont envoyés sous forme de messages JSON et sont documentés sur la page Modèles de données REST. (Voir la liste des sous-types pour le modèle de données Message).

Enfin, la connexion du dialplan à votre application est l’application Stasis() dialplan. À partir du plan de numérotation, vous pouvez envoyer un canal à , en spécifiant le nom de l’application externe, ainsi que des arguments facultatifs à transmettre à l’application.Stasis(). 

Pour en savoir plus 

Prérequis système :

Ubuntu 18.04 LTS

2 Go de RAM

10 Go de Disque dur

Installation asterisk

# apt-get install asterisk

Dans /etc/asterisk/http.conf

enabled=yes
bindaddr=127.0.0.1

Dans /etc/asterisk/ari.conf

enabled=yes
[kachou]
type=user
password=passer

Dans /etc/asterisk/sip.conf

[1000]
username=1000
secret=12345
host=dynamic
context=kachoucorp
type=friend

[1001]
username=1001
secret=12345
host=dynamic
context=kachoucorp
type=friend
 

Dans /etc/asterisk/extensions.conf


[kachoucorp]
exten => _1XXX,1,Dial(SIP/${EXTEN})

exten => 100,1,Noop()
      same => n,Stasis(hello,world) ; hello est le nom de l'application
                                                      ; world est l'argument
      same => n,Hangup()
 

Création d'un environnement virtuel

   $ sudo pip install virtualenv

   $ sudo mkdir -p virtualenv

   $ virtualenv virtualenv/ari

   $ . virtualenv/ari/bin/activate

 

Installation des prérequis

(ari) root@glpi:~# pip install requests websocket-client
 

(ari) root@glpi:~# vim ari.py

#!/usr/bin/env python

import json
import sys
import websocket
import threading
import Queue
import requests


class ARIInterface(object):
    def __init__(self, server_addr, username, password):
        self._req_base = "http://%s:8088/ari/" % server_addr
        self._username = username
        self._password = password

    def answer_call(self, channel_id):
        req_str = self._req_base+"channels/%s/answer" % channel_id
        self._send_post_request(req_str)

    def play_sound(self, channel_id, sound_name):
        req_str = self._req_base+("channels/%s/play?media=sound:%s" % (channel_id, sound_name))
        self._send_post_request(req_str)

    def _send_post_request(self, req_str):
        r = requests.post(req_str, auth=(self._username, self._password))


class ARIApp(object):
    def __init__(self, server_addr):
        app_name = 'hello'
        username = 'kachou'
        password = 'passer'
        url = "ws://%s:8088/ari/events?app=%s&api_key=%s:%s" % (server_addr, app_name, username, password)
        ari = ARIInterface(server_addr, username, password)
        ws = websocket.create_connection(url)

        try:
            for event_str in iter(lambda: ws.recv(), None):
                event_json = json.loads(event_str)

                json.dump(event_json, sys.stdout, indent=2, sort_keys=True,
                          separators=(',', ': '))
                print("\n\nWebsocket event***************************************************\n")

                if event_json['type'] == 'StasisStart':
                    ari.answer_call(event_json['channel']['id'])
                    ari.play_sound(event_json['channel']['id'], 'tt-monkeys')
        except websocket.WebSocketConnectionClosedException:
            print("Websocket connection closed")
        except KeyboardInterrupt:
            print("Keyboard interrupt")
        finally:
            if ws:
                ws.close()

if __name__ == "__main__":
    app = ARIApp('localhost')

Source du code : Asterisk ARI Quickstart Tutorial in Python (apitman.com)

Démarrer asterisk

Démarrer le script ari écrit en python

 

L'utilisateur 1000 compose le numéro 100:

On écoute le son tt-monkeys.

 

Publié dans Asterisk, Python, Télécoms

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
B
Un article trop classe. Sa majesté Kachallah
Répondre
K
Merci très cher Bory Diallo.