views:

47

answers:

1

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());
A: 

solved the Problem. The in.read() is blocking, if in.available() == 0 if have to set some sleep() Points in the code and have to ensure, that available > 0 before calling read().

2red13