Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unable to connect to bluetooth socket on android

I am trying to sent message from android client to Mac OS X over bluetooth. I am using bluecove 2.0.1 Java bluetooth library on Mac OS X Snow Leopard.

Code for Server:

public class EchoServer2 {
private static final String UUID_STRING = "00001101-0000-1000-8000-00805F9B34FB"; // 32 hex digits
private static final String SERVICE_NAME = "echoserver";

private LocalDevice mLocalDevice;

public EchoServer2() {
    try {
        mLocalDevice = LocalDevice.getLocalDevice();
    } catch(IOException e) {
        System.err.print("Error connection to bluetooth");
    }   
}

public void start() throws IOException {
    StreamConnectionNotifier connectionNotifier =
        (StreamConnectionNotifier) Connector.open(
                "btspp://localhost:" + UUID_STRING +
                ";name=" + SERVICE_NAME + ";authenticate=false");

    System.out.println("Bluetooth Address: " + mLocalDevice.getBluetoothAddress());

    System.out.println("Waiting for a connection...");
    StreamConnection streamConnection = connectionNotifier.acceptAndOpen();

    System.out.println("Found a new device.");

    RemoteDevice device = RemoteDevice.getRemoteDevice(streamConnection);
    System.out.println("New Device connected: " + device.getFriendlyName(false).toString());

    DataInputStream is = streamConnection.openDataInputStream();

    byte[] bytes = new byte[1024];
    int r;
    while((r = is.read(bytes)) > 0) {
        System.out.println(new String(bytes, 0, r));
    }

}

}

Code for Android client:

public class MainActivity extends Activity {

private static final String TAG = "MainActivity";

EditText editText;
TextView textView;

String send_msg;
String rcv_msg;

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // 32 hex digits

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, "onCreate");

    editText = (EditText) findViewById(R.id.edit_msg);
    textView = (TextView) findViewById(R.id.rcv_msg);

    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

    if(adapter == null) {
        textView.append("Bluetooth NOT Supported!");
        return;
    }

    // Request user to turn ON Bluetooth
    if(!adapter.isEnabled()) {
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(intent, RESULT_OK);
    }




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public void onClick(View view) {
    Log.d(TAG, "onClick");
    new SendMessageToServer().execute(send_msg);
}

private class SendMessageToServer extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... msg) {
        Log.d(TAG, "doInBackground");

        BluetoothSocket clientSocket = null;
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        mBluetoothAdapter.enable();
        // Client knows the server MAC address 
        BluetoothDevice mmDevice = mBluetoothAdapter.getRemoteDevice("00:25:00:C3:1C:FE");
        Log.d(TAG, "got hold of remote device");
        Log.d(TAG, "remote device: " + mmDevice.getName().toString());

        try {
            // UUID string same used by server 
            clientSocket = mmDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);

            Log.d(TAG, "bluetooth socket created");

            mBluetoothAdapter.cancelDiscovery();    // Cancel, discovery slows connection

            clientSocket.connect();
            Log.d(TAG, "connected to server");

            DataInputStream in = new DataInputStream(clientSocket.getInputStream());
            DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());

            out.writeUTF(msg[0]);           // Send message to server
            Log.d(TAG, "Message Successfully sent to server");
            return in.readUTF();            // Read response from server
        } catch (Exception e) {

            Log.d(TAG, "Error creating bluetooth socket");
            Log.d(TAG, e.getMessage());

            return "";
        }

    }

    @Override
    protected void onPostExecute(String result) {
        Log.d(TAG, "onPostExecute");
        rcv_msg = result;
        textView.setText(rcv_msg);
    }

}

}

I am not able to connect to server even though the UUID are same both for client and server. Android throws an exception: Service Discovery failed. However I am able to print the name of remote device (client) on the server. Hence acceptAndOpen() is unable to accept the socket connection.

Please help me in understanding as to why I am unable to clientSocket.connect(); on android ?

like image 284
Anup Warnulkar Avatar asked Nov 13 '22 14:11

Anup Warnulkar


1 Answers

Im gonna take a guess and say it has something to do with the UUID numbers you used. They depend solely on the type of device you use. So make sure you look those up and that they are correct for the android device. When i was doing android this stumped me for a long time. UUID is not something you set. Here is a link How can I get the UUID of my Android phone in an application? Or this Android - Get Bluetooth UUID for this device

If that is not it. Did discovery fail on both ends? can you see the device on either end? Which side can you print the name? You might want to take a look at google's bluetooth sample program. And use that to get you started.

like image 141
crychair Avatar answered Nov 15 '22 05:11

crychair