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

Java ME Discussion :

Bluetooth - InputStream.read() bloque indéfiniment


Sujet :

Java ME

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 18
    Par défaut Bluetooth - InputStream.read() retourne -1
    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/20...h-and-jme-part

    Et notamment les sources de l'exemple:
    http://www.jasonlam604.com/downloads...emo_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:

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

    Edit: En fait c'est peut-être le write qui ne marche pas dans un sens, car ça semble fonctionner à moitié, et de façon complémentaire selon lequel est client ...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 18
    Par défaut
    Bon après vérification, le write semble bel et bien marcher (log avant et après semble ok).

    Est-ce possible que ce soit lié à des droits/permissions à défniri quelque part ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 18
    Par défaut
    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 ?

  4. #4
    Membre confirmé Avatar de CriPpLe
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 157
    Par défaut
    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
     
    in = conn.openDataInputStream();
    out = conn.openDataOutputStream();
     
    int[] readBuffer = new int[100];
    int len = 0;
     
    // On lit chaque octet du flux
    while ((readBuffer[len] = in.read()) != -1 && in.available() > 0) 
    {
          len++;
    }
     
    // On renvoit le paquet de réponse
    out.write(data.getValidPacket());
    Moi je fais comme ça les lectures et écriture et ça marche niquel

Discussions similaires

  1. Opération read bloque le thread
    Par FinalSpirit dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 27/03/2012, 11h46
  2. BLUETOOTH - Port COM virtuel bloqué
    Par rob24 dans le forum Windows
    Réponses: 0
    Dernier message: 06/01/2012, 10h25
  3. Transaction READ COMMITED bloque UPDATE sur même table
    Par stephane.julien dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/06/2011, 13h52
  4. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 15h00

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