IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

[Bluetooth] Découvrir les périphériques


Sujet :

API standards et tierces Android

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut [Bluetooth] Découvrir les périphériques
    Bonjour à tous,

    Dans un premier temps, j'ai lu le tuto disponible sur le bluetooth avec Android.
    J'ai également lu quelques postes sur le sujet bluetooth mais aucun ne se rapproche de mon problème.

    Voici mon projet:

    établir une communication bluetooth entre un équipement bluetooth et mon smartphone. A la base l'équipement bluetooth communique avec un PC sur lequel un hyperterminal peut s'ouvrir pour communiquer avec l'équipement bluetooth.
    Je souhaite accéder à cet équipement en question via mon smartphone et non plus par PC.

    Je débute dans le développement Android mais j'ai quelques notions de JAVA.

    J'ai rédigé un début de code pour détecter/activer le bluetooth sur le smartphone. un code basic pour le moment.

    J'essai simplement de détecter mon équipement dans un premier temps. Par la suite j'essayerai de communiquer avec.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    package com.ggelec.unids6;
     
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    import android.view.*;
     
    public class UniDS6BluetoothActivity extends Activity implements android.view.View.OnClickListener{
     
     
    	Button buttonConnection;
    	BluetoothAdapter bluetoothAdapter;
     
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		Log.i("", "onCreate");
    		buttonConnection = ((Button)this.findViewById(R.id.buttonConnection));
    		buttonConnection.setOnClickListener(this);
     
     
    	}
     
    	@Override
    	protected void onStart() {
    		Log.i("", "onStart");
    		bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    		if (bluetoothAdapter == null) {
    			Toast.makeText(UniDS6BluetoothActivity.this,
    					"No Bluetooth devices", Toast.LENGTH_LONG).show();
    			Log.e("ERROR", "No Bluetooth devices");
    		} else {
    			Toast.makeText(UniDS6BluetoothActivity.this, "Bluetooth available",
    					Toast.LENGTH_SHORT).show();
    			Log.i("INFO", "Bluetooth available");
    		}
    		if (!bluetoothAdapter.isEnabled()) {
    			   bluetoothAdapter.enable();			   
    			}
    		super.onStart();
    	}
     
    	@Override
    	protected void onResume() {
    		Log.i("", "onResume");
    		super.onResume();
    	}
     
    	@Override
    	protected void onPause() {
    		Log.i("", "onPause");
    		super.onPause();
    	}
     
    	@Override
    	protected void onStop() {
    		Log.i("", "onStop");
    		super.onStop();
    	}
     
    	@Override
    	protected void onDestroy() {
    		Log.i("", "onDestroy");
    		if (bluetoothAdapter.isEnabled()) {
    				bluetoothAdapter.cancelDiscovery();
    				bluetoothAdapter.disable();
    				Log.i("INFO", "Bluetooth disable");
    			}
     
    		super.onDestroy();
    	}
     
    	public void onClick(View v) {
    		Toast.makeText(UniDS6BluetoothActivity.this, "searching...",
    				Toast.LENGTH_SHORT).show();
    		Log.i("INFO", "searching...");
     
    		if (bluetoothAdapter.getScanMode() !=
    	            BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
    	            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    	            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    	            startActivity(discoverableIntent);
    	        }
     
    		if(bluetoothAdapter.isDiscovering())bluetoothAdapter.cancelDiscovery();
    		bluetoothAdapter.startDiscovery();
     
     
     
    	}
    	private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
    		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(UniDS6BluetoothActivity.this, "New Device = " + device.getName(), Toast.LENGTH_SHORT).show();
    		  }
    		}
    		};
     
     
    }
    Comme vous pouvez le voir, je me suis inspiré de ce que j'ai pu trouver pour gérer le bluetooth.
    Malheureusement, je ne vois pas comment bien détecter les modules à proximités et les afficher pour ensuite s'y connecter.

    Si quelqu'un pouvait m'éclairer ça serait super.

    un grand merci d'avance

    GGelec

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Tu as un super exemple sur le sujet :

    http://developer.android.com/resourc...toothChat.html

    et ici :
    http://sberfini.developpez.com/tutor...luetooth/#LIII

    Tu trouveras toutes les réponses à tes questions dans cet exemple .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Bonjour,

    Tu as un super exemple sur le sujet :

    http://developer.android.com/resourc...toothChat.html

    et ici :
    http://sberfini.developpez.com/tutor...luetooth/#LIII

    Tu trouveras toutes les réponses à tes questions dans cet exemple .
    Bonjour,

    j'ai déjà regardé ces exemples. Je vais essayer de m'en inspirer.

    J'essai malgré tout de trouver. Je ne suis pas sur d'avoir compris le principe de client serveur.

    voici mon code si tu pouvais y jeter un oeil histoire de voir si je ne fais pas de bêtes fautes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    public class UniDS6BluetoothActivity extends Activity {
     
    	private static final UUID MY_UUID = UUID
    			.fromString("00001101-0000-1000-8000-09180F7294D1");
    	private static String address = "0A:06:66:07:6D:E6"; // address du module
     
     
    	Button buttonConnection;
    	BluetoothAdapter bluetoothAdapter;
    	private BluetoothSocket btSocket;
    	private OutputStream outStream;
     
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		Log.i("", "onCreate");
     
    		bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
     
    		if (bluetoothAdapter == null) {
    			Toast.makeText(UniDS6BluetoothActivity.this,
    					"No Bluetooth devices", Toast.LENGTH_LONG).show();
    			Log.e("ERROR", "No Bluetooth devices");
    		} else {
    			Toast.makeText(UniDS6BluetoothActivity.this, "Bluetooth available",
    					Toast.LENGTH_SHORT).show();
    			Log.i("INFO", "Bluetooth available");
     
    		}
    		if (!bluetoothAdapter.isEnabled()) { // si pas activé, alors
    												// l'activer...
    			bluetoothAdapter.enable();
    			Log.i("INFO", "Bluetooth enable");
     
    		}
    		String mac = BluetoothAdapter.getDefaultAdapter().getAddress();
    		Log.i("MAC:", "++++" + mac + "++++"); // afficher l'adresse mac du
    												// nexus s
     
    	}
     
    	@Override
    	protected void onStart() {
    		Log.i("", "onStart");
    		super.onStart();
    	}
     
    	@Override
    	protected void onResume() {
    		Log.i("", "onResume");
    		BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address);
    		try {
    			btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
    			Log.i("INFO", "Socket OK");
    		} catch (IOException e) {
    			Log.e("ERROR", "ON RESUME: Socket creation failed.", e);
    		}
    		bluetoothAdapter.cancelDiscovery();
    		try {
    			btSocket.connect();
    			Log.i("INFO","ON RESUME: BT connection established, data transfer link open.");
    		} catch (IOException e) {
    			try {
    				btSocket.close();
    			} catch (IOException e2) {
    				Log.e("ERROR","ON RESUME: Unable to close socket during connection failure",e2);
    			}
    		}
     
    		try {
    			outStream = btSocket.getOutputStream();
    			Log.i("INFO", "btSocket.getOutputStream(); OK");
    		} catch (IOException e) {
    			Log.e("ERROR", "ON RESUME: Output stream creation failed.", e);
    		}
     
    		if (outStream != null) {
    			try {
    				outStream.close();
    			} catch (Exception e) {
    			}
    			outStream = null;
    		}
     
    		if (btSocket != null) {
    			try {
    				btSocket.close();
    			} catch (Exception e) {
    			}
    			btSocket = null;
    		}
    		try {
    			btSocket.connect();
    		} catch (IOException e1) {
    			Log.e("ERROR", "btSocket.connect();", e1);
    		}
     
    		String message = "NEXUS S";
    		byte[] msgBuffer = message.getBytes();
    		try {
    			outStream.write(msgBuffer);
    		} catch (IOException e) {
    			Log.e("ERROR", "ON RESUME: Exception during write.", e);
    		}
    		super.onResume();
    	}
     
    	@Override
    	protected void onPause() {
    		Log.i("", "onPause");
    		if (outStream != null) {
    			try {
    				outStream.flush();
    			} catch (IOException e) {
    				Log.e("ERROR", "ON PAUSE: Couldn't flush output stream.", e);
    			}
    		}
    		try {
    			btSocket.close();
    		} catch (IOException e2) {
    			Log.e("ERROR", "ON PAUSE: Unable to close socket.", e2);
    		}
    		super.onPause();
    	}
     
    	@Override
    	protected void onStop() {
    		Log.i("", "onStop");
    		super.onStop();
    	}
     
    	@Override
    	protected void onDestroy() {
    		Log.i("", "onDestroy");
    		if (bluetoothAdapter.isEnabled()) {
    			bluetoothAdapter.cancelDiscovery();
    			bluetoothAdapter.disable();
    			Log.i("INFO", "Bluetooth disable... Application terminated");
    		}
     
    		super.onDestroy();
    	}
    }

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    String address = "0A:06:66:07:6D:E6"; // address du module
    C'est l'adresse de quel module ?

    Après essaye tout d'abord de faire un inquiry pour récupérer les bluetooth devices possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // On crée un BroadcastReceiver pour ACTION_FOUND
    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // Quand la recherche trouve un terminal
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // On récupère l'object BluetoothDevice depuis l'Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // On ajoute le nom et l'adresse du périphérique dans un ArrayAdapter (par exemple pour l'afficher dans une ListView)
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        }
    };
    // Inscrire le BroadcastReceiver
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(receiver, filter); // N'oubliez pas de le désinscrire lors du OnDestroy() !
    Tu pourras ainsi te connecter à un de ces devices par la suite, plus de chaîne en dur.

    J'essai malgré tout de trouver. Je ne suis pas sur d'avoir compris le principe de client serveur.
    Après je te reconseille de lire ce tutoriel en premier alors :

    http://sberfini.developpez.com/tutor...oid/bluetooth/

    si tu pouvais y jeter un oeil histoire de voir si je ne fais pas de bêtes fautes
    Normalement cela a l'air bon
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Bonjour,



    C'est l'adresse de quel module ?

    Après essaye tout d'abord de faire un inquiry pour récupérer les bluetooth devices possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // On crée un BroadcastReceiver pour ACTION_FOUND
    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // Quand la recherche trouve un terminal
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // On récupère l'object BluetoothDevice depuis l'Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // On ajoute le nom et l'adresse du périphérique dans un ArrayAdapter (par exemple pour l'afficher dans une ListView)
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        }
    };
    // Inscrire le BroadcastReceiver
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(receiver, filter); // N'oubliez pas de le désinscrire lors du OnDestroy() !
    Tu pourras ainsi te connecter à un de ces devices par la suite, plus de chaîne en dur.


    Après je te reconseille de lire ce tutoriel en premier alors :

    http://sberfini.developpez.com/tutor...oid/bluetooth/



    Normalement cela a l'air bon
    Bonjour,

    j'ai recommencé mon application. J'avais oublié pas mal de choses en faite.
    Maintenant, je parviens à détecter mon équipement et à récupérer son adresse.

    Je regarde toujours l'exemple de google (bluetoothChat).

    J'ai d'ailleurs du mal a voir les étapes pour établir une connexion vers un périphérique détecté...

    Si quelqu'un pouvait juste me citer les étapes, ça serait super.
    (créer un socket puis un rfcomm, ....)

    Je suis un peu perdu à ce niveau là.

    J'avais également une question au niveau de la notion client/server.

    Dans mon cas, où je souhaite établir une connexion de mon téléphone à mon module bluetooth, je suis client ou server ? Je n'ai pas bien saisi le concept.

    Je pense que c'est client mais je ne suis pas sur.

    merci

  6. #6
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    J'ai d'ailleurs du mal a voir les étapes pour établir une connexion vers un périphérique détecté...
    Tu as les exemples des connections serveur et client ici :
    http://sberfini.developpez.com/tutor...oid/bluetooth/

    Pour le client il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     BluetoothSocket  tmp = device.createInsecureRfcommSocketToServiceRecord(
                                MY_UUID);
    Où ton device et le device sur lequel tu veux te connecter.

    Après sur le BluetoothSocket (tmp) tu fais un connect().

    Et te voilà connecté.

    ù je souhaite établir une connexion de mon téléphone à mon module bluetooth, je suis client ou server ?
    Client . Le serveur reçoit la requête, le client l'envoie, donc dans ce cas là tu es client.

    Je regarde toujours l'exemple de google (bluetoothChat).
    Concentre toi bien sur la classe BluetoothChatService qui elle contient toue les gestions des connections, la BlueChat gére juste le côté graphique et inquiry (discoverable)
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Tu as les exemples des connections serveur et client ici :
    http://sberfini.developpez.com/tutor...oid/bluetooth/

    Pour le client il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     BluetoothSocket  tmp = device.createInsecureRfcommSocketToServiceRecord(
                                MY_UUID);
    Où ton device et le device sur lequel tu veux te connecter.

    Après sur le BluetoothSocket (tmp) tu fais un connect().

    Et te voilà connecté.



    Client . Le serveur reçoit la requête, le client l'envoie, donc dans ce cas là tu es client.



    Concentre toi bien sur la classe BluetoothChatService qui elle contient toue les gestions des connections, la BlueChat gére juste le côté graphique et inquiry (discoverable)
    merci pour la réponse.

    J'ai regardé exactement l'établissement de la connection dans l'exemple de google.

    Je ne pense pas avoir fait d'erreur ce coup ci, je ne parviens pas à me connecter au module.

    Voici mon code :

    j'ai ajouter un bouton pour lancer la connection, j'appel la méthode suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private void connexion() {
    		BluetoothSocket socket = null;
     
    		if (Debug)
    			Log.i(TAG, "<connexion>");
    		try {
    			socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);			
     
    			socket.connect();
    			Log.i(TAG, "<connexion established>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			Log.i(TAG, "<connexion fail: "+e+">");
    			try {
                    socket.close();
                } catch (IOException e2) {
                    Log.e(TAG, "unable to close() "+ e2);
                }
    		}
     
    	}
    EASYBT est du type bluetoothSocket, voilà où je lui affecte la donnée (dans le onReceive) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
    				// Récupère les infos sur le périphérique BT détecté
    				device = intent
    						.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
     
    				if (Debug)
    					Log.i(TAG, "<Device name: " + device.getName()
    							+ " Address: " + device.getAddress() + ">");
    				if (device.getName().equalsIgnoreCase("EASY")) {
    					textView.setText("found");
    					BTname = device.getName();
    					BTaddress = device.getAddress();					
    					EASYBT = bluetoothAdapter.getRemoteDevice(BTaddress);
    					if (Debug)
    						Log.i(TAG, "<bluetoothAdapter>"+ EASYBT);
    avec EASYBT définit comme BluetoothDevice EASYBT;
    Je vais encore vérifier mais il me semble que je fais la même chose que dans l'exemple bluetoothchat.

    Voici le logcat :

    02-15 16:58:00.312: I/UniDS6 DEBUG(25626): <onReceive BroadcastReceiver>
    02-15 16:58:00.316: V/BluetoothEventRedirector(294): Received android.bluetooth.device.action.FOUND
    02-15 16:58:00.324: I/UniDS6 DEBUG(25626): <Device name: EASYAddress: 00:06:66:07:5D:E5>
    02-15 16:58:00.328: I/UniDS6 DEBUG(25626): <bluetoothAdapter>00:06:66:07:5D:E5
    02-15 16:58:04.511: E/GPS(103): [on_request_connection][line = 1061] : Failed with NO SESSION SLOT
    02-15 16:58:05.375: D/dalvikvm(24001): GC_EXPLICIT freed 6K, 53% free 2538K/5379K, external 1625K/2137K, paused 59ms
    02-15 16:58:06.312: E/BluetoothEventLoop.cpp(103): event_filter: Received signal org.bluez.AdapterropertyChanged from /org/bluez/25638/hci0
    02-15 16:58:06.343: I/UniDS6 DEBUG(25626): <onReceive BroadcastReceiver>
    02-15 16:58:06.343: I/UniDS6 DEBUG(25626): <scan finish>
    02-15 16:58:06.347: V/BluetoothEventRedirector(294): Received android.bluetooth.adapter.action.DISCOVERY_FINISHED
    02-15 16:58:07.453: I/UniDS6 DEBUG(25626): <connexion>
    02-15 16:58:13.500: D/BluetoothService(103): Cleaning up failed UUID channel lookup: 00:06:66:07:5D:E5 fa87c0d0-afac-11de-8a39-671264285700
    02-15 16:58:13.511: I/UniDS6 DEBUG(25626): <connexion fail: java.io.IOException: Service discovery failed>
    02-15 16:58:13.523: V/BluetoothEventRedirector(294): Received android.bleutooth.device.action.UUID

  8. #8
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Déjà en premier

    Passe le device en paramètre de ta fonction, et surtout ne mets pas en majuscules ta variable lorsque celle ci n'est pas en final.

    Après il faut que tu arrête ton discovery avant ton connect si tu veux le lancer pendant que le discovery est en cours.

    L'adapter sur lequel tu lances l'inquiry :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private void connexion(BluetoothDevice device) {
    		BluetoothSocket socket = null;
                    mAdapter.cancelDiscovery();
    		if (Debug)
    			Log.i(TAG, "<connexion>");
    		try {
    			socket = device.createRfcommSocketToServiceRecord(MY_UUID);			
     
    			socket.connect();
    			Log.i(TAG, "<connexion established>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			Log.i(TAG, "<connexion fail: "+e+">");
    			try {
                    socket.close();
                } catch (IOException e2) {
                    Log.e(TAG, "unable to close() "+ e2);
                }
    		}
     
    	}
    Normalement cela devrait corriger cette erreur
    <connexion fail: java.io.IOException: Service discovery failed>
    Après je te conseille soit de passer le tout dans un thread ou un service pour la connection cela sera plus propre que si tu le fais depuis le thread principal.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Déjà en premier

    Passe le device en paramètre de ta fonction, et surtout ne mets pas en majuscules ta variable lorsque celle ci n'est pas en final.

    Après il faut que tu arrête ton discovery avant ton connect si tu veux le lancer pendant que le discovery est en cours.

    L'adapter sur lequel tu lances l'inquiry :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    private void connexion(BluetoothDevice device) {
    		BluetoothSocket socket = null;
                    mAdapter.cancelDiscovery();
    		if (Debug)
    			Log.i(TAG, "<connexion>");
    		try {
    			socket = device.createRfcommSocketToServiceRecord(MY_UUID);			
     
    			socket.connect();
    			Log.i(TAG, "<connexion established>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			Log.i(TAG, "<connexion fail: "+e+">");
    			try {
                    socket.close();
                } catch (IOException e2) {
                    Log.e(TAG, "unable to close() "+ e2);
                }
    		}
     
    	}
    Normalement cela devrait corriger cette erreur


    Après je te conseille soit de passer le tout dans un thread ou un service pour la connection cela sera plus propre que si tu le fais depuis le thread principal.
    Je viens d'essayer j'ai toujours la même erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void connexion() {
     
    			bluetoothAdapter.cancelDiscovery();
     
     
    		if (Debug)
    			Log.i(TAG, "<connexion>");
    		try {
    			socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);			
     
    			socket.connect();
    			Log.i(TAG, "<connexion established>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			Log.i(TAG, "<connexion fail: "+e+">");
    			try {
                    socket.close();
                } catch (IOException e2) {
                    Log.e(TAG, "unable to close() "+ e2);
                }
    		}
     
    	}
    je vais modifier ma méthode et rajouter des paramètres, mais bon je ne pense pas que ce soit le problème.

    Par sécurité, j'attend également un autre message debug dans le logcat qui me signal que le discovery est fini, mais j'ai toujours la même erreur.

  10. #10
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    je vais modifier ma méthode et rajouter des paramètres, mais bon je ne pense pas que ce soit le problème.
    Non le problème ne vient pas de là mais cela rends le code plus lisible, ce qui est toujours un plus .

    Par sécurité, j'attend également un autre message debug dans le logcat qui me signal que le discovery est fini, mais j'ai toujours la même erreur.
    dans tous les cas ton problème vient bien que le discovery n'est pas arrêté (voir le code source)
    http://hi-android.info/src/android/b...cket.java.html
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Non le problème ne vient pas de là mais cela rends le code plus lisible, ce qui est toujours un plus .



    dans tous les cas ton problème vient bien que le discovery n'est pas arrêté (voir le code source)
    http://hi-android.info/src/android/b...cket.java.html
    J'ai modifié ma méthode connexion et j'ai rajouté des messages pour voir où ce situe exactement le soucis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private void connexion(BluetoothDevice EASYBT) {
     
    		bluetoothAdapter.cancelDiscovery();
     
    		if (Debug)
    			Log.i(TAG, "<connexion()>");
    		try {
    			socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);
    			if (Debug)Log.i(TAG, "<createRfcommSocket successfully created>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			Log.e(TAG, "<createRfcommSocket fail: " + e + ">");
    		}
     
    		try {
    			socket.connect();
    			if (Debug)Log.i(TAG, "<connected>");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			if (Debug)Log.e(TAG, "<not connect - fail>" + e);
    			try {
    				socket.close();
    				if (Debug)Log.i(TAG, "<socket closed successfully>");
    			} catch (IOException e2) {
    				if (Debug)Log.e(TAG, "unable to close() socket " + e2);
    			}
    		}
     
    	}
    02-15 17:56:15.968: I/UniDS6 DEBUG(26408): <Device name: EASY Address: 00:06:66:07:5D:E5>
    02-15 17:56:15.972: I/UniDS6 DEBUG(26408): <bluetoothAdapter>00:06:66:07:5D:E5
    02-15 17:56:21.656: I/UniDS6 DEBUG(26408): <onReceive BroadcastReceiver>
    02-15 17:56:21.656: I/UniDS6 DEBUG(26408): <scan finish>
    02-15 17:56:30.265: I/UniDS6 DEBUG(26408): <connexion()>
    02-15 17:56:30.281: I/UniDS6 DEBUG(26408): <createRfcommSocket successfully created>
    02-15 17:56:30.289: E/UniDS6 DEBUG(26408): <not connected - fail>java.io.IOException: Service discovery failed
    02-15 17:56:30.289: I/UniDS6 DEBUG(26408): <socket closed successfully>
    c'est vraiment lors du connect.

    J'ai aussi activé la fonction discoverable mais je doute que ce soit liée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
    			Intent discoverableIntent = new Intent(
    					BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    			discoverableIntent.putExtra(
    					BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    			startActivity(discoverableIntent);
    		}

  12. #12
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 372
    Points : 512
    Points
    512
    Par défaut pas dans le thread principal...
    l 'appel à connect est bloquant...
    donc il faut le mettre soit dans un thread, soit dans un asynctask..

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par eomer212 Voir le message
    l 'appel à connect est bloquant...
    donc il faut le mettre soit dans un thread, soit dans un asynctask..
    ça expliquerait l'exception que j'ai?

  14. #14
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    ça expliquerait l'exception que j'ai?
    Non, cela rejoins plutôt mon conseil de passer la connection dans un Thread ou Service pour ne pas bloquer l'UI Thread.

    J'ai aussi activé la fonction discoverable mais je doute que ce soit liée:
    Non ce n'est pas lié .

    Essaye de te connecter à un autre appareil .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  15. #15
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 372
    Points : 512
    Points
    512
    Par défaut autre cause..
    un truc qui m'a fait m'arracher les cheveux. l'uuid.
    il semblerait que certains appareils n'acceptent qu'une certaine UUID.

    pour la connexion vers mon scanner en mode client, j'ai utilisé celle ci,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final UUID uuid=  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    il me renvoie paitre si j'en utilise une autre..

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Non, cela rejoins plutôt mon conseil de passer la connection dans un Thread ou Service pour ne pas bloquer l'UI Thread.



    Non ce n'est pas lié .

    Essaye de te connecter à un autre appareil .
    je n'ai pas d'autre appareil pour tester pour le moment

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Non, cela rejoins plutôt mon conseil de passer la connection dans un Thread ou Service pour ne pas bloquer l'UI Thread.



    Non ce n'est pas lié .

    Essaye de te connecter à un autre appareil .
    Je n'ai pas d'autre équipement pour tester mais j'ai pu tester avec une application de l'android market "blueterm".

    J'ai associé mon smartphone avec mon équipement bluetooth (j'ai entré le code etc dans les settings) ensuite j'ai lancé l'application blueterm et j'ai réussi à me connecter au module Bluetooth et envoyer des messages.

    Donc le soucis ne viens pas de mon module bluetooth ou autre déjà.

    En général, quand il y a un code de pour pairer les équipements, Android le gère tout seul (affiche une fenêtre pour entrer le code) ou il faut aussi le gérer soit même?

  18. #18
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 372
    Points : 512
    Points
    512
    Par défaut mais connecter à quoi ?
    oui, en fait, tu veux te connecter à quel type d'equipement.??
    un peripherique de lecture, de stockage, une oreillette.? un autoradio.?
    tout depend de ce que tu veux, mais l'uuid dans mon cas etait necessaire parceque le type d'appareil (en l'occurence un scanner de code barre) se comporte, si je me souviens bien, ) comme un lecteur sur port serie.
    j'ai essayé pas mal de truc, avant de tomber sur un article qui decrivait le probleme, et la solution.
    utiliser l'uuid

    quand tu cree ton socket, avant de la connecter,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);
    il faut que tu affecte à MY_UUID la valeur suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final UUID MY-UUID=  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    EXACTEMENT cette valeur!!

    mais la encore, difference, je me connecte en client .
    mais de toute facon, rien n'a marche tant que je me suis obstiné à tout laisser dans un seul thread.
    il faut les dissocier!
    sinon, ca plante, et finalement, c'est logique.
    on peut pas mettre au meme niveau de priorite, une ouverture de socket et la gestion de l'interface utilisateur.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par eomer212 Voir le message
    oui, en fait, tu veux te connecter à quel type d'equipement.??
    un peripherique de lecture, de stockage, une oreillette.? un autoradio.?
    tout depend de ce que tu veux, mais l'uuid dans mon cas etait necessaire parceque le type d'appareil (en l'occurence un scanner de code barre) se comporte, si je me souviens bien, ) comme un lecteur sur port serie.
    j'ai essayé pas mal de truc, avant de tomber sur un article qui decrivait le probleme, et la solution.
    utiliser l'uuid

    quand tu cree ton socket, avant de la connecter,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);
    il faut que tu affecte à MY_UUID la valeur suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final UUID MY-UUID=  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    EXACTEMENT cette valeur!!

    mais la encore, difference, je me connecte en client .
    mais de toute facon, rien n'a marche tant que je me suis obstiné à tout laisser dans un seul thread.
    il faut les dissocier!
    sinon, ca plante, et finalement, c'est logique.
    on peut pas mettre au meme niveau de priorite, une ouverture de socket et la gestion de l'interface utilisateur.
    Bonjour,

    merci pour ta réponse.

    Effectivement ce matin j'y ai repensé à cette UUID car dans plusieurs exemple que j'ai trouvé, je n'ai pas fais attention, mais c'est cette UUID qui est utilisé. Je pensais que c'était l'adresse de mon smartphone que je devais placer mais non...

    Je me connecte à un module bluetooth relier via un USART à un PIC18F. J'essai juste de réaliser une petite application pour contrôler une carte électronique embarqué.
    Donc la gestion derrière est fonction de ce que je veux en faire. Je devais juste pouvoir établir correctement la liaison.

    Je vais essayer tout de suite. Merci pour ton feedback.

    EDIT :

    Okay ça fonctionne. J'arrive à me connecter.

    Je vais pouvoir me concentrer sur la réalisation des threads comme on me la conseillé.

    Un grand merci.

    Je vais devoir mtn aussi me concentrer sur la lecture / écriture.

    à bientôt donc

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Non, cela rejoins plutôt mon conseil de passer la connection dans un Thread ou Service pour ne pas bloquer l'UI Thread.



    Non ce n'est pas lié .

    Essaye de te connecter à un autre appareil .
    Bonjour à nouveau.

    J'ai refais mon application bluetooth avec des threads.
    Je rencontre un soucis au niveau de onDestroy.

    Quand mon application parviens à se connecter à ma carte, quand je quitte je n'ai aucun problème.

    Par contre lorsque je ne détecte pas de carte et que je quitte j'ai plusieurs exception :

    <onStop>
    <onDestroy>
    Shutting down VM
    threadid=1: thread exiting with uncaught exception (group=0x40015560)
    FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to destroy activity {com.test.BT.easybt/com.test.BT.easybt.easybt.EasyBT}: java.lang.NullPointerException
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2672)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2690)
    at android.app.ActivityThread.access$2100(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:964)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException
    at com.test.BT.easybt.easybt.EasyBT.onDestroy(EasyBT.java:157)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2659)
    ... 11 more
    lorsque j'exécute l'application, je recherche le BT sur le téléphone ensuite je lance un thread qui l'active et qui me renvoit un signal comme quoi je peux commencer à lancer une recherche de périphérique, etc.

    Je me rend compte que si je ne détecte rien et que je quitte l'application, j'ai des exceptions comme ci dessus.
    Mon thread qui active le bluetooth et envoi un signal à l'activité principal (via un handler) n'est jamais tué j'ai simplement un run() sans boucle. Une fois qu'il a exécuté son code, le thread est signalé comme TERMINATED.

    Je ne sais pas trop quel est le soucis.

    Quelqu'un à une idée?

    EDiT : J'ai trouvé mon erreur

Discussions similaires

  1. Comment lister les périphériques bluetooth à porté?
    Par xXO--Hades--OXx dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 11/02/2011, 11h56
  2. Réponses: 1
    Dernier message: 31/08/2009, 10h53
  3. Réponses: 5
    Dernier message: 27/04/2007, 15h43
  4. demonter les périphérique USB par la ligne de commande.
    Par Essilife dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 20/01/2006, 12h50
  5. découvrir les erreurs sous Mozilla
    Par rabobsky dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/12/2004, 21h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo