2011-09-14 6 views
2

データを一定のストリームを吐き出すBluetoothデバイスからデータを読み取るための簡単なスクリプトをJavaで作成しようとしています。私はPythonを使って私の問題を解決することができるので、デバイスが動作していることを知っていますが、私は最終的にJavaを使いたいと思います。InputStream.available()は、データを常時ストリームするBluetooth RFCOMMサーバーをリッスンするときにバイトを報告しません。

私はいくつかのサンプルコードを持っていますが、readコマンドでハングします。問題は、読み取り()の呼び出しが可能なデータが存在しないと考えているということのようだということ

// Ref http://homepages.ius.edu/rwisman/C490/html/JavaandBluetooth.htm 
import java.io.*; 
import javax.microedition.io.*; 
//import javax.bluetooth.*; 

public class RFCOMMClient { 
    public static void main(String args[]) { 
    try { 
     StreamConnection conn = (StreamConnection) Connector.open(
     "btspp://00078093523B:2", Connector.READ, true); 

     InputStream is = conn.openInputStream(); 

     byte buffer[] = new byte[8]; 
     try { 
      int bytes_read = is.read(buffer, 0, 8); 
      String received = new String(buffer, 0, bytes_read); 
      System.out.println("received: " + received); 
     } catch (IOException e) { 
      System.out.println(" FAIL"); 
      System.err.print(e.toString()); 
     } 
     conn.close(); 
    } catch (IOException e) { 
     System.err.print(e.toString()); 
    } 
} 

}

注意。しかし、Bluetoothデバイスは常にデータを吐き出します(センサーです)。 、助けてください

In [1]: import bluetooth 

In [2]: address = "00:07:80:93:52:3B" 

In [3]: s = bluetooth.BluetoothSocket(bluetooth.RFCOMM) 

In [4]: s.connect((address,1)) 

In [5]: s.recv(1024) 
Out[5]: '<CONFIDENTIALDATAREMOVED>' 

ありがとう:ここで仕事をして、私のPythonコードです!

+0

また、私はこの問題があります – Pooya

答えて

1

読み取りはデータをブロックして待機します。より良いイディオムは利用可能な()を使用することです。

int bytesToRead = is.available(); 
if(bytesToRead > 0) 
    is.read(buffer, 0, bytesToRead); 
else 
    // wait for data to become available 
+0

ありがとう。 Hmmm ... available()は0を返すので、何も読み込まれません。しかし、装置は常にデータを吐き出します(センサーです)。ここで私はJavaコードを実行した直後に試した私のPythonコードです:\t [1]:import bluetooth [2]:address = "00:07:80:93:52:3B" In [3] ]:S = bluetooth.BluetoothSocket(bluetooth.RFCOMM)[4]において :s.connect((アドレス、1))[5]で :s.recv(1024) OUT [5]:「CONFIDENTIALDATAREMOVED ' – doc

+0

うん。 openInputStream()の代わりにopenDataInputStream()を使用して、動作が変更されているかどうかを確認してください。それはそうだとは思えませんが、それはショットの価値があります。 – mcfinnigan

+0

結果は変わりません。 :/ – doc

関連する問題