<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1135"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1135/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1135/atom/feed</id>
  <updated>2008-08-12T21:51:15+02:00</updated>
  <entry>
    <title>Faire causer Linux avec son téléphone BlueTooth</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1135" />
    <id>http://artisan.karma-lab.net/node/1135</id>
    <published>2007-11-29T11:12:01+01:00</published>
    <updated>2008-08-12T21:51:15+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Matériel" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Voilà, réception d'un nouveau téléphone qui cette fois, je l'espère, durera plus que l'ancien. Et comme le dit téléphone est vide de tout, je branche ma "vieille" clef USB-
  <a target='_blank' href='http://fr.wikipedia.org/wiki/bluetooth'>
  bluetooth
  </a> qui m'avait tant réussie sous Mandriva 2007.0 pour envoyer dans le petit zin-zin sonneries et autre carnet d'adresses. Et là, l'outil KDE (kbluetooth) qui avait si bien fonctionné à l'époque ne reconnaît plus rien. 
</p>
<p>
  Alors ok, l'outil kde_tout_beau ne marche pas. Mais l'avantage de linux reste que si lorsque graphique part en vrille, la ligne de commande, elle, on ne le dira jamais assez, restera éternellement votre amie. Je m'en vais donc vous conter la méthode "Conan", pour importer entre autre un carnet d'adresse, via bluetooth. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  Voilà, réception d'un nouveau téléphone qui cette fois, je l'espère, durera plus que l'ancien. Et comme le dit téléphone est vide de tout, je branche ma "vieille" clef USB-
  <a target='_blank' href='http://fr.wikipedia.org/wiki/bluetooth'>
  bluetooth
  </a> qui m'avait tant réussie sous Mandriva 2007.0 pour envoyer dans le petit zin-zin sonneries et autre carnet d'adresses. Et là, l'outil KDE (kbluetooth) qui avait si bien fonctionné à l'époque ne reconnaît plus rien. 
</p>
<p>
  Alors ok, l'outil kde_tout_beau ne marche pas. Mais l'avantage de linux reste que si lorsque graphique part en vrille, la ligne de commande, elle, on ne le dira jamais assez, restera éternellement votre amie. Je m'en vais donc vous conter la méthode "Conan", pour importer entre autre un carnet d'adresse, via bluetooth. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Découverte des services</h2>
	
<p>
  Si tout est correctement installé (paquets bluez et bluez-utils), le chargement de la pile Bluetooth se fait par un la commande suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">##service bluetooth start</span>
  </div>
  
  </div>
</p>
<p>
  Si tout c'est bien passé, un <kbb>ps -edaf</kbd> vous indique que deux nouveaux démons sont présents : <kbd>hcid</kbd> pour Host Controller Interface Daemon, et </kbd>sdpd</kbd> pour Service Discovery Protocol Daemon. Le premier est donc chargé de la clef elle-même et l'autre de gérer les services que peut offrir un périphérique bluetooth connecté à la clef. 
</p>
<p>
  Alors vérifions déjà si la clef est reconnue dans le système :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>hciconfig</div><div class='result'>hci0:   Type: USB</div><div class='result'>...</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Ok, notre adaptateur est donc visible (hci0). Maintenant regardons les périphériques visibles par notre clef :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>hcitool scan</div><div class='result'>Scanning ...</div><div class='result'>00:1D:25:FB:A2:75       SGH-D840</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>

<p>
  Parfait, mobile en vue, son adresse bluetooth est donc <kbd>00:1D:25:FB:A2:75</kbd>. Voyons maintenant ce que ce téléphone sait faire. La commande suivante sans le <kbd>grep</kbd> donnerait plus d'information, mais là nous cherchons à obtenir la liste des services disponibles, et surtout le canal bluetooth associé à chaque service. En effet en blutooth c'est comme en TCP/IP, à l'adresse IP correspond notre adresse bluetooth, les services du périphériques peuvent être vu comme des serveurs et enfin les ports qu'écouteraient ces serveurs sont appelés des canaux (Channels). 
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>sdptool records 00:1D:25:FB:A2:75 | grep -P 'Service Name|Channel'</div><div class='result'>Service Name: Dial-up networking</div><div class='result'>Channel: 1</div><div class='result'>Service Name: Voice GW</div><div class='result'>Channel: 2</div><div class='result'>Service Name: Bluetooth Serial Port</div><div class='result'>Channel: 5</div><div class='result'>Service Name: Voice Gateway</div><div class='result'>Channel: 6</div><div class='result'>Service Name: OBEX FileTransfer</div><div class='result'>Channel: 9</div><div class='result'>Service Name: OPP</div><div class='result'>Channel: 3</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Dans cette liste, pour l'instant, deux services nous intéressent particulièrement : <kbd>OOP</kbd> et <kbd>OBEX File Transfert</kbd> qui sont respectivement sur les canaux <kbd>9</kbd> et <kbd>3</kbd>. 
</p>
<div class='inline-box note'>
   La différence entre les deux commandes <kbd>hcitool</kbd> et <kbd>sdptool</kbd> est la même que celle entre les démons <kbd>hcid</kbd> et <kbd>sdpd</kbd> dont nous parlions plus haut. Alors qu'hcitool renseigne sur la capacités de la clef et des périphériques visibles, sdptool permet d'obtenir des informations sur les services disponibles sur un périphérique.
