Android Bluetooth Client and Server Won't Connect
Question: I am currently trying to create an app that connects Google Glass(client) to
my computer(python server). I would like to send simple strings. I have tried
multiple ways but haven't had much luck. I am currently using some sample code
I found. After running both, i get the message

> "In onResume() and an exception occurred during write: Socket Closed"

on Glass, and my computer(HP Pavillion Dv6 running Ubuntu 12.04 with Bluetooth
Dongle) completely freezes. One time the GUI itself crashed and I was looking
at a stack trace on the console(that scary black screen).

Here is the client code:

    
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.UUID;
    
    import com.myPackage.glassbluetooth.R;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    
    public class ConnectTest extends Activity {
        TextView out;
        private static final int REQUEST_ENABLE_BT = 1;
        private BluetoothAdapter btAdapter = null;
        private BluetoothSocket btSocket = null;
        private OutputStream outStream = null;
    
        // Well known SPP UUID
        private static final UUID MY_UUID =
                UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    
        // Insert your server's MAC address
        private static String address = "00:1F:81:00:08:30";
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            out = (TextView) findViewById(R.id.out);
    
            out.append("\n...In onCreate()...");
    
            btAdapter = BluetoothAdapter.getDefaultAdapter();
            CheckBTState();
        }
    
        @Override
        public void onStart() {
            super.onStart();
            out.append("\n...In onStart()...");
        }
    
        @Override
        public void onResume() {
            super.onResume();
    
            out.append("\n...In onResume...\n...Attempting client connect...");
    
            // Set up a pointer to the remote node using it's address.
            BluetoothDevice device = btAdapter.getRemoteDevice(address);
    
            // Two things are needed to make a connection:
            //   A MAC address, which we got above.
            //   A Service ID or UUID.  In this case we are using the
            //     UUID for SPP.
            try {
                btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                AlertBox("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
            }
    
            // Discovery is resource intensive.  Make sure it isn't going on
            // when you attempt to connect and pass your message.
            btAdapter.cancelDiscovery();
    
            // Establish the connection.  This will block until it connects.
            Log.d("CONNECTTEST", "Try to open socket");
    
            try {
                btSocket.connect();
                Log.d("CONNECTTEST", "btSocket.connect executed");
                out.append("\n...Connection established and data link opened...");
            } catch (IOException e) {
                try {
                    btSocket.close();
                } catch (IOException e2) {
                    AlertBox("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
                }
            }
    
            // Create a data stream so we can talk to server.
            out.append("\n...Sending message to server...");
    
            try {
                outStream = btSocket.getOutputStream();
            } catch (IOException e) {
                AlertBox("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + ".");
            }
    
            String message = "Hello from Android.\n";
            byte[] msgBuffer = message.getBytes();
            try {
                outStream.write(msgBuffer);
            } catch (IOException e) {
                String msg = "In onResume() and an exception occurred during write: " + e.getMessage();
                if (address.equals("00:00:00:00:00:00")) 
                    msg = msg + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on line 37 in the java code";
                msg = msg +  ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() + " exists on server.\n\n";
    
                AlertBox("Fatal Error", msg);       
            }
        }
    
        @Override
        public void onPause() {
            super.onPause();
    
            out.append("\n...In onPause()...");
    
            if (outStream != null) {
                try {
                    outStream.flush();
                } catch (IOException e) {
                    AlertBox("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + ".");
                }
            }
    
            try     {
                btSocket.close();
            } catch (IOException e2) {
                AlertBox("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
            }
        }
    
        @Override
        public void onStop() {
            super.onStop();
            out.append("\n...In onStop()...");
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            out.append("\n...In onDestroy()...");
        }
    
        private void CheckBTState() {
            // Check for Bluetooth support and then check to make sure it is turned on
    
            // Emulator doesn't support Bluetooth and will return null
            if(btAdapter==null) { 
                AlertBox("Fatal Error", "Bluetooth Not supported. Aborting.");
            } else {
                if (btAdapter.isEnabled()) {
                    out.append("\n...Bluetooth is enabled...");
                } else {
                    //Prompt user to turn on Bluetooth
                    Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
                }
            }
        }
    
        public void AlertBox( String title, String message ){
            new AlertDialog.Builder(this)
            .setTitle( title )
            .setMessage( message + " Press OK to exit." )
            .setPositiveButton("OK", new OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            }).show();
        }
    }
    

and here is the server code:

    
    
    from bluetooth import *
    
    server_sock=BluetoothSocket( RFCOMM )
    server_sock.bind(("",PORT_ANY))
    server_sock.listen(1)
    
    port = server_sock.getsockname()[1]
    
    uuid = "1aefbf9b-ea60-47de-b5a0-ed0e3a36d9a5"
    testUuid = "00001101-0000-1000-8000-00805F9B34FB"
    
    advertise_service( server_sock, "GlassServer",
                       service_id = testUuid,
                       service_classes = [ uuid, SERIAL_PORT_CLASS ],
                       profiles = [ SERIAL_PORT_PROFILE ], 
    #                   protocols = [ OBEX_UUID ] 
                        )
    
    print("Waiting for connection on RFCOMM channel %d" % port)
    
    client_sock, client_info = server_sock.accept()
    print("Accepted connection from ", client_info)
    
    try:
        while True:
            data = client_sock.recv(1024)
            if len(data) == 0: break
            print("received [%s]" % data)
    except IOError:
        pass
    
    print("disconnected")
    
    client_sock.close()
    server_sock.close()
    print("all done")
    

Here is the output of hcitool:

    
    
    $ hcitool scan
    Scanning ...
        F4:B7:E2:F9:74:63   GLASS-YUKON
    $ hcitool dev
    Devices:
        hci0    00:1F:81:00:08:30
    

Does anyone have any idea whats going on? Also, if you know of any relevant
sample programs that might work I would be interested in trying them! Thanks
in advance!

Bump, can anyone help with this?

After experimenting with a computer which had bluetooth capabilities built in,
I was able to hone in on the problem a little more. The problem occurs when
the code attempts to create the RFComm socket. Using the code I have now, I
get an exception Service Discovery failed. I got rid of that error after using
the advice found here: [Service discovery failed exception using Bluetooth on
Android ](http://stackoverflow.com/questions/3397071/service-discovery-failed-
exception-using-bluetooth-on-android)

but now I get an exception that says "Host is down". None of the fixes I found
worked. Any ideas?


Answer: I can answer one part of my question:

The kernel panic is not due to my code but rather faulty driver software for
my Bluetooth Dongle. I tried the code on a computer which natively had
Bluetooth capabilities and I got the same results sans the kernel panic.

