开发者

Error in Android 2.1 Bluetooth SPP with Inputstream.read

I Try to connect a Bluetooth Adapter, which send me some Data after sending a Handshake. My Problem is, until the Adapter is sending, the code works fine, but if it stopped, the in.read(xxx Command blocks whithout any exeption. I have to turne off the adapter and wait severeal seconds, then an exception occurs and the Code resumed. How to solve this? (I removed the errorhandling for better understanding)

BluetoothAdapter bt_adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice bt_device = null;

//Bluetooth not supportet
if (bt_adapter == null) {
    return false;
}

//enable Bluetooth
if (!bt_adapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    return false;
}    

//search K01-Blue Adapter
Set<BluetoothDevice> pairedDevices =  bt_adapter.getBondedDevices();
if (pairedDevices.size() > 0开发者_开发知识库) {
for (BluetoothDevice device : pairedDevices) {
    String name = device.getName();
    if (name.contains("K01-Blue")) {
        bt_device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress());
        break;
    }
}
}

//Exit if no Adapter found
if(bt_device == null){ return false; }

//Create Socket         
try {
UUID uuid =UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
GlobalVars.bluetooth.bt_socket =GlobalVars.bluetooth.bt_device.createRfcommSocketToServiceRecord(uuid);
    } catch (Exception e) {
    e.printStackTrace();
    }

//Exit if socket not created              
if(bt_socket == null){ return false; }

/Connect to Socket, otherwise exit
try {bt_socket.connect();
    } catch (IOException e1) {return false;}

//get InputStream   
InputStream in = null;
try {in = GlobalVars.bluetooth.bt_socket.getInputStream();
    } catch (IOException e1) {return false;}

//get OutputStream
OutputStream out = null;
try {out = GlobalVars.bluetooth.bt_socket.getOutputStream()
    } catch (IOException e1)  {return false;}

//Say hello to K01 Adapter  
byte[] hello = {0x2F, 0x3F, 0x21, 0x0D, 0x0A};

try {out.write(hello);
   } catch (IOException e1) {return false;}

//Listen to Answer of K01 Adapter
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];

try {
    nRead = in.read(data, 0, data.length);
    while (nRead != -1) {
        nRead = in.read(data, 0, data.length);
        buffer.write(data, 0, nRead);
    }
   } catch (IOException e1) {e1.printStackTrace();}


//Create String from Bytearray
String str1 = new String(buffer.toByteArray());


Thats what worked for me:

static ByteArrayOutputStream readbuffer_to()
     {
        ByteArrayOutputStream found = new ByteArrayOutputStream();
        long start = System.currentTimeMillis();
        try {
              if(GlobalVars.bluetooth.in.available() == 0){return found;}
              int nRead = GlobalVars.bluetooth.in.read();
              boolean catched = false;
              while (true) {
                  if(GlobalVars.bluetooth.in.available() > 0)
                  {
                      found.write(nRead);
                      nRead = GlobalVars.bluetooth.in.read(); 
                      start = System.currentTimeMillis();

                  }
                    if(System.currentTimeMillis() - start > 5000) {break;} 

              } 


        } catch (IOException e1) {


        }
         return found;
     }


Isn't that "blocking" means that in.read() is blocking the thread until the data coming from bluetooth?

So if this listener is in own thread you don't need any is.available()?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