Appel SOAP sur un Cisco Call Manager (AXLAPI et WebdialerAPI)

Dans la large gamme des produits Cisco, on retrouve le Cisco CallManager.
C’est un IPBX, on parle donc de voix sur IP (VoIP), et ici de la version 4.2(3).

Je ne discuterais pas de l’interface un rien complexe de l’interface d’administration (/ccmadmin/) ou de l’interface utilisateur (/ccmuser/).

Parmis tous les services qui tournent sur le serveur, deux m’ont particulièrement attiré.

  1. Cisco Web Dialer API Reference Guide for Cisco Unified CallManager 4.2(3)
  2. Cisco AXL Programming Guide for Cisco Unified CallManager 4.2(3)

Le premier présente l’application WebDialer qui permet de piloter son poste téléphonique en initiant des appels à partir de son navigateur préféré. Mais détaille aussi le moyen de passer des ordres SOAP pour faire comme l’application Webdialer mais sans ouvrir une popup du navigateur…

Le deuxième permet de passer des ordres SOAP au Cisco CallManager, et donc aux plus courageux de développer une interface d’administration du serveur.

Je me suis donc amusé à coder un WebService en PHP pour initier des appels sur un CallManager.
Ce Webservice étant par la suite utilisé par un Yahoo! Widget dévelloper par mes soins pour un client.

Paramètres
Pour les exemples ci-dessous nous considèrerons que :

  • Hostname du CallManager : mon.callmanager.com
  • Utilisateur SOAP : soapuser
  • Mot de passe SOAP : secret
  • $userid : userid de l’utilisateur connecté sur le poste téléphonique IP.
  • $codepin : le code PIN de l’utilisateur
  • $destination : le numéro a appeler
  • $deviceName : le profile associé au poste téléphonique IP.

Webdialer SOAP API

Pour initier un appel

<?php
/*
plus rapide qu’il soit en local que sur le CallManager
Distant : http://mon.callmanager.com/webdialer/wsdl/WebdialerSoap.wsdl
*/
$wsdl = ‘/path/to/cisco/WebdialerSoap.wsdl’;
$location = ‘http://mon.callmanager.com/wdsoap/servlet/rpcrouter’;

$options = array(
‘uri’ => ‘urn:WebdialerSoap’,
‘location’ => $location,
‘connection_timeout’ => 10,
‘soap_version’ => SOAP_1_1,
);

$client = new SoapClient( $wsdl, $options);

$params = array(
‘Credential’ => array(
‘userID’ => $userid,
‘password’ => $codepin,
),
‘dest’ => $destination,
‘UserProfile’ => array(
‘user’ => $userid,
‘deviceName’ => $deviceName,
‘lineNumber’ => $codepin,
‘supportEM’ => true,
‘locale’ => ‘FR’
),
);

$response = $client->__soapCall(‘makeCallSoap’, $params);
/* ou */
/*
$response = $client->makeCallSoap($params);
*/
?>

Et pour raccrocher :


<?php
$wsdl = '/path/to/cisco/WebdialerSoap.wsdl';
$location = 'http://mon.callmanager.com/wdsoap/servlet/rpcrouter';

$options = array(
‘uri’ => ‘urn:WebdialerSoap’,
‘location’ => $location,
‘connection_timeout’ => 10,
‘soap_version’ => SOAP_1_1,
);

$client = new SoapClient( $wsdl, $options);

$params = array(
‘Credential’ => array(
‘userID’ => $userid,
‘password’ => $codepin,
),
‘UserProfile’ => array(
‘user’ => $userid,
‘deviceName’ => $deviceName,
‘lineNumber’ => $codepin,
‘supportEM’ => true,
‘locale’ => ‘FR’
),
);

$response = $client->__soapCall(‘endCallSoap’, $params);
/* ou */
/*
$response = $client->endCallSoap($params);
*/
?>

Les informations relatives au $deviceName sont récupérés par un appel similaire à la méthode SOAP « getProfileSoap ».

Exemple :

<?php
$wsdl = '/path/to/cisco/WebdialerSoap.wsdl';
$location = 'http://mon.callmanager.com/wdsoap/servlet/rpcrouter';

$options = array(
‘uri’ => ‘urn:WebdialerSoap’,
‘location’ => $location,
‘connection_timeout’ => 10,
‘soap_version’ => SOAP_1_1,
);

$client = new SoapClient( $wsdl, $options);

$params = array(
‘Credential’ => array(
‘userID’ => $userid,
‘password’ => $codepin,
),
‘userid’ => $userid,
);

$response = $client->__soapCall(‘getProfileSoap’, $params);
/* ou */
/**/
$response = $client->getProfileSoap($params);

if (is_soap_fault($response)) {
trigger_error(« SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring}) », E_USER_ERROR);
}

var_dump( $response );
?>

Le problème c’est que la méthode « getProfileSoap » n’est pas utilisable dans un environement « Extension mobility ».

Et donc il faut faire appel à AXLAPI.

AXL API
La on va taper dans la base de données du CallManager grace à une méthode SOAP : executeSQLQuery.


<?php
$wsdl = '/path/to/cisco/AXLAPI.wsdl';
$location = 'http://mon.callmanager.com/CCMApi/AXL/V1/AXLAPI.wsdl';

$options = array(
‘login’ => ‘soapuser’,
‘password’ => ‘secret’,
‘location’ => $location,
‘connection_timeout’ => 10,
‘soap_version’ => SOAP_1_1,
);

$client = new SoapClient( $wsdl, $options);

$params = array(
‘sql’ => sprintf(« SELECT TOP 1 Name FROM Device WHERE LoginUserid = ‘%s’ AND Name LIKE ‘SEP%%’; », $userid)
);

$response = $client->executeSQLQuery($params);

if (is_soap_fault($response)) {
trigger_error(« SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring}) », E_USER_ERROR);
}

var_dump( $response );
?>

Noter comme l’authentification entre la WebdialerAPI et la AXLAPI sont différents.
Les paramètres Credential sont implémentés de manières différentes.

have fun
hug

Ce contenu a été publié dans Mes docs. Vous pouvez le mettre en favoris avec ce permalien.