</div>



	<a name='chapter_2'></a>
  <h2>OBEX FTP</h2>
	
<p>
  Le <kbd>OBEX FileTransfert</kbd>, disponible ici sur le canal 9, est un protocole permettant l'échange de fichier. A ce titre il est à rapprocher d'un serveur FTP. Il est grâce à lui possible de lire les dossiers présent sur le périphérique, de se déplacer dans l'arborescence, et enfin d'envoyer et recevoir des fichiers. 
</p>
<p>
  Et comme <kbd>OBEX FT</kbd> est une sorte de serveur FTP, il y existe pour lui un client <kbd>OBEX FT</kbd>. Il faut pour cela installer le paquet <kbd>obexftp</kbd>. Ceci fait, pour avoir la liste des dossiers à la racine du téléphone il suffit d'invoquer la commande <kbd>obexftp -b 00:1D:25:FB:A2:75 -l</kbd>
</p>
<p>
  De la même manière, nous pouvons envoyer ou recevoir un fichier :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='co0'># Envoyer un fichier</div><div class='command'><span class='prompt'>root#</span>obexftp -b 00:1D:25:FB:A2:75 -p ~/Desktop/photo_de_ma_cherie.jpeg</div><div class='result'>&nbsp;</div><div class='co0'># Récupérer un fichier</div><div class='command'><span class='prompt'>root#</span>obexftp -b 00:1D:25:FB:A2:75 -g Music/nausica.mp3</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Voilà qui va déjà nous permettre d'échanger photos, sonneries, images, etc, avec le mobile. La moitié du boulot est donc réalisée. Mais il nous reste encore à trouver le moyen d'exporter un carnet d'adresse. 
</p>



	<a name='chapter_3'></a>
  <h2>Object Push Protocol</h2>
	
<p>
  <kbd>OPP</kbd> ou <kbd>Object Push Protocol</kbd>, permet d'envoyer un fichier au mobile comme le permettrait <kbd>obexftp</kbd>. Mais contrairement à ce dernier, OOP est conçu pour que le fichier reçu soit interprété par le téléphone et non pas être simple stocké dans sa mémoire. Par exemple, et c'est ce qui va nous servir plus loin, pour la majorité des téléphones, si le fichier poussé est une 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/vCard'>
  vCard
  </a>, il sera directement stocké dans le carnet d'adresses.
