package edu.cs4730.btDemo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Set; import java.util.UUID; import android.app.Activity; import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.TextView; public class blueToothDemo extends Activity implements Button.OnClickListener { BluetoothAdapter mBluetoothAdapter =null; BluetoothDevice device; private static final int REQUEST_ENABLE_BT = 2; private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"); private static final String NAME = "BluetoothDemo"; BluetoothDevice remoteDevice; TextView output; Button btnServer, btnScan, btnClient; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); output = (TextView) findViewById(R.id.output); output.append("\n"); btnServer = (Button) findViewById(R.id.btnServer); btnServer.setOnClickListener(this); btnClient = (Button) findViewById(R.id.btnClient); btnClient.setOnClickListener(this); btnScan = (Button) findViewById(R.id.btnScan); btnScan.setOnClickListener(this); startbt(); } @Override public void onClick(View v) { if ( (Button)v == btnServer) { startServer(); } else if ( (Button)v == btnClient) { if (device != null) { output.append("button client\n"); startClient(); } } else if ( (Button)v == btnScan) { output.append("Started query\n"); querypaired(); } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { output.append(msg.getData().getString("msg")); } }; public void mkmsg(String str) { //handler junk, because thread can't update screen! Message msg = new Message(); Bundle b = new Bundle(); b.putString("msg", str); msg.setData(b); handler.sendMessage(msg); } public boolean startbt() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth return false; } //make sure bluetooth is enabled. if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } return true; } public void querypaired() { Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // If there are paired devices if (pairedDevices.size() > 0) { // Loop through paired devices output.append("at least 1 paired device\n"); final BluetoothDevice blueDev[] = new BluetoothDevice[pairedDevices.size()]; String[] items = new String[blueDev.length]; int i =0; for (BluetoothDevice devicel : pairedDevices) { blueDev[i] = devicel; items[i] = blueDev[i].getName() + ": " + blueDev[i].getAddress(); output.append("Device: "+items[i]+"\n"); //mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); i++; } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Choose Bluetooth:"); builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { dialog.dismiss(); if (item >= 0 && item <blueDev.length) { device = blueDev[item]; } } }); AlertDialog alert = builder.create(); alert.show(); } } public void startServer() { new Thread(new AcceptThread()).start(); } public void startClient() { if (device != null) { new Thread(new ConnectThread(device)).start(); } } /** * This thread runs while listening for incoming connections. It behaves * like a server-side client. It runs until a connection is accepted * (or until cancelled). */ private class AcceptThread extends Thread { // The local server socket private final BluetoothServerSocket mmServerSocket; public AcceptThread() { BluetoothServerSocket tmp = null; // Create a new listening server socket try { tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); } catch (IOException e) { mkmsg("Failed to start server\n"); } mmServerSocket = tmp; } public void run() { mkmsg("waiting on accept"); BluetoothSocket socket = null; try { // This is a blocking call and will only return on a // successful connection or an exception socket = mmServerSocket.accept(); } catch (IOException e) { mkmsg("Failed to accept\n"); } // If a connection was accepted if (socket != null) { mkmsg("Connection made\n"); mkmsg("Remote device address: "+socket.getRemoteDevice().getAddress().toString()+"\n"); //Note this is copied from the TCPdemo code. try { mkmsg("Attempting to receive a message ...\n"); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = in.readLine(); mkmsg("received a message:\n" + str+"\n"); PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); mkmsg("Attempting to send message ...\n"); out.println("Reponse from Bluetooth Demo Server"); out.flush(); mkmsg("Message sent...\n"); mkmsg("We are done, closing connection\n"); } catch(Exception e) { mkmsg("Error happened sending/receiving\n"); } finally { try { socket.close(); } catch (IOException e) { mkmsg("Unable to close socket"+e.getMessage()+"\n"); } } } else { mkmsg("Made connection, but socket is null\n"); } mkmsg("Server ending \n"); } public void cancel() { try { mmServerSocket.close(); } catch (IOException e) { } } } /** * This thread runs while attempting to make an outgoing connection * with a device. It runs straight through; the connection either * succeeds or fails. */ private class ConnectThread extends Thread { private BluetoothSocket socket; private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) { mmDevice = device; BluetoothSocket tmp = null; // Get a BluetoothSocket for a connection with the // given BluetoothDevice try { tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { mkmsg("Client connection failed: "+e.getMessage().toString()+"\n"); } socket = tmp; } public void run() { mkmsg("Client running\n"); // Always cancel discovery because it will slow down a connection mBluetoothAdapter.cancelDiscovery(); // Make a connection to the BluetoothSocket try { // This is a blocking call and will only return on a // successful connection or an exception socket.connect(); } catch (IOException e) { mkmsg("Connect failed\n"); try { socket.close(); socket = null; } catch (IOException e2) { mkmsg("unable to close() socket during connection failure: "+e2.getMessage().toString()+"\n"); socket = null; } // Start the service over to restart listening mode } // If a connection was accepted if (socket != null) { mkmsg("Connection made\n"); mkmsg("Remote device address: "+socket.getRemoteDevice().getAddress().toString()+"\n"); //Note this is copied from the TCPdemo code. try { PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); mkmsg("Attempting to send message ...\n"); out.println("hello from Bluetooth Demo Client"); out.flush(); mkmsg("Message sent...\n"); mkmsg("Attempting to receive a message ...\n"); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = in.readLine(); mkmsg("received a message:\n" + str+"\n"); mkmsg("We are done, closing connection\n"); } catch(Exception e) { mkmsg("Error happened sending/receiving\n"); } finally { try { socket.close(); } catch (IOException e) { mkmsg("Unable to close socket"+e.getMessage()+"\n"); } } } else { mkmsg("Made connection, but socket is null\n"); } mkmsg("Client ending \n"); } public void cancel() { try { socket.close(); } catch (IOException e) { mkmsg( "close() of connect socket failed: "+e.getMessage().toString()+"\n"); } } } }