2017-01-17 4 views
-2

Ce code fonctionne très bien en utilisant Java Bluecove Bluetooh Library. C'est juste une méthode principale pour sonder une connexion directe RFCCOMM.Connexion directe Bluetooth RFCOMM: de BlueCove à la main 32Feet

J'essaie de faire la même chose en C# basé sur "In The Hand 32Feet" utilitaire libray je voudrais envoyer une commande de texte et recevoir une réponse de l'appareil.

Pour Java Sur BlueCove (fonctionne très bien!)

String serverURL = "btspp://XXXXXXXXXXXX:1;authenticate=false;encrypt=false;master=false";  
StreamConnection sc = (StreamConnection) MicroeditionConnector.open(serverURL); 
DataOutputStream os = sc.openDataOutputStream(); 

String text = "Send command"; 
byte data[] = text.getBytes(); 

os.write(data); 
os.flush(); 
os.close();  

BufferedReader reader = new BufferedReader(new InputStreamReader(sc.openInputStream())); 
StringBuilder out = new StringBuilder(); 
String line; 
while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
     out.append(line); 
} 
System.out.println("Receive data" + out.toString()); 
reader.close();  

Pour C# Basé sur dans la main 32 pieds

Ceci est ma tentative actuelle convertir en C#. ... mais le problème est que je n'ai pas accès à peerStream est fermé? (retourne toujours CanRead à false).

Comme vous pouvez le voir dans l'exemple Java BlueCove est possible d'ouvrir une connexion avec un double objectif: OutputStream pour écrire des commandes et un InputStream pour lire le résultat en séquence

Puis-je faire cela d'une autre manière?

String address = "00:00:00:00:00:00"; 
Guid mUUID = new Guid("00000000-0000-0000-0000-0000500b34fb"); 

BluetoothAddress addr = BluetoothAddress.Parse(address); 
var btEndpoint = new BluetoothEndPoint(addr, mUUID); 
var btClient = new BluetoothClient(); 
btClient.connect(btEndpoint); 

Stream peerStream = btClient.GetStream(); 
using (StreamWriter sw = new StreamWriter(peerStream)) 
{ 
    sw.WriteLine("Send command"); 
    sw.Flush(); 
    sw.Close(); 
} 

if (peerStream.CanRead) 
{ 
    using (StreamReader sr = new StreamReader(peerStream)) 
    { 
    while (sr.Peek() >= 0) 
     { 
     Debug.WriteLine("Receive data" + sr.ReadLine()); 
     } 
    sr.Close(); 
    }  
} 
btClient.Close(); 
btClient.Dispose(); 

Répondre

1

Je pense que l'appel à sw.Close() ferme le flux sous-jacent et, par conséquent, vous un cant de lire peerStream après la fermeture sw.

Je voudrais essayer quelque chose comme ceci:

 String address = "00:00:00:00:00:00"; 
     Guid mUUID = new Guid("00000000-0000-0000-0000-0000500b34fb"); 

     BluetoothAddress addr = BluetoothAddress.Parse(address); 
     var btEndpoint = new BluetoothEndPoint(addr, mUUID); 
     var btClient = new BluetoothClient(); 
     btClient.connect(btEndpoint); 

     using (Stream peerStream = btClient.GetStream()) 
     using (StreamWriter sw = new StreamWriter(peerStream)) 
     { 
      sw.WriteLine("Send command"); 
      sw.Flush(); 

      if (peerStream.CanRead) 
      { 
       using (StreamReader sr = new StreamReader(peerStream)) 
       { 
        while (sr.Peek() >= 0) 
        { 
         Debug.WriteLine("Receive data" + sr.ReadLine()); 
        } 
       } 
      } 
     } 
+0

Merci beaucoup! Votre réponse fonctionne correctement. – Sara