Projet

Général

Profil

Wrapper Python pour la gestion de connexions Bluetooth PC-Android » Historique » Version 44

Anonyme, 02/07/2013 22:58

1 1 Anonyme
h1. Wrapper Python pour la gestion de connexions Bluetooth PC-Android
2
3 30 Anonyme
p=. !wrapper-bluetooth.png!
4 29 Anonyme
5
p=. _Figure 1 : Wrapper Python_
6
7 1 Anonyme
h1. Remerciements
8
9 42 Anonyme
Nous souhaiterions tout d'abord remercier M. Jacques LAFFONT pour le sujet qui nous a été attribué. Ce fut une bonne expérience que de travailler sur un langage récent et puissant qui devient de plus en plus répandu de nos jours. Nous aimerions également remercier toutes les personnes extérieurs qui nous ont aidé tout au long de ce projet.
10 1 Anonyme
11
12
h1. Introduction
13
14 4 Anonyme
Le but de ce projet était de développer, dans un seul langage, un wrapper permettant de gérer des connexions Bluetooth entre des PC sous Windows et des smartphones sous Android. Ce wrapper devait être codé en Python, et on devait donc avoir une interface commune quel que que soit le support. Pour cela, notre tuteur de projet nous avait conseillé l'utilisation de Kivy.
15
Concernant le Bluetooth, on nous avait également dirigé vers Pybluez et Jython pour la gestion respectivement sur PC sous Windows/Linux et sur Android.
16 1 Anonyme
17
18
h1. Sommaire
19 2 Anonyme
20 1 Anonyme
{{toc}}
21
22 5 Anonyme
h1. Kivy : Deux OS, une seule interface
23 1 Anonyme
24 34 Anonyme
Kivy est une librairie multiplateforme permettant de développer en Python des applications graphiques, celles-ci pouvant également gérer le multi-touch. Cette librairie est compatible Windows, Linux, Mac OS X, Android et iOS. Pour la télécharger, se rendre sur le site officiel : http://kivy.org/#download
25 35 Anonyme
Avec Kivy, nous avons donc développé une même application qui fonctionne à la fois sur PC et sur Android.
26
27
Pour cela, nous avons mis en place une classe abstraite *SuperWrapper*, celle-ci listant les fonctionnalités disponibles sur l'application. Deux classes héritées, *WrapperPC* et *WrapperAndroid*, implémentent ces fonctionnalités en fonction de la plateforme. Nous obtenons donc la structure du projet suivante :
28
29 36 Anonyme
p=. !arborescence.png!
30 5 Anonyme
31 36 Anonyme
p=. _Figure 2 : Arborescence du projet_
32 5 Anonyme
33 38 Anonyme
Concernant la construction de l'interface, nous avons déclaré en attribut les paramètres de l'interface comme le header, le footer, ou encore les différents champs et boutons. Ceux-ci sont "assemblés" dans le constructeur dans un layoput principal qui est retourné pour être affiché sur la sortie standard du périphérique.
34 36 Anonyme
35 37 Anonyme
36 1 Anonyme
h1. Pybluez et la gestion du Bluetooth sur PC
37 2 Anonyme
38 1 Anonyme
Pybluez est une librairie Python permettant aux développeurs de coder rapidement et facilement des applications utilisant la technologie Bluetooth.
39
La dernière version en date sur le site officiel date de Novembre 2009 et supporte Python 2.6. En fouillant un peu, ou peut trouver une version plus récente (Octobre 2012) en beta supportant Python 2.7, mais pas au delà. Il a donc fallu utiliser cette version de Python et non pas la plus récente pour pouvoir exploiter cette librairie.
40 3 Anonyme
41 1 Anonyme
L’utilisation de cette bibliothèque pour appeler simplement les fonctionnalités Bluetooth proposées sur Linux ou Windows XP/Vista/7/8 se faire de manière instinctive. Pour ce qui est de Windows, il ne faut pas oublier d’avoir le SDK Windows d’installé (disponible ici : http://www.microsoft.com/en-us/download/details.aspx?id=8279).
42
43
Voici par exemple notre fonctionnalité d’envoi d’un message texte (passé en paramètre) 
44
<pre><code class="python">
45
    def envoyer(self, texte, *l):
46
        addr = "5C:96:9D:8A:AE:F6"
47
        uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
48
                
49
        service_matches = find_service(uuid = uuid, address = addr)
50
               
51
        first_match = service_matches[0]
52
        port = first_match["port"]
53
        name = first_match["name"]
54
        host = first_match["host"]
55
                
56
        # Create the client socket
57
        sock=BluetoothSocket(RFCOMM)
58
        sock.connect((host, port))
59
60
        sock.send(texte)
61
        sock.close()
62
</code></pre>
63
64 3 Anonyme
L’ _UUID (ou Universal Unique IDentifier)_ est, comme son nom l’indique, un identifiant unique codé sur 128 bits afin d’identifier le service Bluetooth auquel on souhaite envoyer. En effet, on ne peut pas se baser simplement sur l’adresse MAC d’une machine, celles-ci pouvant mettre à disposition plusieurs services Bluetooth.
65
66 1 Anonyme
Avec l’UUID et l’adresse MAC de la machine (ici saisie en dur dans le code), un simple appel à la fonction find_service permet de trouver le service correspondant, à condition que celui-ci soit présent et activé.
67
Une fois trouvé, on récupère ses informations qui seront nécessaires à la création d’un socket et à la connexion de celui-ci à l’hôte. Les fonctions send() et close() permettent l’envoi du message texte puis la fermeture du socket.
68 5 Anonyme
69 31 Anonyme
70 23 Anonyme
h1. PyJnius et la gestion du Bluetooth sur Android
71 8 Anonyme
72 23 Anonyme
h2. La librairie PyJnius
73 1 Anonyme
74 31 Anonyme
PyJnius est une bibliothèque permettant d'utiliser les classes Java en Python. Elle permet d'utiliser les classes Android et donc de faire fonctionner les applications sur un smartphone Android. 
75 9 Anonyme
 
76 8 Anonyme
Pour installer cette bibliothèque sous ubuntu :
77
http://pyjnius.readthedocs.org/en/latest/installation.html
78 27 Anonyme
79 9 Anonyme
Pour importer une classe java on utilise le code suivant :
80 12 Anonyme
<pre><code class="python">from jnius.jnius import autoclass
81 13 Anonyme
82 1 Anonyme
_BluetoothAdapter = autoclass(‘android.bluetooth.bluetoothadapter’)</code></pre>Explications : On importe la méthode autoclass de jnius, on l'utilise par exemple sur la classe BluetoothAdapter du SDK d'Android.
83 31 Anonyme
84 32 Anonyme
85 31 Anonyme
p=. !classe_Bluetooth.png!
86 1 Anonyme
87 36 Anonyme
p=. _Figure 3 : Classe JAVA BluetoothAdapter_
88 26 Anonyme
89 5 Anonyme
90 22 Anonyme
La classe BluetoothAdapter ainsi que d'autres outils Bluetooth issus du SDK d'Android sont disponibles ici :
91 21 Anonyme
http://developer.android.com/guide/topics/connectivity/bluetooth.html
92
93 16 Anonyme
h2. Python For Android
94
95
_Python for Android_ est un outil de Kivy qui permet de créer ses applications Android en utilisant les bibliothèques Python.
96
97
Pour installer ce module sous ubuntu :
98
http://pyjnius.readthedocs.org/en/latest/installation.html
99
100 20 Anonyme
Il faudra préalablement installer le SDK d'android.
101
102 16 Anonyme
Exemple de ligne de commande pour créer le paquet :
103 17 Anonyme
<pre><code class="shell">./build.py --dir ~/Documents/projet/wrapper --name «Wrapper Bluetooth» --package org.my.wrapper --permission android.permission.BLUETOOTH --orientation portrait --version 1.0 debug installd
104 19 Anonyme
</code></pre>--permission : permet d'autoriser l’accès au bluetooth du téléphone par l'application
105
--name : Nom visible de l'application 
106 20 Anonyme
107
h2. Débogage 
108
109
On utilise pour déboguer l'outil du SDK _ADB_ 
110
<pre><code class="shell">./adb logcat | grep python</code></pre>
111 16 Anonyme
112
113 24 Anonyme
114
h1. Problèmes connus
115
116
h2. Bug de binding d'un bouton pour l'envoi d'une trame en mode graphique
117
118 28 Anonyme
L’envoi de message texte tant que l’utilisateur souhaite communiquer fonctionne parfaitement en mode console. En revanche, en mode graphique, un bug de binding de bouton intervient. En effet, comme on peut le voir sur la Figure 1, l’écran principal permet soit de lister les périphériques Bluetooth activés dans les environs, soit de se connecter (à un périphérique connu dont l’adresse MAC est indiquée dans le code).L’appui sur le bouton Connecter doit afficher un champ texte et un bouton d’envoi du message saisi.
119
120 1 Anonyme
Or, en pratique, dès qu’on appui sur le bouton Connecter, celui-ci entraîne bien la connexion au périphérique serveur, mais entraîne également la récupération et l’envoi du texte déjà présent dans le champ, puis la fermeture de la connexion.
121 43 Anonyme
Les binding étant pourtant bien définis, il se pourrait fortement que ce soit un problème de thread dans notre code au moment de la construction de l’interface graphique, mais nous ne pouvons le confirmer.
122 24 Anonyme
123
124
h2. Exceptions de la JVM récupérées avec PyJnius
125
126 41 Anonyme
Nous n'avons pas réussi à faire fonctionner le bluetooth sur Android. Lorsque l'on utilise le bluetooth dans l'application, celle-ci plante. Le logcat nous indique l'erreur suivante :
127
<pre><code class="shell">jnius.jnius.JavaException: JVM exception occured</code></pre>Nous n'avons pas réussi à trouver d'où venait cette erreur et nous n'avons pas réussi à la contourner.
128 24 Anonyme
129 5 Anonyme
h1. Conclusion
130 7 Anonyme
131
En conclusion de ce projet, nous aimerions faire le point concernant le langage Python. Bien que ce projet nous a permis d'apprendre et utiliser ce puissant langage multiplateformes, ses librairies quant à elles ne le sont pas, de ce fait du cas par cas doit être effectué en fonction de la plateforme sous laquelle l'application est lancée.
132
133
Concernant le projet en lui-même :
134
* Partie PC : La recherche et le listing des périphériques Bluetooth fonctionnent. L'envoi de message textes fonctionne en direction des PC. En mode graphique, une seule trame est envoyée avant fermeture de la connexion. En mode console, toutes les trames saisies au clavier sont correctement envoyées.
135
* Partie Android : Les fonctionnalités sont implémentées mais ne fonctionnent pas encore, il suffit juste de faire fonctionner PyJnius avec les bibliothèques JAVA concernées pour que tout marche.
136 39 Anonyme
137
138
h1. Liens utiles
139 40 Anonyme
140 39 Anonyme
Documentation officielle du SDK Android : http://developer.android.com/sdk/index.html
141
Documentation officielle de Kivy : http://kivy.org/docs/gettingstarted/intro.html
142
Documentation officielle de PyBluez : https://code.google.com/p/pybluez/wiki/Documentation
143
Documentation officielle de PyJnius : http://pyjnius.readthedocs.org/en/latest/