Notes sur l’intégration du follow-me dans les futures versions d’astrad.

Nicolas Bondier, 2012-04-30

Echanges SIP à l’intérieur du réseau lors d’un follow-me

Récapitulatif des modifications des échanges SIP à effectuer à l’intérieur du réseau Switzernet.

Follow-me simultané simple vers extérieur

Etape 1 : Appel d’un téléphone vers un serveur.

Etape 2 : Dans ce cas, le téléphone "A" téléphone vers "B" qui a une règle de follow-me simultanée vers deux numéros externes, "C1" et "C2" après 10 secondes de sonnerie vers "B".

Le serveur astrad reçoit un appel provenant d’un téléphone sip, il demande une autorisation au serveur radius afin de connaître les routes. Celles-ci lui sont envoyées (en vert).

Etape 3 : Lorsqu’il reçoit la réponse radius, le serveur Astrad voit un follow-me vers plusieurs numéros simultanés avec plusieurs vendeurs. Tout d’abors il appelle le téléphone B (qui doit sonner 10s avant tout), puis il envoie deux INVITE à un autre serveur Astrad aléatoire. Celui-ci pourra alors traiter ces appels simultanés comme deux appels indépendants, et suivre la séquence de vendeur pour chaque appel sortant. Le context fork indique qu’il ne faut pas redemander d’autorisation à radius, mais seulement effectuer l’appel.

Etape 3 bis : Le premier serveur astrad a reçu une réponse du radius contenant un numéro interne (SIP-UA). Il envoie toute de même les deux appels vers le serveur Astrad suivant mais il ne fournit pas le contact pour les numéros du follow-me. Le second Astrad, doit exécuter le script radius d’autorisation pour savoir si ce numéro possède un follow-me, si c’est le cas, il exécute la même procédure que le premier Astrad pour ces routes.

Attention, il faut alors modifier le temps total d’expires pour le second follow-me, qui doit être inferieur ou egale au temps total du précédent expire en paramètre de la route.

 

Code théorique 

Script agi radius

 

#########################################

# Envoie de la demande d’autorisation   #

#########################################

 

# ...

 

 

#########################################

# Traitement pour chaque route          #

#########################################

 

SI CONTEXT fork{

      var Max_expires = Min(expires from asterisk, expires from radius);

}

 

var rand_astrad_ip = get_random_active_astrad();

 

#########################################

# traitement déjà réalisé


Pour chaque séquence de routes [i] envoyés par radius B, C1 et C2

      Pour [j] chaque route de chaque sequence {

Si SIP_UA et première route {

                  route[i][j][contact] = get_location(DEST);

                  route[i][j][cld] = DEST;

                  route[i][j][display] = parse radius cli;

                  route[i][j][bill_to] = FROM;

                  route[i][j][expires] = parse radius expires;

      }

      Sinon {    

                  route[i][j][contact] = prochain_astrad;  

                  route[i][j][cld] = parse radius cld;

                  route[i][j][display] = parse radius cli;

                  route[i][j][bill_to] = DEST;

                  route[i][j][expires] = parse radius expires;

      }

            if (Max_expires){

                  route[i][j][expires] = Min(route[i][j][expires], Max_expires);

                  # TODO : code pour faire soustraire les premiers expires et chaque expire de follow me (si seq) à Max_expires.

            }

 

}

}

 

 

#########################################

# Paramètres envoyés à Asterisk si follow-me simultané

 

X_ROUTE_1_0 = SIP/B@ASTRAD_DE_B
X_EXP_1_0   = 10s

X_CLI_1_0   = CLI renvoyé par radius

 

XROUTE_2_0    = “SIP/X-Route_0@rand_astrad_ip&SIP/X-Route_1@rand_astrad_ip[&X-Route_2@rand_astrad_ip]

X_BILL_TO_2_0 = “B”

X_TYPE_2_0    = “SIMULTANEOUS”

X_TIME_OUT    =  MAX(C1_EXPIRES, C2_EXPIRES)

X-ROUTE_2_0   = “CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES”

X-ROUTE_2_1   = “CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES”

 

 

Execution par asterisk

Ajout des header dans le paquet (seulement nom des headers).

 

X-bill-to    = X_BILL_TO_2_0

X-Route_Type = X_TYPE_2_0

X-Route_0    = X-ROUTE_2_0

X-Route_1    = X-ROUTE_2_1

 

 

Appel:

 

# dial(XROUTE_2_0,X_TIME_OUT)

 

dial( SIP/X-Route_0@RANDOM_ASTRAD & SIP/X-Route_1@RANDOM_ASTRAD, MAX(C1_EXPIRES, C2_EXPIRES))

 

 

Ajout des variables directement dans le paquet SIP lorsque le paquet est à destination d’un autre astrad.

SIP INVITE 1

 

# Paquet SIP 1

To: <sip:X-Route_0@xxx.xxx.xxx.xxx>

From: <sip:fork@xxx.xxx.xxx.xxx>

[...]

X-bill-to: X_BILL_TO_2_0

X-Route_Type: SIMULTANEOUS

X-Route_0: CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES

X-Route_1: CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES

 

 

SIP INVITE 2

 

To: <sip:X-Route_1@xxx.xxx.xxx.xxx>

From: <sip:fork@xxx.xxx.xxx.xxx>

[...]

X-bill-to: X_BILL_TO_2_0

X-Route_Type: SIMULTANEOUS

X-Route_0: CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES

X-Route_1: CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES

 

 

Notes manuscrites

Description: C:\Users\Nicolas Bondier\Desktop\120427-discussions-1(3).jpg

Description: C:\Users\Nicolas Bondier\Desktop\120427-discussions-2(3).jpg

Description: C:\Users\Nicolas Bondier\Desktop\120427-discussions-3(3).jpg