PDA

Voir la version complète : IVR manager et BDD


comdif
26/09/2008, 19h50
je tente de faire marcher un truc dans le genre


-BOUCLE sur une table MYSQL (ca je sais faire)
-Recuperation de la variable $tocall (ca je sais faire)
-require ("incmanager.php"); appel login mdp pour le manager


// Lancement de la commande appel

fputs($socket, "Action: Originate\r\n");
fputs($socket, "Channel: SIP/$poste\r\n");
fputs($socket, "Context: test\r\n");
fputs($socket, "Exten: $tocall\r\n");
fputs($socket, "Priority: 1\r\n");
Bon ca ca marche ca passe la com à une extension mais c'est pas le but

Je voudrais plutot que ça appel $tocall sans appeler $poste (un poste interne)
et que ca fasse un truc dans le genre:

fputs($socket, "Action: Answer\r\n");
fputs($socket, "Priority: 2\r\n");
fputs($socket, "Action: SetMusicOnHold(default)\r\n");
fputs($socket, "Action: Set(TIMEOUT(digit)=5)\r\n");
fputs($socket, "Action: Set(TIMEOUT(reponse)=10)\r\n");
fputs($socket, "Action: Background(question)\r\n");
fputs($socket, "Action: 1\r\n");
fputs($socket, "Priority: 1\r\n");
fputs($socket, "Action: $var=1\r\n");
fputs($socket, "Action: 2\r\n");
fputs($socket, "Priority: 2\r\n");
fputs($socket, "Action: $var=0\r\n\r\n");

et la insert $var dans la base valeur 1 ou 0 (ca je sais faire) aussi

Bon IVR diffuse un message a répondre par 1 ou 2 et je récupére ma variable.
peut etre c'est possible avec le manager ça en tout cas je sais pas comment l'écrire en tout cas c'est pas comme ça :-(

comdif
29/09/2008, 12h15
Ca marche presque avec changement radical de stratégie
Mais toujours un petit probleme
L'appel est initié via une page PHP AJAX appel d'un num et passé a une IVR
"40" sur le dialplan


exten => _4X,1,Dial(sip/${EXTEN})
exten => _4X,2,Hangup()
exten => 40,1,MYSQL(Connect connid localhost user password asterisk)
exten => 40,2,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ conf='0'\ where\ tel='40')
exten => 40,3,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='1'\ where\ tel='40')
Exten => 40,4,Answer
Exten => 40,5,SetMusicOnHold(default)
Exten => 40,6,Set(TIMEOUT(digit)=10)
Exten => 40,7,Set(TIMEOUT(reponse)=20)
Exten => 40,8,Background(rendezvous)
Exten => 1,1,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ conf='1'\ where\ tel='40')
Exten => 1,2,Playback(merci)
Exten => 1,3,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')
Exten => 2,1,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ conf='2'\ where\ tel='40')
Exten => 2,2,Playback(merci)
Exten => 2,3,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')
exten => 40,9,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')
exten => 40,10,MYSQL(Clear ${resultid})
exten => 40,11,MYSQL(Disconnect ${connid})

J'ai créé la table rdv dans la base Asterisk avec les champs id name tel conf linestate
la premiere ligne est mon IVR 40 avec ses deux états dynamiques:
"linestat" qui vas donner le feux vert a la page PHP/AJAX pour continuer
(déplacer la valeur de "conf " en face du client appelé, l'efface sur la ligne de l'IVR et déclencher le prochain appel)

Bon tout ca fonctionne sauf que il manque un truc dans le dialplan:

Si l'appelé raccroche avant la fin ou ne répond pas a la question ou autre
l'état de la ligne reste à 1 et c'est le blocage !

gouroutrash
29/09/2008, 14h34
Sans trop lire ce que tu as mis, je ne vois pas d'extension "h", c'est peut-être la solution en cas de raccrochage avant la fin ?

comdif
29/09/2008, 15h08
Sans trop lire ce que tu as mis, je ne vois pas d'extension "h", c'est peut-être la solution en cas de raccrochage avant la fin ?

