Précédent   Forum des professionnels en informatique > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/02/2012, 20h19   #1
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 11h03   #2
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
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 .
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 20h18   #3
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
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();
	}
}
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2012, 12h43   #4
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Bonjour,

Citation:
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 :
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.

Citation:
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/

Citation:
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
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 15h50   #5
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 16h07   #6
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Citation:
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 :
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é.

Citation:
ù 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.

Citation:
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)
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 17h05   #7
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
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 :
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 :
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 :

Citation:
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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 17h17   #8
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
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 :
BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();

Code :
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
Citation:
<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.
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 17h33   #9
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();

Code :
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 :
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.
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 17h56   #10
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Citation:
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 .

Citation:
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
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 18h01   #11
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
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);
			}
		}
 
	}
Citation:
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 :
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);
		}
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 18h08   #12
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

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

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
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..
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 18h14   #13
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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?
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 18h50   #14
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Citation:
ç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.

Citation:
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 .
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 18h55   #15
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

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

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
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 :
final UUID uuid=  UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
il me renvoie paitre si j'en utilise une autre..
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 19h16   #16
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 19h37   #17
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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?
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2012, 22h40   #18
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

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

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
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 :
socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);
il faut que tu affecte à MY_UUID la valeur suivante.
Code :
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.
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 18h12   #19
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :
socket = EASYBT.createRfcommSocketToServiceRecord(MY_UUID);
il faut que tu affecte à MY_UUID la valeur suivante.
Code :
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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2012, 19h27   #20
Invité de passage
 
Inscription : juillet 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 34
Points : 3
Points : 3
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 :

Citation:
<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
GGelec est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h36.


 
 
 
 
Partenaires

Hébergement Web