Mobile-AREA  1.1
BTS SNIR LaSalle Avignon 2021
LiaisonBluetooth.java
Aller à la documentation de ce fichier.
1 package com.example.area;
2 
3 import android.bluetooth.BluetoothAdapter;
4 import android.bluetooth.BluetoothDevice;
5 import android.bluetooth.BluetoothSocket;
6 import android.os.Handler;
7 import android.os.Message;
8 import android.util.Log;
9 
10 import java.io.BufferedReader;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.InputStreamReader;
14 import java.io.OutputStream;
15 import java.util.UUID;
16 import java.util.Set;
17 
30 public class LiaisonBluetooth extends Thread
31 {
32  private static final String TAG = "_LiaisonBluetooth";//<! TAG pour les logs
33  private static final String ID = "00001101-0000-1000-8000-00805F9B34FB";//<! UUID utilisé lors des transmissions
34  public static final int CREATION_SOCKET = 1;//<! Code utilisé par le handler pour signaler la création du socket
35  public static final int CONNEXION_SOCKET = 2;//<! Code utilisé par le handler pour signaler la connexion du socket à un appareil
36  public static final int DECONNEXION_SOCKET = 3;//<! Code utilisé par le handler pour signaler la deconnexion du socket à un appareil
37  public static final int RECEPTION_TRAME = 4;//<! Code utilisé par le handler pour signaler la réception d'une trame
38 
39  private BluetoothSocket socket = null;//<! Socket assurant la connexion a un appareil en bluetooth
40  private BluetoothDevice module = null;//<! Appareil auqel se connecter
41  private static BluetoothAdapter bluetoothAdapter = null;//<! Adaptateur utilisé par la connexion bluetooth
42  private InputStream fluxReception = null;//<! Flux de réception
43  private OutputStream fluxEnvoi = null;//<! Flux d'envoi
44  private TReception tReception = null;//<! Le thread de réception
45  private Handler handlerIHM = null;//<! Handler vers une IHM
46 
52  public LiaisonBluetooth(String nomAppareil, Handler handlerIHM)
53  {
54  this.handlerIHM = handlerIHM;
55 
57 
58  if(rechercherAppareil(nomAppareil))
59  {
60  creerSocket();
61  }
62  }
63 
67  private void activerBluetooth()
68  {
69  bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
70  if (!bluetoothAdapter.isEnabled())
71  {
72  Log.d(TAG,"Activation du Bluetooth");
73  bluetoothAdapter.enable();
74  }
75  }
76 
81  private boolean rechercherAppareil(String idAppareil)
82  {
83  Set<BluetoothDevice> appareilsAppaires = bluetoothAdapter.getBondedDevices();
84 
85  Log.d(TAG,"Recherche l'appareil : " + idAppareil);
86  for (BluetoothDevice appareil : appareilsAppaires)
87  {
88  Log.d(TAG,"Nom : " + appareil.getName() + " | Adresse : " + appareil.getAddress());
89  if (appareil.getName().equals(idAppareil) || appareil.getAddress().equals(idAppareil))
90  {
91  module = appareil;
92  return true; // trouvé !
93  }
94  }
95 
96  return false;
97  }
98 
102  private boolean creerSocket()
103  {
104  if(module == null)
105  return false;
106 
107  Log.d(TAG,"Création de la socket pour l'appareil : " + module.getName() + " | Adresse : " + module.getAddress());
108  try
109  {
110  socket = module.createRfcommSocketToServiceRecord(UUID.fromString(ID));
111  }
112  catch (IOException e)
113  {
114  e.printStackTrace();
115  socket = null;
116  Log.d(TAG, "Echec de la création de socket");
117  return false;
118  }
119 
120  if (socket != null)
121  {
122  tReception = new TReception();
123  Message message = new Message();
124  message.what = CREATION_SOCKET;
125  message.obj = module.getName();
126  handlerIHM.sendMessage(message);
127  return true;
128  }
129 
130  return false;
131  }
132 
136  public void connecter()
137  {
138  if (module == null || socket == null)
139  return;
140 
141  Log.d(TAG,"Connexion au module " + module.getName() + " | Adresse : " + module.getAddress());
142  new Thread()
143  {
144  @Override public void run()
145  {
146  try
147  {
148  bluetoothAdapter.cancelDiscovery();
149  socket.connect();
150  fluxReception = socket.getInputStream();
151  fluxEnvoi = socket.getOutputStream();
152  if (!tReception.isAlive())
153  tReception.start();
154  Message message = new Message();
155  message.what = CONNEXION_SOCKET;
156  message.obj = module.getName();
157  handlerIHM.sendMessage(message);
158  }
159  catch (IOException e)
160  {
161  Log.e(TAG,"Erreur ouverture du socket");
162  e.printStackTrace();
163  }
164  }
165  }.start();
166  }
167 
171  public void deconnecter()
172  {
173  if (module == null || socket == null)
174  return;
175 
176  Log.d(TAG,"Déconnexion du module " + module.getName() + " | Adresse : " + module.getAddress());
177  new Thread()
178  {
179  @Override public void run()
180  {
181  try
182  {
183  tReception.arreter();
184  socket.close();
185  Message message = new Message();
186  message.what = DECONNEXION_SOCKET;
187  message.obj = module.getName();
188  handlerIHM.sendMessage(message);
189  }
190  catch (IOException e)
191  {
192  Log.e(TAG,"Erreur fermeture du socket");
193  e.printStackTrace();
194  }
195  }
196  }.start();
197  }
198 
202  public void envoyer(String donnees)
203  {
204  if (module == null || socket == null)
205  return;
206 
207  new Thread()
208  {
209  @Override public void run()
210  {
211  try
212  {
213  if(socket.isConnected())
214  {
215  Log.d(TAG,"Envoi vers le module " + module.getName() + " | Adresse : " + module.getAddress() + " | Données : " + donnees);
216  fluxEnvoi.write(donnees.getBytes());
217  }
218  }
219  catch(IOException e)
220  {
221  Log.e(TAG,"Erreur envoi socket");
222  e.printStackTrace();
223  }
224  }
225  }.start();
226  }
227 
228  public String getNomModule()
229  {
230  if(module != null)
231  {
232  return module.getName();
233  }
234 
235  return null;
236  }
237 
238  private class TReception extends Thread
239  {
240  private boolean fini;
241 
242  TReception()
243  {
244  fini = false;
245  }
246 
250  @Override public void run()
251  {
252  Log.d(TAG,"Démarrage du thread Réception pour le module " + module.getName() + " | Adresse : " + module.getAddress());
253  BufferedReader reception = new BufferedReader(new InputStreamReader(fluxReception));
254  while(!fini)
255  {
256  try
257  {
258  String trame = "";
259  if (socket.isConnected())
260  {
261  trame = reception.readLine();
262  if(trame.length() > 0)
263  {
264  Log.d(TAG, "Trame : " + trame);
265  Message message = new Message();
266  message.what = RECEPTION_TRAME;
267  message.obj = trame;
268  handlerIHM.sendMessage(message);
269  }
270  }
271  }
272  catch (IOException e)
273  {
274  e.printStackTrace();
275  Message message = new Message();
276  message.what = DECONNEXION_SOCKET;
277  message.obj = module.getName();
278  handlerIHM.sendMessage(message);
279  connecter();
280  }
281 
282  try
283  {
284  Thread.sleep(250);
285  }
286  catch (InterruptedException e)
287  {
288  e.printStackTrace();
289  }
290  }
291  Log.d(TAG,"Arrêt du thread Réception pour le module " + module.getName() + " | Adresse : " + module.getAddress());
292  }
293 
297  public void arreter()
298  {
299  if (fini == false)
300  {
301  fini = true;
302  }
303 
304  try
305  {
306  Thread.sleep(250);
307  }
308  catch (InterruptedException e)
309  {
310  e.printStackTrace();
311  }
312  }
313  }
314 }
boolean rechercherAppareil(String idAppareil)
Méthode permettant de rechercher un appareil à partir d&#39;une adresse.
boolean creerSocket()
Méthode permettant de créer une socket à partir d&#39;un appareil.
void arreter()
Méthode qui permet d&#39;arrêter lire les données entrantes.
LiaisonBluetooth(String nomAppareil, Handler handlerIHM)
Constructeur de la classe LiasonBluetooth.
void envoyer(String donnees)
Méthode pour envoyer des données.
static BluetoothAdapter bluetoothAdapter
void run()
Méthode qui permet de lire les données entrantes.
void deconnecter()
Méthode pour fermer la connexion avec un appareil.
void connecter()
Méthode pour ouvrir la connexion avec un appareil.
Permet de gérer la communication bluetooth.
void activerBluetooth()
Méthode permettant d&#39;activer le bluetooth s&#39;il ne l&#39;est pas.