package com.wbs.cordova.ble;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class Peripheral {
// Debugging
private static final String TAG = "Peripheral";
private static final boolean D = true;
// Name for the SDP record when creating server socket
private static final String NAME_SECURE = "PhoneGapBluetoothSerialServiceSecure";
private static final String NAME_INSECURE = "PhoneGapBluetoothSerialServiceInSecure";
// Unique UUID for this application
private static final UUID MY_UUID_SECURE = UUID.fromString("7A9C3B55-78D0-44A7-A94E-A93E3FE118CE");
private static final UUID MY_UUID_INSECURE = UUID.fromString("23F18142-B389-4772-93BD-52BDBB2C03E9");
// Well known SPP UUID
private static final UUID UUID_SPP = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
// Member fields
private final BluetoothAdapter mAdapter;
private AcceptThread mSecureAcceptThread;
private AcceptThread mInsecureAcceptThread;
private ConnectThread mConnectThread;
private ConnectedThread mConnectedThread;
private int mState;
// Constants that indicate the current connection state
public static final int STATE_NONE = 0; // we're doing nothing
public static final int STATE_LISTEN = 1; // now listening for incoming connections
public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
public static final int STATE_CONNECTED = 3; // now connected to a remote device
public static final int MESSAGE_STATE_CHANGE = 1;
public static final int MESSAGE_READ = 2;
public static final int MESSAGE_WRITE = 3;
public static final int MESSAGE_DEVICE_NAME = 4;
public static final int MESSAGE_TOAST = 5;
public static final int MESSAGE_READ_RAW = 6;
private CallbackContext connectCallback;
private CallbackContext dataAvailableCallback;
private CallbackContext rawDataAvailableCallback;
public static final String DEVICE_NAME = "device_name";
public static final String TOAST = "toast";
private BluetoothDevice device;
StringBuffer buffer = new StringBuffer();
private String delimiter;
public String getDelimiter() {
return delimiter;
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
public void setSubscribe(String delimiter,CallbackContext callbackContext){
this.setDelimiter(delimiter);
dataAvailableCallback = callbackContext;
}
public CallbackContext getConnectCallback() {
return connectCallback;
}
public void setConnectCallback(CallbackContext connectCallback) {
this.connectCallback = connectCallback;
}
public CallbackContext getDataAvailableCallback() {
return dataAvailableCallback;
}
public void setDataAvailableCallback(CallbackContext dataAvailableCallback) {
this.dataAvailableCallback = dataAvailableCallback;
}
/**
* Constructor. Prepares a new BluetoothSerial session.
* @param handler A Handler to send messages back to the UI Activity
*/
public Peripheral(BluetoothDevice device) {
mAdapter = BluetoothAdapter.getDefaultAdapter();
mState = STATE_NONE;
}
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_READ:
buffer.append((String) msg.obj);
if (dataAvailableCallback != null) {
sendDataToSubscriber();
}
break;
case MESSAGE_READ_RAW:
if (rawDataAvailableCallback != null) {
byte[] bytes = (byte[]) msg.obj;
sendRawDataToSubscriber(bytes);
}
break;
case MESSAGE_STATE_CHANGE:
if (D)
Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
switch (msg.arg1) {
case Peripheral.STATE_CONNECTED:
Log.i(TAG, "BluetoothSerialService.STATE_CONNECTED");
notifyConnectionSuccess();
break;
case Peripheral.STATE_CONNECTING:
Log.i(TAG, "BluetoothSerialService.STATE_CONNECTING");
break;
case Peripheral.STATE_LISTEN:
Log.i(TAG, "BluetoothSerialService.STATE_LISTEN");
break;
case Peripheral.STATE_NONE:
Log.i(TAG, "BluetoothSerialService.STATE_NONE");
break;
}
break;
case MESSAGE_WRITE:
// byte[] writeBuf = (byte[]) msg.obj;
// String writeMessage = new String(writeBuf);
// Log.i(TAG, "Wrote: " + writeMessage);
break;
case MESSAGE_DEVICE_NAME:
Log.i(TAG, msg.getData().getString(DEVICE_NAME));
break;
case MESSAGE_TOAST:
String message = msg.getData().getString(TOAST);
notifyConnectionLost(message);
break;
}
}
};
/**
* Set the current state of the chat connection
* @param state An integer defining the current connection state
*/
private synchronized void setState(int state) {
if (D) Log.d(TAG, "setState() " + mState + " -> " + state);
mState = state;
// Give the new state to the Handler so the UI Activity can update
mHandler.obtainMessage(Peripheral.MESSAGE_STATE_CHANGE, state, -1).sendToTarget();
}
/**
* Return the current connection state. */
public synchronized int getState() {
return mState;
}
/**
* Start the chat service. Specifically start AcceptThread to begin a
* session in listening (server) mode. Called by the Activity onResume() */
public synchronized void start() {
if (D) Log.d(TAG, "start");
// Cancel any thread attempting to make a connection
if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
setState(STATE_NONE);
// Listen isn't working with Arduino. Ignore since assuming the phone will initiate the connection.
// setState(STATE_LISTEN);
//
// // Start the thread to listen on a BluetoothServerSocket
// if (mSecureAcceptThread == null) {
// mSecureAcceptThread = new AcceptThread(true);
// mSecureAcceptThread.start();
// }
// if (mInsecureAcceptThread == null) {
// mInsecureAcceptThread = new AcceptThread(false);
// mInsecureAcceptThread.start();
// }
}
/**
* Start the ConnectThread to initiate a connection to a remote device.
* @param device The BluetoothDevice to connect
* @param secure Socket Security type - Secure (true) , Insecure (false)
*/
public synchronized void connect(BluetoothDevice device, boolean secure,CallbackContext callbackContext) {
if (D) Log.d(TAG, "connect to: " + device);
connectCallback = callbackContext;
// Cancel any thread attempting to make a connection
if (mState == STATE_CONNECTING) {
if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
// Start the thread to connect with the given device
mConnectThread = new ConnectThread(device, secure);
mConnectThread.start();
setState(STATE_CONNECTING);
}
/
- 1
- 2
前往页