Partage
  • Partager sur Facebook
  • Partager sur Twitter

Connexion Bluetooth JAVA Android

3 janvier 2018 à 14:42:26

Bonjour à tous et bonne année :)

Le but principal est de réaliser une application mobile afin de relever des données en Bluetooth d'un appareil émetteur.

Pour se faire deux boutons sont utilisés pour afficher deux listes différentes.

1- Un bouton qui affiche la liste des appareils déjà appairés.

2- Un bouton qui affiche les nouveaux appareils.

Vous l'avez compris, ici, le but est de cliquer sur un nouvel appareil afin de l’appairer et créer une connexion qui va permettre de lire les données, envoyées par un émetteur Bluetooth.

Pour le moment j'arrive à:

- Afficher la liste des appareils déjà appairés

- Détecter et afficher de nouveaux appareils

- Cliquer sur les appareils(appairés et non-appairés) pour afficher leurs IDs, adresses MAC etc..

Depuis plusieurs jour j'essai de réaliser la connexion avec un autre appareil (pour tester), mais je n'y arrive pas. Car, soit l'application bug soit il ne se passe rien.

Pour information: J'ai vu deux fois le même poste sur ce forum, mais il n'y a jamais la solution...

Liens OpenClassroom: 

https://openclassrooms.com/forum/sujet/android-connexion-bluetooth-42649

https://openclassrooms.com/forum/sujet/connexion-bluetooth-android-studio

Si le projet est résolut j'envisage de mettre une solution détaillé !

Mes recherches:

https://developer.android.com/guide/topics/connectivity/bluetooth.html

http://www.tutos-android.com/utilisation-bluetooth-application-android

http://nononux.free.fr/index.php?page=elec-brico-bluetooth-android-microcontroleur

http://sberfini.developpez.com/tutoriaux/android/bluetooth/

Avez-vous des idées pour débloquer la situation ? S'il vous plait.

Merci :)

Mon Code:

package com.example... // Le package

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;


public class MainActivity extends AppCompatActivity {

 private final static int REQUEST_CODE_ENABLE_BLUETOOTH = 0;
 // Standard SerialPortService ID
 UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // UUID qui indique une cnnection port série

 // Création des instances
 private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 private Set<BluetoothDevice> devices;

 // Création du TAG pour le log
 private static final String TAG = "ListDeviceBluetooth";

 // Création de tableau pour stocker les données des deux listes
 private ArrayList appareilAppaire = new ArrayList();
 private ArrayList appareilNoAppaire = new ArrayList();

 //Création objetList pour capter les événements
 private ListView lvAppareilAppaire;
 private ListView lvAppareilNoAppaire;

 //Création des objet pour se connecteren mode serveur ou client
 private AcceptThread mSecureAcceptThread;
 private ConnectThread mConnectThread;

 @Override
 protected void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

 //Vérifie si le device est en possession d'un dispositif bluetooth
 if (bluetoothAdapter == null)
    Toast.makeText(MainActivity.this, "Pas de Bluetooth", Toast.LENGTH_SHORT).show();
 else
 Toast.makeText(MainActivity.this, "Avec Bluetooth", Toast.LENGTH_SHORT).show();

 // Demande l'activation du module bluetooth et l'active
 if (!bluetoothAdapter.isEnabled()) {
     Intent enableBlueTooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
     startActivityForResult(enableBlueTooth, REQUEST_CODE_ENABLE_BLUETOOTH);
 }

 // Démarre le scan
 bluetoothAdapter.startDiscovery();

 lvAppareilAppaire = (ListView)findViewById(R.id.listAppareilAppere); //Récupère la liste des devices appairés
 // Affiche l'item séléctionné dans la liste des modules appairés
 lvAppareilAppaire.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          Toast.makeText(MainActivity.this, "ID = " + lvAppareilAppaire.getItemAtPosition(position), Toast.LENGTH_SHORT).show(); // affichage de l'objet selectionné
   }
 });

 lvAppareilNoAppaire = (ListView)findViewById(R.id.listAppareilNoAppere); //Rècupère la liste des devices non appairés
 // Affiche l'item séléctionné dans la liste des modules non appairés
 lvAppareilNoAppaire.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Clic sur un element de la liste
     Toast.makeText(MainActivity.this, "ID = " + lvAppareilNoAppaire.getItemAtPosition(position), Toast.LENGTH_SHORT).show(); // affichage de l'objet selectionné

     //Arret du scan
     bluetoothAdapter.cancelDiscovery();

     //Récupération de l'addresse MAC dans un String
     String address = lvAppareilNoAppaire.getItemAtPosition(position).toString();
     //Début de la connexion
     try{
         //Création d'un dispositif récupérer avec "getRemoteDevice" de "bluetoothAdapter"
         BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address);
         mConnectThread = new ConnectThread(device); //Création d'une instance pour la connection client
         mConnectThread.start(); // Lancement de la connection
     }
     catch (Exception e){
         Toast.makeText(MainActivity.this, "Tentative co echoue", Toast.LENGTH_SHORT);
     }
   }
 });

 // Start the thread to listen on a BluetoothServerSocket
 if (mSecureAcceptThread == null) {
 mSecureAcceptThread = new AcceptThread();
 mSecureAcceptThread.start();
 }
