You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
6.5 KiB
Java

package com.waveshare.epaperesp32loader.communication;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
/**
* <h1>Bluetooth helper</h1>
* The class provides functions for bluetooth device
* input\output data transfer by BluetoothSocket class
*
* @author Waveshare team
* @version 1.0
* @since 8/18/2018
*/
public class BluetoothHelper
{
// This constant is used for creating bluetooth socket
//---------------------------------------------------------
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// Bluetooth
//---------------------------------------------------------
private static BluetoothAdapter btAdapter;
private static BluetoothSocket btSocket;
private static BluetoothDevice btDevice;
private static String btAddress;
public static ConnectedThread btThread;
private static Handler btHandler;
// Keys of events
//---------------------------------------------------------
public static final int BT_FATAL_ERROR = 1;
public static final int BT_STATE_IS_OFF = 2;
public static final int BT_RECEIVE_DATA = 3;
// Initialisation/restart the upload activity
//---------------------------------------------------------
public static boolean initialize(BluetoothDevice device, Handler handler)
{
btDevice = device;
btAddress = device.getAddress();
btHandler = handler;
return checkState();
}
// Initialisation bluetooth socket in its listening thread
//---------------------------------------------------------
public static boolean connect()
{
// If it is already connected
//-----------------------------------------------------
if ((btSocket != null) && (btSocket.isConnected())) return true;
// Prepare the bluetooth device for connection
//-----------------------------------------------------
if (!checkState()) return false;
BluetoothDevice device = btAdapter.getRemoteDevice(btAddress);
// Trying to create bluetooth socket
//-----------------------------------------------------
try
{
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
}
catch (IOException e)
{
btHandler.obtainMessage(BT_FATAL_ERROR);
return false;
}
// Trying to make connection by the bluetooth socket
//-----------------------------------------------------
try
{
btSocket.connect();
}
catch (IOException e)
{
close();
return false;
}
// Create and start a thread listening the socket
//-----------------------------------------------------
btThread = new ConnectedThread(btSocket, btHandler);
btThread.start();
return true;
}
// Trying to close the bluetooth socket
//---------------------------------------------------------
public static boolean close()
{
try
{
btSocket.close();
return true;
}
catch (IOException e2)
{
btHandler.obtainMessage(BT_FATAL_ERROR);
return false;
}
}
// Checks the bluetooth adapter is on
//---------------------------------------------------------
public static boolean checkState()
{
if ((btAdapter = BluetoothAdapter.getDefaultAdapter()) == null)
{
btHandler.obtainMessage(BT_FATAL_ERROR);
return false;
}
if (!btAdapter.isEnabled())
{
btHandler.obtainMessage(BT_STATE_IS_OFF);
return false;
}
return true;
}
// Thread where input\output streams of socket are handled
//---------------------------------------------------------
public static class ConnectedThread extends Thread
{
private final Handler mmHandler;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public static boolean keepConnection = false;
public ConnectedThread(BluetoothSocket socket, Handler handler)
{
mmHandler = handler;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Getting socket's streams
//-------------------------------------------------
try
{
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
tmpOut.flush();
}
catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
// Reading data from the input stream into a buffer
// and sending it to message handler
//-----------------------------------------------------
public void run()
{
byte[] buffer = new byte[256];
while (true)
{
try
{
mmHandler.obtainMessage(BluetoothHelper.BT_RECEIVE_DATA,
mmInStream.read(buffer), -1, buffer).sendToTarget();
}
catch (IOException e)
{
if (keepConnection)
{
try
{
Thread.sleep(1000);
close();
connect();
}
catch (InterruptedException internetExplorer)
{
}
}
else break;
}
}
}
// Writing of string into the output stream
//-----------------------------------------------------
public boolean write(byte[] mass, int size)
{
try
{
//mmOutStream.flush();
mmOutStream.write(mass, 0, size);
return true;
}
catch (IOException e)
{
return false;
}
}
}
}