oui en effet il manquais
exten => h,1,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')
exten => i,1,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')
exten => T,1,MYSQL(Query resultid ${connid} UPDATE\ rdv\ SET\ linestate='0'\ where\ tel='40')

La ca marche super merci.

gouroutrash
29/09/2008, 19h16
De rien, t'a l'air bien motivé alors c'est un plaisir d'aider !

comdif
01/10/2008, 15h19
J'ai enfin finis l'appli avec son moteur en php/Mysql.

Juste un truc qui me gene car j'ai du ajouter des sleep partout a cause de ça
c'est la lenteur incroyable de l'interaction MYSQL du dialplan.
C'est un gros probleme ça et cause de mauvaises données.

Ya t'il quelque chose a faire pour ça ?

comdif
01/10/2008, 15h25
Mon dialplan qui update une table nommée broad
a la fin de l'appel une page php déplace ces données en face du client appelé.

;rappel conf ="Sans_reponse" a la fin d'un appel ok mais sans reponse "Refuse si refusé "Confirme" si confirmé "Occupe" appel occupé ou autre et "Attente" non traité

exten => h,1,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='0'\ where\ num='40')
;set the line state to free if the called hangup

exten => i,1,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='0'\ where\ num='40')
;set the line state to free if the called press invalid key

exten => T,1,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='0'\ where\ num='40')
;set the line state to free if timout

exten => 40,1,MYSQL(Connect connid localhost user pass asterisk)
;connect database

exten => 40,2,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='1'\ where\ num='40')
;set the linestate to 1 buzy first

Exten => 40,3,Answer

exten => 40,4,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ conf=\'Sans_reponse\'\ where\ num='40')
;set the conf field to 4 it does mean call is successfully but called no answer the questions or hangup or press invalid key

Exten => 40,5,SetMusicOnHold(default)
Exten => 40,6,Set(TIMEOUT(digit)=10)
Exten => 40,7,Set(TIMEOUT(absolute)=30)
Exten => 40,8,Background(rendezvous)

Exten => 1,1,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ conf=\'Confirme\'\ where\ num='40')
;set the conf field to Confirme does mean confirmed
Exten => 1,2,Playback(merci)
Exten => 1,3,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='0'\ where\ num='40')
;set the linestate to 0 ready for next call
Exten => 1,4,Hangup()

Exten => 2,1,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ conf=\'Refuse\'\ where\ num='40')
;set the conf field to Refuse does mean declined
Exten => 2,2,Playback(merci)
Exten => 2,3,MYSQL(Query resultid ${connid} UPDATE\ broad\ SET\ linestate='0'\ where\ num='40')
;set the linestate to ready for next call
Exten => 2,4,Hangup()