</p>
<p>
  Donc comme nous avions un client <kbd>OBEX TP</kbd>,  il nous faut un client <kbd>OOP</kbd> pour pousser nos fichiers.  Malheureusement il n'y en a pas d'inclus dans la Mandriva en standard (du moins je n'en ai pas trouvé). La solution est donc de télécharger <a class='external' target='_blank' href='http://www.xmailserver.org/ussp-push.html' >ussp-push</a> et de le compiler nous-mêmes.
</p>
<p>
  Rien de bien sorcier là dedans, juste décompresser l'archive, aller dans le dossier 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/./ussp-push/'>
  ./ussp-push/
  </a>, vérifier que les paquets de développement de bluez sont installés (libbluez-devel) et lancer un classique <kbd>make</kbd>. Au bout de quelques secondes, un exécutable <kbd>ussp-push</kbd> est fabriqué, vous pouvez le déplacer en <kbd>/usr/bin</kbd>
</p>
<p>
  
  <a target='_blank' href='http://fr.wikipedia.org/wiki/ussp-push'>
  ussp-push
  </a> fonctionne, comme 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/obexftp'>
  obexftp
  </a>, avec l'adresse bluetooth du téléphone. Par exemple pour envoyer un jpeg dans le téléphone. Et comme nous l'avons vu plus haut, le canal <kbd>OPP</kbd> est, pour ce téléphone, le <kbd>3</kbd>. Cela nous donnes pour envoyer une photo dans le téléphone :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>./ussp-push 00:1D:25:FB:A2:75@3 ~/Desktop/photo.jpeg photo.jpeg</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
   Nous retrouvons donc l'adresse bluetooth, le <kbd>3</kbd> correspondant au canal utilisé par OOP, le fichier à envoyer et le nom du fichier à inscrire dans le téléphone. 
</p>
<p>
  Voilà, nous avons maintenant l'outil nous permettant d'envoyer notre carnet d'adresses dans notre téléphone, et ceci grâce à OOP et aux vCards. 
</p>



	<a name='chapter_4'></a>
  <h2>Méthode sauvage d'export de carnet d'adresse</h2>
	
<p>
  Un fichier vCard (extension .vcf) contient une ou plusieurs cartes de visite. C'est même le format qu'utilise <kbd>kaddressbook</kbd> pour son stockage. Il s'agit d'un simple fichier texte contenant des suites d'enregistrements composés de champs (nom, adresse, numéros, etc.). Or par chance, nombre de téléphones utilisent justement ce même format pour échanger des cartes de visites via <kbd>OOP</kbd>. 
</p>
<p>
  L'histoire pourrait donc s'arrêter là en faisant un <kbd>ussp-push</kbd> du fichier de stockage de <kbd>kaddressbook</kbd> mais malheureusement, mon téléphone ne sait pas analyser un fichier vCard comprenant plus d'une entrée. Il va donc falloir introduire une étape supplémentaire et demander à <kbd>kaddressbook</kbd> un export au format vCard 2.1, avec tous les champs, mais en créant un fichier par enregistrement. Ce qui ne lui pose pas plus de problèmes que cela (fonction <kbd>Fichier/Exporter...</kbd>). 
</p>
<p>
  Une fois sa tache terminée, vous devez avoir un dossier remplis de fichiers <kbd>vcf</kbd>. A ce stade, il est sage d'aller configurer son téléphone pour autoriser le PC à communiquer sans confirmation, de sorte à ne pas avoir à valider chaque arrivée dans le carnet d'adresse. 
</p>
<p>
  Il ne nous reste plus maintenant qu'à écrire le petit script qui va pousser chaque fichier vcf dans le téléphone :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">#! /usr/bin/perl</span><br />
<br />
<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$directory</span><span class="sy0">,</span><span class="re0">$address</span><span class="br0">&#41;</span><span class="sy0">=</span><span class="re0">@ARGV</span><span class="sy0">;</span><br />
<br />
<a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;Les fichiers vCard sont dans :$directory<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<br />
<a target="blank" href="http://perldoc.perl.org/functions/opendir.html"><span class="kw3">opendir</span></a><span class="br0">&#40;</span>DIRHANDLE<span class="sy0">,</span> <span class="st0">&quot;$directory&quot;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <a target="blank" href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Impossible d'ouvrir le dossier $directory : $!&quot;</span><span class="sy0">;</span><br />
<span class="kw1">foreach</span> <span class="re0">$name</span> <span class="br0">&#40;</span><a target="blank" href="http://perldoc.perl.org/functions/sort.html"><span class="kw3">sort</span></a> <a target="blank" href="http://perldoc.perl.org/functions/readdir.html"><span class="kw3">readdir</span></a><span class="br0">&#40;</span>DIRHANDLE<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/open.html"><span class="kw3">open</span></a><span class="br0">&#40;</span>DAT<span class="sy0">,</span> <span class="st0">&quot;$directory/$name&quot;</span><span class="br0">&#41;</span> <span class="sy0">||</span> <a target="blank" href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="st0">&quot;Impossible d'ouvrir le vCard : $!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="re4">&lt;DAT&gt;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$line</span><span class="sy0">=</span><span class="co5">$_</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$line</span> <span class="sy0">=~</span> <span class="co2">/^FN:.*$/</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;--== Envoi de $_&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/system.html"><span class="kw3">system</span></a><span class="br0">&#40;</span><span class="st0">&quot;ussp-push $address &quot;</span><span class="re0">$directory</span><span class="sy0">/</span><span class="re0">$name</span><span class="st0">&quot; &quot;</span><span class="re0">$name</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://perldoc.perl.org/functions/select.html"><span class="kw3">select</span></a><span class="br0">&#40;</span><a target="blank" href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a><span class="sy0">,</span> <a target="blank" href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a><span class="sy0">,</span> <a target="blank" href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a><span class="sy0">,</span> <span class="nu0">0.50</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
<span class="br0">&#125;</span><br />
<a target="blank" href="http://perldoc.perl.org/functions/closedir.html"><span class="kw3">closedir</span></a><span class="br0">&#40;</span>DIRHANDLE<span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  Ce script perl est simple d'utilisation, vous le lancez par la commande suivante :
  
  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>chmod +x export_address_book.pl</div><div class='command'><span class='prompt'>root#</span>./export_address_book.pl ~/Desktop/phonebook 00:1D:25:FB:A2:75@3</div><div class='command'><span class='prompt'>root#</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Le premier paramètre est le dossier où se trouvent les vCards exportées, le second la combinaison de l'adresse de votre téléphone et du canal utilisé pour OOP. Le script opère un filtrage pour n'envoyer au téléphone que les vCard qui contiennent un nom (FN:). Enfin le <kbd>0.50</kbd> permet de régler un temps de pose pour que le téléphone ne sature pas (ici .5 correspond à 500ms). Vous pouvez l'augmenter si votre téléphone n'est pas assez véloce. 
</p>



	<a name='chapter_5'></a>
  <h2>Conclusion</h2>
	
<p>
  On ne peut pas dire que cela aura été simple mais comme toujours avec Linux, les épreuves nous en apprennent beaucoup sur le système et son architecture. C'est rarement du temps perdu. Et au moins, nous ne sommes plus dépendant d'outil plus complexes mais plus fragiles. 
</p>    ]]></content>
  </entry>
</feed>
