Bluetooth - InputStream.read() bloque indéfiniment

Signaler
Messages postés
2
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
27 janvier 2008
-
 Utilisateur anonyme -
Bonjour,

J'essaie désepérément de faire un client/serveur tout simple en Bluetooth entre 2 mobiles (Sony/Ericson W810i et Motorola V360v).

J'ai tenté avec l'exemple de Sun fourni avec J2ME Wireless Toolkit: "BluetoothDemo", qui fonctionne parfaitement en émulation mais pas du tout sur les mobiles.

Puis cherchant quelque chose d'encore plus simple, j'ai trouvé cet exemple-ci:
http://www.webpronews.com/topnews/2004/12/27/introduction-to-bluetooth-and-jme-part

Et notamment les sources de l'exemple:
http://www.jasonlam604.com/downloads/content/articles/bluetoothechodemo_source.zip

Mais malgré la simplicité du code, impossible de faire fonctionner le tout.

J'ai rajouté un peu de log pour trouver le problème et donc ça bloque au niveau de:

public final static String readData(StreamConnection conn) {

    InputStream input = null;
    byte[] data = null;

    try {
      input = conn.openInputStream();

      // Probably want to throw an exception if length is not greater then 0
      int length = input.read();
      data= new byte[length];
      length = 0;

      // Assemble data
      while (length != data.length) {
        int ch = input.read(data, length, data.length - length);
        if (ch == -1) {
          throw new IOException("Can't read data");
        }
        length += ch;
      }

    }
    catch (IOException e) {
    }
    catch (Exception e) {
    } finally {

      // close input stream
      if (input != null) {
        try {
          input.close();
        } catch (IOException e) {
        }
      }
    }
    return new String(data);
  }
}

J'ai eu beau y tourner dans tous les sens, pas moyen de faire une communication aller/retour.

Cependant, le client indique bien avoir trouvé le serveur dans servicesDiscovered(), et le serveur réagit bien à la connection client en continuant après le StreamConnectionNotifier.acceptAndOpen().
Et donc le read() sur l'objet retourné par un openInputStream() sur le retour de acceptAndOpen() bloque.

Je m'y prends pas de la bonne manière ?
Est-il possible qu'un téléphone soit Bluetooth, mais incapable de faire fonctionner un simple client/serveur ?
Y a-t-il d'autres moyens simples pour échanger des données (simples, par exemple une chaîne de caractères) entre 2 mobiles ?

Merci de votre aide,
K.

4 réponses


Vérifie la version de bluetooth des deux mobiles. Le V360v a peut-être une version plus ancienne, une 1.0 alors que le W810i est en 2.0. Si tel est le cas, ce que tu fais peut marcher dans un sens mais pas dans l'autre. A confirmer.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
Messages postés
2
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
27 janvier 2008

Bon il semblerait que mon problème de base soit dû au fait que j'avais pas de flush côté output (qui est pourtant marqué inutile dans la javadoc, bref).

Je l'ai ajouté et le read ne bloque plus, par contre dans le sens read depuis le Sony vers le Motoral (qui fait le write), le read me retourne systématiquement -1.

Le write se fait pourtant sans erreur, et se termine.

des idées ?

Sinon, y a un moyen simple trouver la version Bluetooth du mobile ?

Je ne connais pas de moyen programmatique de récupérer la version mais tu peux vérifier la thèse que j'ai avancée en allant sur le site des constructeurs respectifs des modèles dont tu te sers.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java