exten => 40,10,MYSQL(Clear ${resultid})
exten => 40,11,MYSQL(Disconnect ${connid}

comdif
01/10/2008, 20h41
bon pas de soluce
Je crois que je vais devoir transformer mon dialplan en AGI
au moins 2 jours de travail pour que ca marche :-(

comdif
02/10/2008, 19h59
Je crois avoir identifié le probleme mais pas sur !
en fait la commande Background bloque toute autre action toute la durée du message.
quand on fait 1 le message Background s'arrete mais c'est tres long
a passer sur l'exten 1 donc la personne appelée a pressé la touche
mais plus rien trop longtemps !!! donc il vas certainement refaire le 1 plein de fois et raccrocher.

Ou alors c'est timeout digit 5 qui bloque

en fait je cherche la soluce pour passer direct des l'interception du digit a la suite

peut etre un truc dans mon dialplan ?

comdif
02/10/2008, 20h23
oui je confirme c'est le timeout digit qui bloque
et meme sur 1 le minimum c'est un blanc tres long quand on attend juste un chiffre !

gouroutrash
02/10/2008, 20h38
Si je dis pas une bétise, tu peux spécifier un nombre de chiffres maxi à prendre en compte, je vais vérifier...

gouroutrash
02/10/2008, 20h47
Chez moi ca fonctionne:
Set(TIMEOUT(digit)=1)
Avec ça, ca avance immédiatement après l'appui sur une touche

comdif
02/10/2008, 21h23
oui on vas dire que 1 sec c'est pas vraiment tout de suite au sens mathématique mais ca vas déja mieux
j'ai aussi optimisé mes messages pour couper le blanc au début.

Comme quoi une prog qui semble infaillible au début doit etre adapté a toutes les réactions humaines et longuement testée

pour exten => i je vais rajouter un message (pas compris la réponse reessayer) et un goto vers le Background

Ca devrais tourner comme une horloge !!!

gouroutrash
02/10/2008, 21h39
oui on vas dire que 1 sec c'est pas vraiment tout de suite au sens mathématique mais ca vas déja mieux
j'ai aussi optimisé mes messages pour couper le blanc au début.

Comme quoi une prog qui semble infaillible au début doit etre adapté a toutes les réactions humaines et longuement testée

pour exten => i je vais rajouter un message (pas compris la réponse reessayer) et un goto vers le Background

Ca devrais tourner comme une horloge !!!

Pourtant 1s ca va vite, c'est pour quelle utilisation ton truc ?

gouroutrash
02/10/2008, 21h44
Sinon y'a la fonction "read" qui permets de finir dès que le nombre de digits voulu est atteint, mais il semble que l'utilisateur ne puisse pas entrer de digits avant que le message audio ne soit fini de lire:
http://www.voip-info.org/wiki-Asterisk+cmd+Read

comdif
02/10/2008, 21h58
oui j'ai testé le read sans succes
en fait le truc c'est que je me met a la place de l'appelé tout en connaissant
mes réactions et surtout celles de ma femme comme cas d'école par exemple :-)
C'est clair que si ca fait pas bip quand elle presse la touche ou qu'il ny a pas une réaction immédiat ca vas l'énerver et elle vas mitrailler la touche et raccrocher en ralant.
c'est pas bon ni pour l'image de l'entreprise ni pour les résultats de la campagne ni pour moi si ca ennerve ma femme :-)

gouroutrash
03/10/2008, 07h21
Et Set(TIMEOUT(digit)=0) t'a testé ? (aucune idée si c'est possible)

comdif
03/10/2008, 19h54
Et Set(TIMEOUT(digit)=0) t'a testé ? (aucune idée si c'est possible)
Oui j'ai testé je pense que ca retourne la valeur par défault de 5.
mais c'est bon maintenant apres avoir optimisé les messages et le timeout a 1
ça passe nickel.

Conclusion:
1-Pour les message à savoir que utiliser une exten pour le record, c'est archi nul
la qualité est médiocre et les blancs incontrolés, pour les records WavePad est largement supérieur et parfaitement compatible avec les sounds *.
sauf que faut faire l'effort d'enregistrer de mixer etc.. et d'envoyer sur le serveur.

2-Installer une appli a la main par le dialplan c'est super interessant, instructif et largement plus rapide que de passer par un web gui qui est de toute façon limité a l'imagination de son développeur.

3-faut que je me mette sérieusement au perl pour l'instant l'appli est un jeux de ping-pong entre PHP-AMI-DIALPLAN c'est pas terrible, la campagne est ouverte tant que la page php est ouverte.
Meme si c'et sympa de voir l'avancée en real time un script agi en tache de fond serais surement plus efficace.

gouroutrash
04/10/2008, 07h58
Le problème avec l'enregistrement des sons sur pc, c'est que la qualité est bonne sur pc, mais une fois le son wav mis sur de la téléphonie, le résultat est souvent très différent.
Le meilleur micro pour un son destiné au système téléphonique, c'est un bon téléphone ! (parait que ce sont les Cisco et Polycom qui ont la meilleure qualité audio)
Par contre un studio avec un technicien spécialisé là-dessus, c'est évidemment différent :)