{"id":1337,"date":"2012-11-19T22:06:01","date_gmt":"2012-11-19T21:06:01","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=1337"},"modified":"2012-11-19T22:19:57","modified_gmt":"2012-11-19T21:19:57","slug":"asterisk-suivi-des-appels-en-xpl","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/11\/19\/asterisk-suivi-des-appels-en-xpl\/","title":{"rendered":"Asterisk, suivi des appels en xPL"},"content":{"rendered":"<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/11\/asteriskxpl.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1340\" title=\"asteriskxpl\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/11\/asteriskxpl-300x177.png\" alt=\"\" width=\"300\" height=\"177\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/11\/asteriskxpl-300x177.png 300w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/11\/asteriskxpl.png 350w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a title=\"http:\/\/www.asterisk.org\/\" href=\"http:\/\/www.asterisk.org\/\" target=\"_blank\">Asterisk<\/a> est un serveur VoIP facilement installable \u00e0 la maison.<\/p>\n<p>Je ne m&rsquo;\u00e9tendrais pas la dessus, il y a pl\u00e9thore de tutos sur le nain ternet pour vous expliquer ce que c&rsquo;est et comment le mettre en place.<\/p>\n<p>Je m&rsquo;en sers tout les jours pour de multiples usages et l&rsquo;une des fonctions qui me manquait \u00e9tait la possibilit\u00e9 de transmettre en xPL les num\u00e9ros des appels entrants, et pourquoi pas, le num\u00e9ro des appels \u00e9mis.<\/p>\n<p>(Rassurez vous, tout cela dans l&rsquo;id\u00e9e de l&rsquo;int\u00e9grer \u00e0 <a title=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/11\/16\/projet-xpl-pyhal-alpha-release-2\/\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/11\/16\/projet-xpl-pyhal-alpha-release-2\/\" target=\"_blank\">mon centralisateur xPL<\/a>).<\/p>\n<p>En fouillant un peu, j&rsquo;ai d&rsquo;abord d\u00e9couvert le package d&rsquo; <a title=\"http:\/\/www.iranger.com\/page4\/files\/xplastAsteriskxPLsupport.html\" href=\"http:\/\/www.iranger.com\/page4\/files\/xplastAsteriskxPLsupport.html\" target=\"_blank\">iranger<\/a>, xplast.<\/p>\n<p>Puis <a title=\"http:\/\/madomotique.wordpress.com\/2012\/02\/01\/notification-dappels-sip-asteriskdomogik\/\" href=\"http:\/\/madomotique.wordpress.com\/2012\/02\/01\/notification-dappels-sip-asteriskdomogik\/\" target=\"_blank\">l&rsquo;excellent billet de mon confr\u00e8re Ma domotique<\/a><\/p>\n<p>Tout cela \u00e9tait bien gentil et sympa, mais je voulais un truc plus simple et plus rapide \u00e0 mettre en oeuvre.<\/p>\n<p>Je me suis donc plong\u00e9 (avec d\u00e9licatesse je vous rassure) dans la documentation d&rsquo;Asterisk et surtout sur la <a title=\"http:\/\/wiki.asterisk-france.org\/index.php\/AGI\" href=\"http:\/\/wiki.asterisk-france.org\/index.php\/AGI\" target=\"_blank\">partie AGI<\/a>.<\/p>\n<p>Vous trouverez \u00e9galement plein d&rsquo;info sur le site voip-info.org a cette adresse :<\/p>\n<p><a title=\"http:\/\/www.voip-info.org\/wiki\/view\/Asterisk+AGI\" href=\"http:\/\/www.voip-info.org\/wiki\/view\/Asterisk+AGI\" target=\"_blank\">http:\/\/www.voip-info.org\/wiki\/view\/Asterisk+AGI<\/a><\/p>\n<p>Un peu de google derri\u00e8re et je suis tomb\u00e9 sur un tr\u00e8s bon billet d&rsquo;<a title=\"http:\/\/andyortlieb.wordpress.com\/2011\/07\/06\/quick-overview-of-asterisk-agi-using-python\/\" href=\"http:\/\/andyortlieb.wordpress.com\/2011\/07\/06\/quick-overview-of-asterisk-agi-using-python\/\" target=\"_blank\">Andy Ortlieb<\/a> qui explique comment utiliser les Asterisk Gateway Interface avec python.<\/p>\n<p>Je me suis donc servi de ses exemples pour \u00e9crire un simple module AGI qui transmet en xPL les num\u00e9ros des appels re\u00e7us ou \u00e9mis via Asterisk.<\/p>\n<p>Copier ce script dans le r\u00e9pertoire agi-bin d&rsquo;Asterisk (g\u00e9n\u00e9ralement \/var\/lib\/asterisk\/agi-bin)<br \/>\nMettre l&rsquo;utilisateur asterisk propri\u00e9taire de ce script et le rendre executable<\/p>\n<p>Pour intercepter les appels, il faut rajouter une entr\u00e9e dans votre extensions.conf :<\/p>\n<p>Exemple, pour envoyer un message xPL \u00e0 chaque appel sortant avec le num\u00e9ro appel\u00e9:<br \/>\ndans votre contexte \u00ab\u00a0appel sortant\u00a0\u00bb:<\/p>\n<pre lang=\"text\">\r\n[appelsortant]\r\nexten => _0ZXXXXXXXX,1,AGI(\/usr\/bin\/python,\"\/var\/lib\/asterisk\/agi-bin\/Asterisk2xPL.agi\")\r\nexten => _0ZXXXXXXXX,2,Dial(SIP\/freephonie-out\/${EXTEN})\r\n<\/pre>\n<p>Exemple, pour envoyer un message xPL \u00e0 chaque appel entrant avec le num\u00e9ro appelant :<br \/>\ndans votre contexte \u00ab\u00a0appel entrant\u00a0\u00bb:<\/p>\n<pre lang=\"text\">\r\n[appelentrant]\r\nexten => s,1,Ringing\r\nexten => s,2,AGI(\/usr\/bin\/python,\"\/var\/lib\/asterisk\/agi-bin\/Asterisk2xPL.agi\")\r\n...\r\n<\/pre>\n<p>Attention, par d\u00e9faut le message \u00ab\u00a0INBOUND\u00a0\u00bb (appel entrant) est produit quand le script voit une extension \u00ab\u00a0s\u00a0\u00bb (comportement le plus souvent rencontr\u00e9 pour les appels entrants)<\/p>\n<pre lang=\"python\">\r\n#!\/usr\/bin\/python\r\n# -*- coding: ISO-8859-1 -*-\r\n#\r\n# Asterisk2xPL\r\n# http:\/\/blog.guiguiabloc.fr\r\nimport sys,os,socket\r\n\r\nhostname = socket.gethostname()\r\nxpladdr = (\"255.255.255.255\",3865)\r\nxplport = 3865\r\nUDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)\r\nUDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)\r\n\r\n\r\ndef get():\r\n  res = sys.stdin.readline()\r\n  res = res.strip()\r\n  response,delim,result=res.partition(' ')\r\n  result=result.split('=')[1].strip()\r\n  result,delim,data = result.partition(' ')\r\n  return response,result,data\r\n\r\ndef send(data):\r\n  sys.stdout.write(\"%s \\n\"%data)\r\n  sys.stdout.flush()\r\n\r\nAGIENV={}\r\n\r\nenv = \"\"\r\nwhile(env != \"\\n\"):\r\n\r\n    env = sys.stdin.readline()\r\n    envdata =\u00a0 env.split(\":\")\r\n    if len(envdata)==2:\r\n      AGIENV[envdata[0].strip()]=envdata[1].strip()\r\n\r\nincomingnumber = AGIENV['agi_callerid']\r\noutgoingnumber = AGIENV['agi_extension']\r\n\r\nif outgoingnumber == \"s\":\r\n  body = 'calltype=INBOUND\\nphone='+incomingnumber\r\n  msg = \"xpl-trig\\n{\\nhop=1\\nsource=guigui-asterisk.\"+hostname+\"\\ntarget=*\\n}\\ncid.basic\\n{\\n\" + body + \"\\n}\\n\"\r\n  UDPSock.sendto(msg,xpladdr)\r\nelse:\r\n  body = 'calltype=OUTBOUND\\nphone='+outgoingnumber\r\n  msg = \"xpl-trig\\n{\\nhop=1\\nsource=guigui-asterisk.\"+hostname+\"\\ntarget=*\\n}\\ncid.basic\\n{\\n\" + body + \"\\n}\\n\"\r\n  UDPSock.sendto(msg,xpladdr)\r\n<\/pre>\n<p>Vous trouverez le script en t\u00e9l\u00e9chargement sur mon googlecode :<\/p>\n<p><a title=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=Asterisk2xPL.agi&amp;can=2&amp;q=\" href=\"http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=Asterisk2xPL.agi\" target=\"_blank\">http:\/\/code.google.com\/p\/guiguiabloc\/downloads\/detail?name=Asterisk2xPL.agi<\/a><br \/>\nBien \u00e9videmment, si vous mettez \u00e0 jour xPL-PyHAL par le SVN, il inclut la possibilit\u00e9 de r\u00e9agir \u00e0 la r\u00e9ception ou l&rsquo;\u00e9mission d&rsquo;un num\u00e9ro de t\u00e9l\u00e9phone \ud83d\ude09<\/p>\n<p>Par exemple pour allumer le module \u00ab\u00a0m5\u00a0\u00bb a la r\u00e9ception d&rsquo;un appel du 0699999999 :<\/p>\n<pre lang=\"text\">\r\nMODULE: INBOUND\r\nTELNUMBER: \"0699999999\"\r\nACTION: command\r\nTARGETXPL: heyu\r\nTARGETCOMMAND: \"on\"\r\nTARGETMODULE: \"m5\"\r\n<\/pre>\n<p>Amusez-vous bien \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asterisk est un serveur VoIP facilement installable \u00e0 la maison. Je ne m&rsquo;\u00e9tendrais pas la dessus, il y a pl\u00e9thore de tutos sur le nain ternet pour vous expliquer ce que c&rsquo;est et comment le mettre en place. Je m&rsquo;en &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/11\/19\/asterisk-suivi-des-appels-en-xpl\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[137,13],"tags":[192,168],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1337"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1337"}],"version-history":[{"count":11,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1337\/revisions"}],"predecessor-version":[{"id":1351,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1337\/revisions\/1351"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=1337"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=1337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}