Intent Filter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(bluetoothReceiver, filter);
}

// Récupération des dispositifs déjà appairés pour les stocker dansla première liste
public void list(View v){
  // Affiche les appareils Bluetooth déjà enregistrés dans le smartphone
  devices = bluetoothAdapter.getBondedDevices();
  for (BluetoothDevice blueDevice : devices){
    appareilAppaire.add(blueDevice);
    //Toast.makeText(MainActivity.this, "Name = " + blueDevice.getName(), Toast.LENGTH_SHORT).show();
  }
  final ArrayAdapter<ArrayList> adapter = new ArrayAdapter<ArrayList>(this,android.R.layout.simple_list_item_1, appareilAppaire);
  lvAppareilAppaire.setAdapter(adapter);
}

// Récupération des dispositifs non appairés pour les stocker dansla deuxième liste
public void list1(View v){
  // Affiche les appareils Bluetooth détectés
  final ArrayAdapter<ArrayList> adapter = new ArrayAdapter<ArrayList>(this,android.R.layout.simple_list_item_1, appareilNoAppaire);
  lvAppareilNoAppaire.setAdapter(adapter);
  Toast.makeText(MainActivity.this, "Refresh ", Toast.LENGTH_SHORT).show();
}

// Analyse en paralèlle des dispositifs inconnus autour de nous
public final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if(BluetoothDevice.ACTION_FOUND.equals(action)) {
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
      Toast.makeText(MainActivity.this, "New Device = " + device.getName(), Toast.LENGTH_SHORT).show();
      appareilNoAppaire.add(device); //list1.add(device.getName());
    }
  }
};

private class AcceptThread extends Thread {
  private final BluetoothServerSocket mmServerSocket;

  public AcceptThread() {
    // Use a temporary object that is later assigned to mmServerSocket,
    // because mmServerSocket is final
    BluetoothServerSocket tmp = null;
    try {
      // MY_UUID is the app's UUID string, also used by the client code
      tmp = bluetoothAdapter.listenUsingRfcommWithServiceRecord("Server", MY_UUID);
    } catch (IOException e) { }
    mmServerSocket = tmp;
  }

  public void run() {
    BluetoothSocket socket = null;
    // Keep listening until exception occurs or a socket is returned
    while (true) {
      try {
        socket = mmServerSocket.accept();
      } catch (IOException e) {
        break;
      }
      // If a connection was accepted
      if (socket != null) {

        //manageMyConnectedSocket(socket);
        //mmServerSocket.close();
        break;
      }
    }
  }
  /** Will cancel the listening socket, and cause the thread to finish */
  public void cancel() {
    try {
      mmServerSocket.close();
    } catch (IOException e) { }
  }
}

//Connexion côté Client
private class ConnectThread extends Thread {
  private final BluetoothSocket mmSocket;
  public final BluetoothDevice mmDevice;

  public ConnectThread(BluetoothDevice device) {
    // Use a temporary object that is later assigned to mmSocket,
    // because mmSocket is final
    BluetoothSocket tmp = null;
    mmDevice = device;

    // Get a BluetoothSocket to connect with the given BluetoothDevice
    try {
      // MY_UUID is the app's UUID string, also used by the server code
      tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
    } catch (IOException e) { }
    mmSocket = tmp;
  }

  public void run() {
    // Cancel discovery because it will slow down the connection
    bluetoothAdapter.cancelDiscovery();
    Log.w("ListDeviceBluetooth", "Initiation de la connexion");
    try {
      // Connect the device through the socket. This will block
      // until it succeeds or throws an exception
      mmSocket.connect();
      //Toast.makeText(getActivity().getApplicationContext(),"Appairage effectué",Toast.LENGTH_LONG).show();
      Log.w("ListDeviceBluetooth", "Appairage effectué");
    } catch (IOException connectException) {
      // Unable to connect; close the socket and get out
      //Toast.makeText(getActivity().getApplicationContext(),"Impossible de se connecter",Toast.LENGTH_LONG).show();
      try {
        mmSocket.close();
      } catch (IOException closeException) { }
      return;
    }
    // Do work to manage the connection (in a separate thread)
    // manageConnectedSocket(mmSocket);
    // The connection attempt succeeded. Perform work associated with
    // the connection in a separate thread.

    //manageMyConnectedSocket(mmSocket);
  }
  /** Will cancel an in-progress connection, and close the socket */
  public void cancel() {
    try {
      mmSocket.close();
    } catch (IOException e) { }
  }
}

@Override
protected void onDestroy() {
  super.onDestroy();
  bluetoothAdapter.cancelDiscovery();
  unregisterReceiver(bluetoothReceiver);
}
}



-
Edité par ADRI-091 3 janvier 2018 à 15:49:07

  • Partager sur Facebook
  • Partager sur Twitter
22 avril 2021 à 15:52:01

Salut, j'ai un projet où je dois connecter un GPS à une application en Bluetooth et je galère sur la partie connexion de l'appli au GPS, je voulais donc savoir si tu avais réussi à résoudre ton problème et comment tu as réussi ?

Merci d'avance (même si je sais que le topic commence à dater 😅)

  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2021 à 18:38:51

Bonjour, la Dernière connexion de l'auteur est le 17 juillet 2018, je doute fort qu'il vous réponde de si tôt.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter