PRISE EN MAIN ARI
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().
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.