Retrouvez cet article dans : Linux Magazine 78
- Chercher les exécutables hcid, sdpd ou hciconfig par exemple ;
- Regarder si vous avez les modules
bluez,l2capourfcomm; - Insérer un périphérique Bluetooth et taper
dmesgà la recherche de messages semblables à :
kernel: Bluetooth: Core ver 2.7 kernel: NET: Registered protocol family 31 kernel: Bluetooth: HCI device and connection manager initialized kernel: Bluetooth: HCI socket layer initialized ...Quoi qu’il en soit, je vais reprendre dans cet article une procédure basique pour installer le support Bluetooth sur une distribution Linux quelle qu’elle soit. On va donc partir d’un kernel tout beau tout neuf de chez kernel.org, le compiler avec les options " qui vont bien ", puis installer les outils clients. Cette présentation étant faite, il est temps à présent de se lancer.
Récupérer les sources du kernel
Rendez-vous sur kernel.org pour télécharger les sources d’un kernel. On y prend le dernier stable, le 2.6.14 à l’heure où j’écris ces lignes. Devenez root et sauvez le paquet danszazou@ZazouMobile:~$ su Password: ZazouMobile:/home/zazou# cd /usr/src ZazouMobile:/usr/src# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2Décompressez votre kernel tout neuf et faites un lien vers le répertoire ainsi obtenu nommé
Configurer et compiler le kernel
Il est à présent temps de s’attaquer à la configuration du kernel... Selon vos affinités, utilisez l’interface texte (Networking support --->
<M> Bluetooth subsystem support --->
<M> L2CAP protocol support
<M> SCO links support
<M> RFCOMM protocol support
[*] RFCOMM TTY support
<M> BNEP protocol support
[*] Multicast filter support
[*] Protocol filter support
< > HIDP protocol support
Bluetooth device drivers --->
<M> HCI USB driver
[*] SCO (voice) support
<M> HCI UART driver
[*] UART (H4) protocol support
[*] BCSP protocol support
[ ] Transmit CRC with every BCSP packet (NEW)
< > HCI BCM203x USB driver (NEW)
< > HCI BPA10x USB driver (NEW)
< > HCI BlueFRITZ! USB driver (NEW)
< > HCI DTL1 (PC Card) driver (NEW)
< > HCI BT3C (PC Card) driver (NEW)
< > HCI UART (PC Card) device driver (NEW)
<M> HCI VHCI (Virtual HCI device) driver
On aura besoin pour notre série de tests des couches L2CAP et RFCOMM. On ajoute SCO (qui sert à l’audio) et BNEP (encapsulation réseau au-dessus de L2CAP) au cas où on voudrait s’en servir plus tard. HIDP permet d’utiliser des périphériques Bluetooth autorisant l’interfaçage de l’ordinateur avec des humains (aussi connus sous le nom de clavier, souris...). Si ça peut vous être utile (c’est-à -dire si vous êtes humain et possédez un clavier ou une souris Bluetooth), sélectionnez cette option.
Pour les modules correspondant au matériel, choisissez ce qui correspond au vôtre. Dans cet article, j’utilise un dongle USB générique. J’ai donc choisi le module usb (Transport défini dans la partie H:2 de la norme, donc bien supporté). Le driver UART sert dans le cas de cartes pcmcia ou de cartes série.
Selon le protocole utilisé par ce type de matériel, vous aurez besoin du support h4 (générique) ou bcsp (spécifique aux chipsets CSR). Les autres modules correspondent à du matériel particulier (BT3C pour la carte pcmcia de chez 3Com par exemple). Il peut être bon de choisir de compiler vhci en module. Ce dernier permet d’émuler une interface Bluetooth sans matériel Bluetooth raccordé au PC et ça peut être utile pendant certaines phases de développement.
Installer le kernel
Tout commence par une simple ligne de commande. Cette dernière a le bon goût de vous laisser le temps d’aller prendre un café...ZazouMobile:/usr/src/linux# make && make modules_installA son terme et si tout s’est bien passé, vous devez encore copier le kernel lui-même et configurer votre boot loader (lilo ou grub généralement). Il y a quasiment autant de façons de faire que d’ordinateurs sous Linux. Pour vous donner une idée, chez moi, ça consiste à copier le kernel au bon emplacement (
image=/vmlinuz-2.6.14
label = Linux-2.6.14
read-only
et, enfin, faire prendre en compte cette entrée par lilo, puis le réinstaller. (alias usb:v*p*dl*dh*dcE0dsc01dp01ic*isc*ip* hci_usb alias usb:v057Cp3800dl*dh*dc*dsc*dp*ic*isc*ip* hci_usb alias usb:v04BFp030Adl*dh*dc*dsc*dp*ic*isc*ip* hci_usb alias usb:v044Ep3001dl*dh*dc*dsc*dp*ic*isc*ip* hci_usb alias usb:v044Ep3002dl*dh*dc*dsc*dp*ic*isc*ip* hci_usb alias usb:v0BDBp1002dl*dh*dc*dsc*dp*ic*isc*ip* hci_usb alias net-pf-31 bluetooth alias bt-proto-0 l2cap alias bt-proto-2 sco alias bt-proto-3 rfcomm alias bt-proto-4 bnep alias bt-proto-5 cmtp alias bt-proto-6 hidp alias tty-ldisc-15 hci_uart alias char-major-10-250 hci_vhciA l’issue de ces quelques commandes et modifications, vous devriez avoir un noyau 2.6 avec le support Bluetooth fonctionnel. Pour le vérifier, il faut rebooter.
Après le reboot
Il va nous falloir procéder à l’installation des outils Bluetooth. Pour ça, il faut consulter la liste de paquets de votre distribution ou se rendre sur http://www.bluez.org/ et télécharger les dernières versions des paquets suivants :bluez-libsbluez-utilsbluez-hcidumpbluez-pinbluez-firmwarebluez-hciemu
Utilitaires et fichiers de configuration
Bien ! Votre kernel a le support Bluetooth. Il est temps de le tester... La configuration de Bluetooth passe par l’outil hciconfig. Dans la pratique, on utilise des fichiers de configuration pour automatiser la configuration, dans le répertoireZazouMobile:/home/zazou# hciconfig hci0 up piscan
ZazouMobile:/home/zazou# hciconfig hci0 -a
hci0: Type: USB
BD Address: 00:02:72:B3:46:D8 ACL MTU: 377:10 SCO MTU: 16:0
UP RUNNING PSCAN ISCAN
RX bytes:468 acl:10 sco:0 events:39 errors:0
TX bytes:539 acl:10 sco:0 commands:22 errors:0
Features: 0xff 0xff 0x0d 0x38 0x00 0x00 0x00 0x00
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: ‚ZazouMobile-0‘
Class: 0x3e0100
Service Classes: Networking, Rendering, Capturing
Device Class: Computer, Uncategorized
HCI Ver: 1.1 (0x1) HCI Rev: 0x3 LMP Ver: 1.1 (0x1) LMP Subver: 0x800
Manufacturer: Broadcom Corporation (15)
Normalement, les modules ZazouMobile:/home/zazou# sdptool browse 00:0E:6D:4E:52:EF | grep \ "Service Name" Service Name: Fax Service Name: Dial-up Networking Service Name: Bluetooth Serial Port Service Name: OBEX Object Push Service Name: OBEX File Transfer Service Name: Handsfree Audio Gatewayla présence d’un port série virtuel, on verra quoi faire avec pour s’assurer de briller en société ultérieurement. On retrouve également nos deux possibilités habituelles pour utiliser OBEX, l’
Et après ?
Les outils que j’ai cité font bien d’autres choses utiles pour des tests et leurs sources sont une mine d’or pour le développeur découvrant Bluetooth sous Linux. hcitool permet notamment de faire des connexions/déconnexions, des recherches de périphériques avec ou sans interrogation du nom, hciconfig permet de configurer le comportement de Bluez de façon avancée, sdptool permet de gérer la base de services locale, conjointement à sdpd. Il existe également des outils d’aide aux tests qui sont utiles en phase de développement, pour tester les diverses couches de la pile Bluetooth d’un périphérique distant ou de vérifier le fonctionnement d’une application particulière. Il s’agit de l2test, rctest, scotest qui contiennent des jeux de tests pour vérifier le bon fonctionnement des couches l2cap, rfcomm et sco respectivement. Enfin, le meilleur ami du développeur Bluetooth sous Linux est hcidump, qui permet de tracer l’intégralité des trames Bluetooth transitant par la machine (Attention à l’utiliser en root, sinon, on ne récupère pas l’intégralité des trames).Quelques exemples
De nombreuses applications Bluetooth nécessitent un pairing, une relation de confiance entre les périphériques. On crée cette confiance par le partage d’un mot de passe. Ce mot de passe contient des caractères alphanumériques. Vous devez le saisir dans le fichierPartager une connexion internet
Si vous souhaitez permettre l’accès à internet à un PDA équipé de Bluetooth mais pas du Wi-Fi ni d’Ethernet, vous pouvez très simplement utiliser Bluez pour le faire. Il nous faut au préalable configurer Bluez pour qu’il tente de rester maître de ses connexions. Il faut pour cela vérifier que la ligne suivante existe et n’est pas commentée danslm accept,masterOn utilise plus exactement le démon pand (PAN pour Personnal Area Network). Ce dernier peut être utilisé en client ou en point d’accès. Nous voulons être point d’accès, nous utilisons donc les options
ZazouMobile:/usr/src# pand --listen --role NAPNotez que pand se charge d’ajouter le service Network Access Point à la base sdp locale :
ZazouMobile:/usr/src# sdptool browse local | grep "Service Name" Service Name: SDP Server Service Name: Public Browse Group Root Service Name: Network Access PointOn peut ensuite surveiller les connexions grâce Ã
ZazouMobile:/usr/src# pand --show bnep0 00:02:78:39:CE:C8 NAPOn voit ici que pand est connecté au périphérique Bluetooth dont l’adresse est
ZazouMobile:/usr/src# ifconfig -a
bnep0 Lien encap:Ethernet HWaddr 00:02:72:B3:46:D8
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:1547 (1.5 KiB) TX bytes:0 (0.0 b)
Il nous faut monter cette interface et lui affecter une adresse. Cela se fait comme pour toutes les interfaces Ethernet, Wi-Fi ou PPP. Par l’affectation d’une adresse IP.
On doit faire la même chose sur le client à moins qu’un serveur DHCP soit configuré quelque part. Je décide ici d’utiliser l’IP 192.168.100.254 pour le point d’accès et ZazouMobile:/usr/src# ifconfig bnep0 192.168.100.254 ZazouMobile:/usr/src# ping 192.168.100.1 PING 192.168.100.1 (192.168.100.1): 56 data bytes 64 bytes from 192.168.100.1: icmp_seq=0 ttl=128 time=88.5 ms 64 bytes from 192.168.100.1: icmp_seq=1 ttl=128 time=38.6 ms 64 bytes from 192.168.100.1: icmp_seq=2 ttl=128 time=102.6 ms 64 bytes from 192.168.100.1: icmp_seq=3 ttl=128 time=41.6 ms --- 192.168.100.1 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 38.6/67.8/102.6 msBien ! Ca fonctionne. Pour mieux faire, il faudrait automatiser cette affectation d’adresse sur le serveur. A titre d’exemple, sur une Debian, cela consiste à ajouter ces quelques lignes au fichier
allow-hotplug bnep0
iface bnep0 inet static
address 192.168.100.254
netmask 255.255.255.0
Pour l’automatiser sur le client, on peut installer un serveur dhcp, ce n’est pas difficile, mais ça sort un peu du cadre de cette introduction à Bluetooth. Voyez du côté du serveur dhcp de l’isc par exemple, très simple à mettre en œuvre.
Enfin, il nous faut autoriser le routage des paquets arrivant de Bluetooth et à destination du monde et à mettre en place le masquerading... La méthode à l’ancienne consiste à placer ces deux lignes par exemple en fin de fichier echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADEUn test sur http://mire.ipadsl.net/ nous informe d’un débit un peu inférieur à 90kbps. C’est peu mais c’est mieux que rien et ça peut suffire pour aller consulter un webmail ou des feeds RSS depuis un PDA. Rappelons-nous qu’il y a peu de temps, on ne se connectait qu’à 33600 ou 56000kbps (les bauds ne sont pas des bps, mais je me permets de prendre ce raccourci ici). Naturellement, on peut optimiser et faire plus sûr, notamment si votre machine fait déjà routeur. Consultez les documentations à votre disposition pour adapter cette base. Sur Debian, par exemple, pour activer le routage, on met plutôt
Console Python Bluetooth
Nokia a décidé de fournir aux heureux développeurs détenteurs d’un téléphone basé sur la plate-forme Series60 (3650, 6260, NGage, NGage-QD, 6600 etc.) d’outils de développement Python. C’est une bonne initiative pour les amateurs de Python, mais quel est le rapport avec Bluetooth ? On peut utiliser Bluetooth dans les scripts Python mais, surtout, Nokia nous propose une console Python sur le téléphone accessible via Bluetooth. Voyons cela tout de suite.Sur le PC
Sur le site développeur de Nokia, on cherche " Python for Series 60 " dans la liste " Technologies ". Il faut attentivement lire la page pour trouver à laquelle des 3 éditions appartient son téléphone. Pour les NGage, il s’agit du fichier ZazouMobile:/home/zazou# sdptool browse 00:0E:6D:4E:52:EF
...
Service Name: OBEX Object Push
Service RecHandle: 0x10003
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 9
"OBEX" (0x0008)
...
ZazouMobile:/home/zazou# ussp-push 00:0E:6D:4E:52:EF@9 PythonForSeries60_1stEd.SIS PythonForSeries60_1stEd.SIS
Sur le téléphone
Le NGage reçoit le fichier comme un SMS à ceci près que l’affichage de ce " message " provoque le lancement de l’installation. Quand on vous demande " Installer Python for Series 60 ? ", dites " oui ". Vous trouverez à la fin de cette installation une nouvelle application nommée Python sur le téléphone.Sur le PC
Nous avons quelques préparatifs supplémentaires à faire ici :ZazouMobile:/home/zazou# sdptool add --channel 1 SP Serial Port service registered ZazouMobile:/home/zazou# rfcomm listen /dev/rfcomm0 1 Waiting for connection on channel 1 ...On doit tout d’abord accepter les connexions de type port série virtuel. On ajoute alors ce profil à la base SDP locale. On attribue ensuite un numéro de canal rfcomm à notre périphérique (le même que celui saisi dans la base, ici, le 1). On attend ensuite une connexion sur le canal 1 (c’est en fait le dlci 2 et vous savez pourquoi si vous avez suivi la théorie). On affecte à cette connexion le port série virtuel
Sur le téléphone
On peut enfin lancer l’application Python. Dans le menu, on choisit Bluetooth console et le téléphone recherche les périphériques présents. On choisit le bon et on constate alors (si on a hcidump lancé quelque part) qu’une recherche SDP se lance pour trouver un service " Serial Port "... S’il est trouvé, on nous demande si on souhaite avoir cette connexion là par défaut, puis il tente de se connecter et...Sur le PC
... notre commande rfcomm listen... Connection from 00:0E:6D:4E:52:EF to /dev/rfcomm0 Press CTRL-C for hangupReste à connecter un terminal à ce port série. On installe à cette fin kermit (ou ckermit) par exemple. Ensuite, en root :
ZazouMobile:/home/zazou# kermit C-Kermit 8.0.211, 10 Apr 2004, for Linux Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/home/zazou/) C-Kermit>set transmit linefeed on (/home/zazou/) C-Kermit>set line /dev/rfcomm0 (/home/zazou/) C-Kermit>connect Connecting to /dev/rfcomm0, speed 9600 Escape character: Ctrl-\ (ASCII 28, FS): enabled Type the escape character followed by C to get back, or followed by ? to see other options. ---------------------------------------------------- Connected. Python 2.2.2 (#0, Sep 26 2005, 11:58:40) [GCC 2.9-psion-98r2 (Symbian build 540)] on symbian_s60 Type "copyright", "credits" or "license" for more information. Type "commands" to see the commands available in this simple line editor. >>> import appuifw >>> appuifw.note(u"Hello World!", "info")Les explications de texte sont relativement courtes. set
Réception de fichiers
Le principe est toujours le même : trouver l’outil (obexserver) et ajouter le service à la base SDP locale. D’expérience, il faut utiliser le canal 10 avec les Nokia.ZazouMobile:/home/zazou# sdptool add --channel=10 OPUSH OBEX Object Push service registered ZazouMobile:/home/zazou# obexserver Waiting for connection... .........................................HEADER_LENGTH = 41546 put_done() Skipped header 42 put_done() Skipped header 44 Filename = Screenshot002.jpg Wrote /tmp/Screenshot002.jpg (41546 bytes)
Pour conclure
On le voit, les outils Bluetooth sont là , fonctionnent très correctement mais sont d’une utilisation encore très peu pratique. Une des propositions du Google summer of code consistait à créer une interface conviviale d’utilisation de Bluetooth pour Ubuntu. A priori, il n’y a toujours rien dans la 5.10 (Breezy Badger) donc je suppose que le projet n’a pas eu de suite convaincante. C’est un des aspects de Linux où il reste une niche à combler pour des développeurs d’outils utilisateurs. Tout existe, il faut juste le rendre pratique. Avis aux amateurs. KDE et GNOME ont chacun des projets conséquents qui vont au-delà du simple wrapper d’outil en ligne de commande. Celui de GNOME n’est pas encore utilisable à mon sens (pas celui dispo sur Ubuntu) parce qu’à peine commencé. Celui de KDE en est déjà à un stade très avancé, mais on ne peut pas dire qu’il soit terminé non plus. Quoi qu’il en soit, 2006 devrait être l’année du wireless USB. Il était donc temps que l’on vous parle de Bluetooth avant que cette technologie ne devienne complètement has-been ;) Liens:- Bluez : http://www.bluez.org/
- ISC, DHCP : http://www.isc.org/sw/dhcp/
- Nokia pour les développeurs : http://forum.nokia.com/
- USSP-PUSH : http://www.xmailserver.org/ussp-push.html
- Kermit : http://www.columbia.edu/kermit/
- ObexServer (18 lignes de C en comptant les accolades et les includes) : http://www.frasunek.com/sources/unix/obexserver.c
- Gnome Bluetooth subsystem : http://usefulinc.com/software/gnome-bluetooth/
- KDE Bluetooth : http://kde-bluetooth.sourceforge.net/
Retrouvez cet article dans : Linux Magazine 78





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.