Faire causer Linux avec son téléphone BlueTooth
Le 29 novembre 2007, à 11:12 par Ulhume...

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- bluetooth 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.

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.

Découverte des services

Si tout est correctement installé (paquets bluez et bluez-utils), le chargement de la pile Bluetooth se fait par un la commande suivante :

##service bluetooth start

Si tout c'est bien passé, un ps -edaf vous indique que deux nouveaux démons sont présents : hcid pour Host Controller Interface Daemon, et sdpd 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.

Alors vérifions déjà si la clef est reconnue dans le système :

root#hciconfig
hci0: Type: USB
...
root# 

Ok, notre adaptateur est donc visible (hci0). Maintenant regardons les périphériques visibles par notre clef :

root#hcitool scan
Scanning ...
00:1D:25:FB:A2:75 SGH-D840
root# 

Parfait, mobile en vue, son adresse bluetooth est donc 00:1D:25:FB:A2:75. Voyons maintenant ce que ce téléphone sait faire. La commande suivante sans le grep 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).

root#sdptool records 00:1D:25:FB:A2:75 | grep -P 'Service Name|Channel'
Service Name: Dial-up networking
Channel: 1
Service Name: Voice GW
Channel: 2
Service Name: Bluetooth Serial Port
Channel: 5
Service Name: Voice Gateway
Channel: 6
Service Name: OBEX FileTransfer
Channel: 9
Service Name: OPP
Channel: 3
root# 

Dans cette liste, pour l'instant, deux services nous intéressent particulièrement : OOP et OBEX File Transfert qui sont respectivement sur les canaux 9 et 3.

La différence entre les deux commandes hcitool et sdptool est la même que celle entre les démons hcid et sdpd 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.

OBEX FTP

Le OBEX FileTransfert, 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.

Et comme OBEX FT est une sorte de serveur FTP, il y existe pour lui un client OBEX FT. Il faut pour cela installer le paquet obexftp. Ceci fait, pour avoir la liste des dossiers à la racine du téléphone il suffit d'invoquer la commande obexftp -b 00:1D:25:FB:A2:75 -l

De la même manière, nous pouvons envoyer ou recevoir un fichier :

# Envoyer un fichier
root#obexftp -b 00:1D:25:FB:A2:75 -p ~/Desktop/photo_de_ma_cherie.jpeg
 
# Récupérer un fichier
root#obexftp -b 00:1D:25:FB:A2:75 -g Music/nausica.mp3
root# 

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.

Object Push Protocol

OPP ou Object Push Protocol, permet d'envoyer un fichier au mobile comme le permettrait obexftp. 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 vCard , il sera directement stocké dans le carnet d'adresses.

Donc comme nous avions un client OBEX TP, il nous faut un client OOP 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 ussp-push et de le compiler nous-mêmes.

Rien de bien sorcier là dedans, juste décompresser l'archive, aller dans le dossier ./ussp-push/ , vérifier que les paquets de développement de bluez sont installés (libbluez-devel) et lancer un classique make. Au bout de quelques secondes, un exécutable ussp-push est fabriqué, vous pouvez le déplacer en /usr/bin

ussp-push fonctionne, comme obexftp , 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 OPP est, pour ce téléphone, le 3. Cela nous donnes pour envoyer une photo dans le téléphone :

root#./ussp-push 00:1D:25:FB:A2:75@3 ~/Desktop/photo.jpeg photo.jpeg
root# 

Nous retrouvons donc l'adresse bluetooth, le 3 correspondant au canal utilisé par OOP, le fichier à envoyer et le nom du fichier à inscrire dans le téléphone.

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.

Méthode sauvage d'export de carnet d'adresse

Un fichier vCard (extension .vcf) contient une ou plusieurs cartes de visite. C'est même le format qu'utilise kaddressbook 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 OOP.

L'histoire pourrait donc s'arrêter là en faisant un ussp-push du fichier de stockage de kaddressbook 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 à kaddressbook 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 Fichier/Exporter...).

Une fois sa tache terminée, vous devez avoir un dossier remplis de fichiers vcf. 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.

Il ne nous reste plus maintenant qu'à écrire le petit script qui va pousser chaque fichier vcf dans le téléphone :

#! /usr/bin/perl

my ($directory,$address)=@ARGV;

