androidandroid-bluetoothdataoutputstreambluecove

Stream cannot be reopened while doing bytes write to OutputStream in a loop


When I put inLoop() method in a while loop, then the server never runs.

It terminates but I want the server to continuously send bytes to the client again and again.

How do I do that ?

SimpleSPPServer -

public class SimpleSPPServer {
    //start server
    private void startServer() throws IOException{

         //Create a UUID for SPP
        UUID uuid = new UUID("1101", true);
        //Create the servicve url

        String connectionString = "btspp://localhost:" + uuid +";name=Sample SPP Server";


        //open server url
        StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open( connectionString );

        //Wait for client connection
        System.out.println("\nServer Started. Waiting for clients to connect...");
        StreamConnection connection=streamConnNotifier.acceptAndOpen();

        while(true)
        {
            inLoop(connection);
        }
    }

    public void inLoop(StreamConnection connection) throws IOException
    {
        RemoteDevice dev = RemoteDevice.getRemoteDevice(connection);
        System.out.println("Remote device address: "+dev.getBluetoothAddress());
        System.out.println("Remote device name: "+dev.getFriendlyName(true));

         //send response to spp client
         OutputStream outStream=connection.openDataOutputStream();

         DataOutputStream mmOutStream = new DataOutputStream(outStream); 

         byte[] bb1 = new byte[] {  
                 (byte)0x7D, (byte)0x43, (byte)0x92, (byte)0x05, (byte)0x0E, 
                 (byte)0x2E, (byte)0x0A };

         System.out.println("Writing Bytes...");

            try 
            {
                //mmOutStream.writeByte(bb[k]);
                mmOutStream.write(bb1, 0, bb1.length);

                Thread.sleep(5000);

                //mmOutStream.write(bb2, 0, bb2.length);
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
            catch (NullPointerException e) 
            {
            } catch (Exception e) {
                e.printStackTrace();
            }

        PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(mmOutStream));
        try {
            mmOutStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        pWriter.flush();

        pWriter.close();

    }

    public static void main(String[] args) throws IOException {

        //display local device address and name
        LocalDevice localDevice = LocalDevice.getLocalDevice();
        System.out.println("Address: "+localDevice.getBluetoothAddress());
        System.out.println("Name: "+localDevice.getFriendlyName());

        SimpleSPPServer sampleSPPServer=new SimpleSPPServer();
        sampleSPPServer.startServer();

    }

Exception -

Exception in thread "main" java.io.IOException: Stream cannot be reopened
    at com.intel.bluetooth.BluetoothRFCommConnection.openOutputStream(BluetoothRFCommConnection.java:190)
    at com.intel.bluetooth.BluetoothRFCommConnection.openDataOutputStream(BluetoothRFCommConnection.java:213)
    at SimpleSPPServer.inLoop(SimpleSPPServer.java:52)
    at SimpleSPPServer.startServer(SimpleSPPServer.java:41)
    at SimpleSPPServer.main(SimpleSPPServer.java:104)

Solution

  • Take the opening and closing of the stream out of doLoop(). Open the stream before you start the loop with while. Close the stream never. Or when the loop is done.