{"id":2695,"date":"2013-12-08T20:35:18","date_gmt":"2013-12-08T19:35:18","guid":{"rendered":"http:\/\/www.alphak.net\/news\/?p=2695"},"modified":"2014-09-21T16:46:17","modified_gmt":"2014-09-21T14:46:17","slug":"sms-automatise-final-round","status":"publish","type":"post","link":"https:\/\/www.alphak.net\/news\/2013\/12\/sms-automatise-final-round\/","title":{"rendered":"SMS automatis\u00e9 \u2013 Final round"},"content":{"rendered":"<p>Maintenant, termin\u00e9 les enfantillages. Envoyer des <a title=\"SMS automatis\u00e9 \u2013 Round one, fight !\" href=\"http:\/\/www.alphak.net\/news\/2013\/01\/sms-automatise-round-one-fight\/\">SMS en ligne de commande<\/a> \u00e0 <a title=\"Bonne ann\u00e9e, &lt;insert_name_here&gt; !\" href=\"http:\/\/www.alphak.net\/news\/2013\/01\/bonne-annee-insert-name-here\/\">des gens avec un nom rigolo<\/a>, c&rsquo;est tr\u00e8s amusant, mais \u00e7a montre rapidement ses limites. Pour aller plus loin, il faut mettre en place un syst\u00e8me capable de g\u00e9rer <strong>de mani\u00e8re autonome<\/strong> les \u00e9changes avec la carte SIM, et de proposer une <strong>interface de communication<\/strong> \u00e0 la fois simple, robuste, et utilisable par un grand nombre d&rsquo;applications.<\/p>\n<p>La <strong>base de donn\u00e9es<\/strong> est une interface id\u00e9ale pour cela, et il existe justement un syst\u00e8me qui peut l&rsquo;utiliser comme backend pour communiquer avec le modem GSM. Ce syst\u00e8me, c&rsquo;est <strong>gnokii-smsd<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Gnokii-smsd tourne en t\u00e2che de fond, guette les messages ins\u00e9r\u00e9s en base par des applications tierces pour les envoyer sur le modem GSM, et r\u00e9cup\u00e8re \u00e9galement les SMS arrivant sur le modem GSM pour les ins\u00e9rer en base. Que demande le peuple ?<\/p>\n<h3>Principe<\/h3>\n<p>Le mode op\u00e9ratoire de mise en place de gnokii-smsd est tr\u00e8s bien d\u00e9crit <a href=\"http:\/\/www.unixgarden.com\/index.php\/gnu-linux-magazine\/gnokii-smsd-la-gestion-des-sms-facile\" target=\"_blank\">dans ce tuto<\/a> (merci \u00e0 Mourade pour le lien), je ne m\u2019appesantirai donc pas dessus, mais donnerai plut\u00f4t quelques <strong>indications compl\u00e9mentaires<\/strong> qui me paraissent utiles pour aboutir aux m\u00eames fins en levant les doutes qui pourraient se pr\u00e9senter \u00e0 l&rsquo;imp\u00e9tueux curieux d\u00e9sirant mettre en place cette solution, tout comme ils se sont pr\u00e9sent\u00e9s \u00e0 moi.<\/p>\n<ul>\n<li>Le tuto indique de d\u00e9marrer le daemon avec l&rsquo;argument \u00ab\u00a0-l\u00a0\u00bb suivi du chemin des biblioth\u00e8ques utilis\u00e9es pour la base de donn\u00e9es. Hors, le chemin pr\u00e9sent\u00e9 <strong>n&rsquo;existe pas<\/strong> sous Debian, et le tuto ne fait pas r\u00e9f\u00e9rence au nom exact attendu pour les libs. Qu&rsquo;\u00e0 cela ne tienne, si l&rsquo;ex\u00e9cutable a \u00e9t\u00e9\u00a0 d\u00e9ploy\u00e9 gr\u00e2ce aux paquets du repository officiel Debian, le programme se d\u00e9brouille tr\u00e8s bien sans avoir \u00e0 saisir cette valeur. On peut donc ignorer l&rsquo;argument.<\/li>\n<li>Il m&rsquo;est arriv\u00e9, aux premiers lancements, de voir que les SMS restaient stock\u00e9s sur la SIM apr\u00e8s d\u00e9pilage, et que cela provoquait des doublons dans les logs. Je me suis donc demand\u00e9 comment \u00e9radiquer proprement ces SMS afin d&rsquo;\u00e9viter une <strong>saturation<\/strong> de la SIM \u00e0 terme. Je n&rsquo;ai pas la r\u00e9ponse : malgr\u00e9 le comportement observ\u00e9 aux premiers lancements, mes SMS re\u00e7us sont syst\u00e9matiquement supprim\u00e9s de la SIM apr\u00e8s copie en base de donn\u00e9es. J&rsquo;attribue cela \u00e0 un probable d\u00e9lai de suppression plus ou moins al\u00e9atoire, voire \u00e0 un mauvais param\u00e9trage aux premiers essais.<\/li>\n<li>Le daemon n&rsquo;est pas livr\u00e9 avec script de d\u00e9marrage, c&rsquo;est expliqu\u00e9 dans le tuto. Du coup, il n&rsquo;est pas livr\u00e9 avec fichier de configuration de purge des logs non plus, puisque le chemin des logs est d\u00e9clar\u00e9 dans le script de d\u00e9marrage. Il convient donc de mettre en place sa propre configuration <strong>logrotate<\/strong>. Je d\u00e9taillerai ce point un peu plus bas.<\/li>\n<\/ul>\n<p>Voila pour les aspects les plus simples. Je souhaite en d\u00e9tailler quelques autres, l\u00e9g\u00e8rement plus complexes :<\/p>\n<h3>Probl\u00e9matiques de charsets (1\/2)<strong><br \/>\n<\/strong><\/h3>\n<p>Avec ma locale usuelle fr_FR.UTF-8, si je lance smsd, que ce soit manuellement ou par script, les messages r\u00e9cup\u00e9r\u00e9s de la SIM sont lus en unicode, convertis en UTF-8,\u00a0 et stock\u00e9s en base dans un champ texte sous forme de suite d&rsquo;octets, alors que ma base est d\u00e9j\u00e0 au format UTF-8.<\/p>\n<p>Il y a donc une sorte de <strong>\u00ab\u00a0double-encodage\u00a0\u00bb<\/strong> \u00e0 l&rsquo;\u00e9criture. Ce qui fait que tous les caract\u00e8res accentu\u00e9s se transformeront en <em>caract\u00c3\u00a8res accentu\u00c3\u00a9s<\/em> (sic) lors de la lecture de la base par l&rsquo;application tierce. Il conviendra donc d&rsquo;effectuer logiciellement la <strong>conversion de charset<\/strong> ad\u00e9quate lors de la lecture de la base par une application tierce, ainsi que l&rsquo;op\u00e9ration inverse lors de l&rsquo;\u00e9criture. Je donnerai plus d&rsquo;indications \u00e0 ce sujet un peu plus tard.<\/p>\n<h3>Probl\u00e9matiques de verrouillage de carte SIM<\/h3>\n<p>On peut vouloir, pour une raison ou une autre, conserver l&rsquo;acc\u00e8s \u00e0 la carte SIM par <strong>code PIN<\/strong>. Dans ce cas, il est n\u00e9cessaire que le script de d\u00e9marrage v\u00e9rifie si le code PIN doit \u00eatre entr\u00e9, et si oui qu&rsquo;il r\u00e9alise cette op\u00e9ration.<\/p>\n<p>Malheureusement, gnokii ne communique pas cette information via un code retour. Je dois donc utiliser une indication donn\u00e9e par un texte sur la sortie standard.\u00a0 Texte qui est susceptible de varier avec les versions, c&rsquo;est discutable, mais c&rsquo;est comme \u00e7a. Contact\u00e9s \u00e0 ce sujet, les d\u00e9veloppeurs trouvent cette impl\u00e9mentation normale. Moi pas, mais c&rsquo;est leur software, libre \u00e0 chaque m\u00e9content de le forker et de l&rsquo;adapter. Sans aller jusqu&rsquo;\u00e0 cette extr\u00e9mit\u00e9, j&rsquo;ai ajout\u00e9 une petite v\u00e9rification sur la sortie textuelle dans le script de d\u00e9marrage avant lancement du daemon.<\/p>\n<h3>Probl\u00e9matiques de charsets (2\/2)<\/h3>\n<p>J&rsquo;ai compris un peu tard que la locale de lancement du script au d\u00e9marrage du syst\u00e8me d&rsquo;exploitation (LANG=C) ne correspond pas \u00e0 la locale usuelle de mes comptes (LANG=fr_FR.UTF-8). L&rsquo;effet de bord est que les caract\u00e8res non-ASCII des SMS ne sont pas stock\u00e9s en base <strong>de la m\u00eame mani\u00e8re<\/strong> si le script est lanc\u00e9 manuellement par un utilisateur, ou automatiquement au d\u00e9marrage. J&rsquo;ai r\u00e9solu ce probl\u00e8me en for\u00e7ant \u00e9galement la locale \u00e0 fr_FR.UTF-8 dans le script de d\u00e9marrage.<\/p>\n<h3><strong>Ajustements p\u00e9riph\u00e9riques<br \/>\n<\/strong><\/h3>\n<p>Il est toujours plus pratique de s&rsquo;adresser au modem GSM via un lien symbolique (\/dev\/wavecom dans mon cas) que via un inode g\u00e9n\u00e9rique du type \/dev\/ttyUSB0, surtout lorsqu&rsquo;on a plusieurs p\u00e9riph\u00e9riques USB.<\/p>\n<p>Pour rem\u00e9dier \u00e0 cela, j&rsquo;ai laiss\u00e9 le soins \u00e0 <strong>udev<\/strong> de cr\u00e9er le lien symbolique sur la base du Vendor ID et Product ID indiqu\u00e9s par le p\u00e9riph\u00e9rique. J&rsquo;ai donc ajout\u00e9 le contenu suivant dans \/etc\/udev\/rules.d\/10-local.rules<\/p>\n<pre class=\"prettyprint\"># Wavecom Fastrack GSP modem\r\n# lsusb: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port\r\nSUBSYSTEMS==&#34;usb&#34;, ATTRS{idVendor}==&#34;067b&#34;, ATTRS{idProduct}==&#34;2303&#34;, SYMLINK=&#34;wavecom&#34;<\/pre>\n<h3><strong>R\u00e9sultat des courses<br \/>\n<\/strong><\/h3>\n<p>Une archive smsd.tgz contenant mon script de lancement, un exemple de fichier de configuration, et une configuration pour logrotate, est disponible sur la page des <a title=\"T\u00e9l\u00e9chargements\" href=\"http:\/\/www.alphak.net\/news\/telechargements\/\">t\u00e9l\u00e9chargements<\/a>. Sous Debian, il faut bien s\u00fbr utiliser insserv pour installer proprement le script de d\u00e9marrage.<\/p>\n<h3>Exploitation<\/h3>\n<p>\u00c0 partir de l\u00e0, \u00e0 chacun de faire comme il l&rsquo;entend pour g\u00e9rer ses envois et r\u00e9ceptions \u00e0 partir de scripts tiers.<\/p>\n<p>\u00c0 titre d&rsquo;exemple, j&rsquo;ai commenc\u00e9 par mettre en place une simple page PHP qui affiche proprement (par proprement j&rsquo;entends \u00ab\u00a0de mani\u00e8re correctement format\u00e9e\u00a0\u00bb) les messages re\u00e7us. L&rsquo;affichage des messages envoy\u00e9s est extr\u00eamement similaire. Avec un peu de plugin javascript du type <a href=\"http:\/\/datatables.net\/\" target=\"_blank\">DataTables<\/a>, on obtient un affichage minimaliste et ergonomique, tel que celui-ci :<\/p>\n<div id=\"attachment_2802\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/sms-inbox.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2802\" class=\"size-medium wp-image-2802\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/sms-inbox-300x110.png\" alt=\"Le tableau liste l'ensemble des SMS re\u00e7us.\" width=\"300\" height=\"110\" \/><\/a><p id=\"caption-attachment-2802\" class=\"wp-caption-text\">Le tableau liste l&rsquo;ensemble des SMS re\u00e7us.<\/p><\/div>\n<p>Le transcodage des caract\u00e8res pour afficher proprement les messages malgr\u00e9 leur stockage en base avec le double-encodage \u00e9voqu\u00e9 pr\u00e9c\u00e9demment, est r\u00e9alis\u00e9 gr\u00e2ce au bout de requ\u00eate SQL qui suit (solution trouv\u00e9e et expliqu\u00e9e plus en d\u00e9tails <a href=\"http:\/\/jonisalonen.com\/2012\/fixing-doubly-utf-8-encoded-text-in-mysql\/\" target=\"_blank\">ici<\/a>) :<\/p>\n<pre class=\"prettyprint\">convert(binary convert(text using latin1) using utf8)<\/pre>\n<p>Cet exemple d&rsquo;affichage complet est \u00e9galement disponible au niveau des <a title=\"T\u00e9l\u00e9chargements\" href=\"http:\/\/www.alphak.net\/news\/telechargements\/\">t\u00e9l\u00e9chargements<\/a>.<\/p>\n<h3>\u00c9pilogue<\/h3>\n<p>Une de mes premi\u00e8res actions sera de planifier l&rsquo;envoi d&rsquo;un simple <strong>SMS de ping<\/strong>, 2 fois par an, afin de maintenir le compte associ\u00e9 \u00e0 la carte SIM actif, comme le pr\u00e9voient les condition g\u00e9n\u00e9rales d&rsquo;utilisation (un acte payant par an). \u00c0 ce propos, il faut savoir que B&amp;You, qui m&rsquo;a initialement fourni la carte SIM, a transf\u00e9r\u00e9 la gestion des contrats des cartes pr\u00e9pay\u00e9es sans dur\u00e9e de validit\u00e9 \u00e0 <strong>Simyo<\/strong>. Ni B&amp;You ni Simyo ne proposent \u00e0 ce jour l&rsquo;ouverture de nouveaux contrats similaires. Pour obtenir une carte SIM pr\u00e9pay\u00e9e sans dur\u00e9e de validit\u00e9, il faudra peut-\u00eatre dor\u00e9navant fouiller du c\u00f4t\u00e9 des offres propos\u00e9es par la <strong>grande distribution<\/strong>.<\/p>\n<p>Enfin, je ne saurais r\u00e9sister \u00e0 l&rsquo;envie de montrer \u00e0 quoi ressemble l&rsquo;installation finalis\u00e9e :<\/p>\n<div id=\"attachment_2795\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-1.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2795\" class=\"size-medium wp-image-2795\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-1-300x225.jpg\" alt=\"Serveur, onduleur, et modem GSM.\" width=\"300\" height=\"225\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-1-300x225.jpg 300w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-1-768x576.jpg 768w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-1.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-2795\" class=\"wp-caption-text\">Serveur, onduleur, et modem GSM.<\/p><\/div>\n<div id=\"attachment_2794\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-2.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2794\" class=\"size-medium wp-image-2794\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-2-300x225.jpg\" alt=\"M\u00eame chose, mais angle de vue diff\u00e9rent.\" width=\"300\" height=\"225\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-2-300x225.jpg 300w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-2-768x576.jpg 768w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/12\/smsd-wavecom-2.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-2794\" class=\"wp-caption-text\">M\u00eame chose, mais angle de vue diff\u00e9rent.<\/p><\/div>\n<p>C&rsquo;est tout pour aujourd&rsquo;hui. Dans mon prochain article, je pr\u00e9senterai bri\u00e8vement quelques \u00e9volutions men\u00e9es en profondeur sur ce blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Maintenant, termin\u00e9 les enfantillages. Envoyer des <a title=\"SMS automatis\u00e9 \u2013 Round one, fight !\" href=\"http:\/\/www.alphak.net\/news\/2013\/01\/sms-automatise-round-one-fight\/\">SMS en ligne de commande<\/a> \u00e0 <a title=\"Bonne ann\u00e9e, &lt;insert_name_here&gt; !\" href=\"http:\/\/www.alphak.net\/news\/2013\/01\/bonne-annee-insert-name-here\/\">des gens avec un nom rigolo<\/a>, c&rsquo;est tr\u00e8s amusant, mais \u00e7a montre rapidement ses limites. Pour aller plus loin, il faut mettre en place un syst\u00e8me capable de g\u00e9rer <strong>de mani\u00e8re autonome<\/strong> les \u00e9changes avec la carte SIM, et de proposer une <strong>interface de communication<\/strong> \u00e0 la fois simple, robuste, et utilisable par un grand nombre d&rsquo;applications.<\/p>\n<p>La <strong>base de donn\u00e9es<\/strong> est une interface id\u00e9ale pour cela, et il existe justement un syst\u00e8me qui peut l&rsquo;utiliser comme backend pour communiquer avec le modem GSM. Ce syst\u00e8me, c&rsquo;est <strong>gnokii-smsd<\/strong>.<\/p>\n\t<div class=\"post-teaser-block\">\r\n\t\t<div class=\"teaserHellip\">\r\n\t\t\t<span class=\"teaserLeft\">[<\/span><span class=\"teaserCenter\">&hellip;<\/span><span class=\"teaserRight\">]<\/span>\r\n\t\t<\/div>\r\n\t\t<div class=\"teaserText\">\r\n\t\t\t<a href=\"https:\/\/www.alphak.net\/news\/2013\/12\/sms-automatise-final-round\/\" title=\"SMS automatis\u00e9 \u2013 Final round\" rel=\"bookmark\"><span class=\"teaserlink\">Lire la suite de l'article&nbsp;<i class=\"fa fa-chevron-right\"><\/i><\/span><\/a>\r\n\t\t<\/div>\r\n\t\t<a class=\"teaserLink\" href=\"https:\/\/www.alphak.net\/news\/2013\/12\/sms-automatise-final-round\/\" title=\"SMS automatis\u00e9 \u2013 Final round\" rel=\"bookmark\"><\/a>\r\n\t<\/div>\r\n","protected":false},"author":1,"featured_media":2795,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[253],"tags":[320,343,265,97,322,263,334],"class_list":["post-2695","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projet-domotique","tag-automatisation","tag-code","tag-gnokii","tag-gsm","tag-notification","tag-sms","tag-smsd"],"_links":{"self":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2695"}],"collection":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/comments?post=2695"}],"version-history":[{"count":21,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2695\/revisions"}],"predecessor-version":[{"id":2913,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2695\/revisions\/2913"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media\/2795"}],"wp:attachment":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media?parent=2695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/categories?post=2695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/tags?post=2695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}