package org.droidplanner.services.android.impl.communication.connection;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Bundle;
import android.os.ParcelUuid;
import android.util.Log;
import org.droidplanner.services.android.impl.core.MAVLink.connection.MavLinkConnectionTypes;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.util.Set;
import java.util.UUID;
public class BluetoothConnection extends AndroidMavLinkConnection {
private static final String BLUE = "BLUETOOTH";
private static final String UUID_SPP_DEVICE = "00001101-0000-1000-8000-00805F9B34FB";
private BluetoothAdapter mBluetoothAdapter;
private OutputStream out;
private InputStream in;
private BluetoothSocket bluetoothSocket;
private final String bluetoothAddress;
public BluetoothConnection(Context parentContext, String btAddress) {
super(parentContext);
this.bluetoothAddress = btAddress;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Log.d(BLUE, "Null adapters");
}
}
@Override
protected void openConnection(Bundle connectionExtras) throws IOException {
Log.d(BLUE, "Connect");
// Reset the bluetooth connection
resetConnection();
// Retrieve the stored device
BluetoothDevice device = null;
try {
device = mBluetoothAdapter.getRemoteDevice(bluetoothAddress);
} catch (IllegalArgumentException ex) {
// invalid configuration (device may have been removed)
// NOP fall through to 'no device'
}
// no device
if (device == null) {
device = findSerialBluetoothBoard();
}
Log.d(BLUE, "Trying to connect to device with address " + device.getAddress());
Log.d(BLUE, "BT Create Socket Call...");
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(UUID
.fromString(UUID_SPP_DEVICE));
Log.d(BLUE, "BT Cancel Discovery Call...");
mBluetoothAdapter.cancelDiscovery();
Log.d(BLUE, "BT Connect Call...");
bluetoothSocket.connect(); // Here the IOException will rise on BT
// protocol/handshake error.
Log.d(BLUE, "## BT Connected ##");
out = bluetoothSocket.getOutputStream();
in = bluetoothSocket.getInputStream();
onConnectionOpened(connectionExtras);
}
@SuppressLint("NewApi")
private BluetoothDevice findSerialBluetoothBoard() throws UnknownHostException {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
Log.d(BLUE, device.getName() + " #" + device.getAddress() + "#");
final ParcelUuid[] deviceUuids = device.getUuids();
if (deviceUuids != null && deviceUuids.length > 0) {
for (ParcelUuid id : device.getUuids()) {
Log.d(BLUE, "id:" + id.toString());
if (id.toString().equalsIgnoreCase(UUID_SPP_DEVICE)) {
Log.d(BLUE,
">> Selected: " + device.getName() + " Using: " + id.toString());
return device;
}
}
}
}
}
throw new UnknownHostException("No Bluetooth Device found");
}
@Override
protected int readDataBlock(byte[] buffer) throws IOException {
return in.read(buffer);
}
@Override
protected void sendBuffer(byte[] buffer) throws IOException {
if (out != null) {
out.write(buffer);
}
}
@Override
public int getConnectionType() {
return MavLinkConnectionTypes.MAVLINK_CONNECTION_BLUETOOTH;
}
@Override
protected void closeConnection() throws IOException {
resetConnection();
Log.d(BLUE, "## BT Closed ##");
}
private void resetConnection() throws IOException {
if (in != null) {
in.close();
in = null;
}
if (out != null) {
out.close();
out = null;
}
if (bluetoothSocket != null) {
bluetoothSocket.close();
bluetoothSocket = null;
}
}
@Override
protected void loadPreferences() {
}
}