print "Les fichiers vCard sont dans :$directory\n";

opendir(DIRHANDLE, "$directory") || die "Impossible d'ouvrir le dossier $directory : $!";
foreach $name (sort readdir(DIRHANDLE)) {
        open(DAT, "$directory/$name") || die("Impossible d'ouvrir le vCard : $!");
        while (<DAT>) {
                my $line=$_;
                if ($line =~ /^FN:.*$/) {
                        print "--== Envoi de $_";
                        system("ussp-push $address "$directory/$name" "$name"");
                        select(undef, undef, undef, 0.50);
                }
        }

}
closedir(DIRHANDLE);

Ce script perl est simple d'utilisation, vous le lancez par la commande suivante :

root#chmod +x export_address_book.pl
root#./export_address_book.pl ~/Desktop/phonebook 00:1D:25:FB:A2:75@3
root# 

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 0.50 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.

Conclusion

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.

Commentaires

mentat , le 30 November, 2007 - 15:58

Un énorme merci pour cet article j'étais il y a qques jours en train de me poser ces questions pour essayer de synchroniser palm <--> téléphone <--> contacts emails. Bref ton article va vraiment me faire gagner du temps. Bravo ! Un aquilonien.

Ulhume, le 3 December, 2007 - 01:53

J'en suis ravi Smiling

PS: Un aquilonien mentat ? C'est un concept ça Wink

cm , le 1 January, 2008 - 14:27

Salut,
Est ce qu'il y a un outil opensource qui permet d'analyser les paquets bluetooth? Car je n'ai trouvé que des outils permettant de découvrir les équipements bluetooth dans un réseau.

Merci de votre aide

chi , le 14 February, 2008 - 12:45

je te remercie pour ce sujet tres laborieux et tres instructif et c'est un sujet qui minteresse enormemant mais je voudrais savoir comment installer les pakets bluez utils et tools et ou les installer et qhuel sont les modules necessaires pour le bon fonctionnemant dune clé bluetooth sur linux

Ulhume, le 14 February, 2008 - 15:14

@cm honnêtement je ne sais pas, je n'en ai jamais entendu parler en tout cas

Ulhume, le 14 February, 2008 - 15:17

@chi Cela dépend de ta distribution mais si tu installes le paquet gnome-bluetooth, le reste devrait suivre par le jeu des dépendances. Ensuite côté modules il y en a beaucoup, mais la commande /etc/init.d/bluetooth start le chargera tous pour toi. C'est généralement fait par défaut lorsque tu installes le paquet cité plus haut après un redémarrage.

hassen , le 5 March, 2008 - 16:20

je te remercie aussi pour cet article
mais jai encore un probleme avec bluetooth!!!jarrive pas a envoyer des fichier d'un pc sous linux redhat vers un autre pc é j'ai essayé d'installer ussp-push mais jai pas reussi
stpppp si ta des suggestions a me fair ca m'aidera enormemant!!

Ulhume, le 15 March, 2008 - 11:21

Désolé mais là je n'ai pas de bonne idée. Tu dis que tu as essayé ussp-push sans succès, tu veux dire que tu n'arrives pas à le trouve ? à le compiler ? à l'utiliser ? Est-ce que tes deux PC se voient ? As-tu réussi à utiliser un autre protocole que push (ftp, etc, ) ? As-tu essayé d'envoyer du PC sur un téléphone et du téléphone sur l'autre PC ?

Manu1400 , le 12 August, 2008 - 15:11

Bonjour

Il y a un problème :
la page http://artisan.karma-lab.net/node/1135 ne contient que des commentaires
le début du contenu est visible sur http://artisan.karma-lab.net/taxonomy/term/1177

Ulhume, le 12 August, 2008 - 20:51

@Manu, voilà qui est réglé, merci Smiling

stef , le 27 August, 2008 - 00:19

Merci pour tous ces précieux tuyaux, mais comment ça se passe si ton téléphone demande un mot de passe (pairing) même pour un simple object push ?

Ulhume, le 27 August, 2008 - 04:23

@Stef Pour le peering tu as plusieurs solutions. Le plus simple est de déclarer ton PC comme périphérique de confiance. Mais c'est un peu tricher ;-} Sinon, l'option la plus simple est de coller ton code PIN dans le fichier /etc/bluetooth/pin.

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...