package com.moral.yunfushao.ble;
|
|
|
import android.app.Service;
|
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattService;
|
import android.content.Intent;
|
import android.os.Binder;
|
import android.os.Handler;
|
import android.os.IBinder;
|
import android.os.Looper;
|
|
import com.clj.fastble.BleManager;
|
import com.clj.fastble.conn.BleCharacterCallback;
|
import com.clj.fastble.conn.BleGattCallback;
|
import com.clj.fastble.conn.BleRssiCallback;
|
import com.clj.fastble.data.ScanResult;
|
import com.clj.fastble.exception.BleException;
|
import com.clj.fastble.scan.ListScanCallback;
|
import com.clj.fastble.utils.HexUtil;
|
import com.moral.yunfushao.MainApp;
|
|
public class BluetoothService extends Service {
|
|
public BluetoothBinder mBinder = new BluetoothBinder();
|
private BleManager bleManager;
|
private Handler threadHandler = new Handler(Looper.getMainLooper());
|
private Callback mCallback = null;
|
private Callback2 mCallback2 = null;
|
|
private String name;
|
private String mac;
|
private BluetoothGatt gatt;
|
private BluetoothGattService service;
|
private BluetoothGattCharacteristic characteristic;
|
private BluetoothGattCharacteristic wirteCharacteristic;
|
private int charaProp;
|
|
@Override
|
public void onCreate() {
|
if (MainApp.theApp.bleManager != null) {
|
bleManager = MainApp.theApp.bleManager;
|
} else {
|
bleManager = new BleManager(MainApp.theApp);
|
MainApp.theApp.bleManager = bleManager;
|
}
|
bleManager.setMtu(128);//给外部接口设置数据传输大小
|
bleManager.enableBluetooth();
|
}
|
|
@Override
|
public void onDestroy() {
|
super.onDestroy();
|
bleManager = null;
|
mCallback = null;
|
mCallback2 = null;
|
}
|
|
@Override
|
public IBinder onBind(Intent intent) {
|
return mBinder;
|
}
|
|
@Override
|
public boolean onUnbind(Intent intent) {
|
bleManager.closeBluetoothGatt();
|
return super.onUnbind(intent);
|
}
|
|
public class BluetoothBinder extends Binder {
|
public BluetoothService getService() {
|
return BluetoothService.this;
|
}
|
}
|
|
public void setScanCallback(Callback callback) {
|
mCallback = callback;
|
}
|
|
public void setConnectCallback(Callback2 callback) {
|
mCallback2 = callback;
|
}
|
|
public interface Callback {
|
|
void onStartScan();
|
|
void onScanning(ScanResult scanResult);
|
|
void onScanComplete();
|
|
void onConnecting();
|
|
void onConnectFail();
|
|
void onDisConnected();
|
|
void onServicesDiscovered();
|
}
|
|
public interface Callback2 {
|
|
void onDisConnected();
|
}
|
|
public void scanDevice() {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
boolean b = bleManager.scanDevice(new ListScanCallback(5000) {
|
|
@Override
|
public void onScanning(final ScanResult result) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanning(result);
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onScanComplete(final ScanResult[] results) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
}
|
});
|
if (!b) {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
}
|
|
public void cancelScan() {
|
if (bleManager != null)
|
bleManager.cancelScan();
|
}
|
|
public void connectDevice(final ScanResult scanResult) {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
|
System.out.println("chenqi blename old = "+ MainApp.theApp.sharedPreferencesUtil.getBLE());
|
|
System.out.println("chenqi blename = "+ scanResult.getDevice().getAddress());
|
|
openBlueTooth();
|
|
bleManager.connectDevice(scanResult, false, new BleGattCallback() {
|
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
System.out.println("chenqi blueTooth connect state -> onFoundDevice");
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
System.out.println("chenqi blueTooth connect state -> onConnecting");
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
System.out.println("chenqi blueTooth connect state -> onConnectError");
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
System.out.println("chenqi blueTooth connect state -> onConnectSuccess");
|
//保存最近连接的蓝牙设备MAC
|
MainApp.theApp.sharedPreferencesUtil.saveBLE(gatt.getDevice().getAddress());
|
}
|
|
@Override
|
public void onServicesDiscovered(final BluetoothGatt gatt, int status) {
|
System.out.println("chenqi blueTooth connect state -> onServicesDiscovered");
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
System.out.println("chenqi blueTooth connect state -> onDisConnected");
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
|
});
|
}
|
|
public void scanAndConnect1(String name) {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
bleManager.scanNameAndConnect(name, 5000, false, new BleGattCallback() {
|
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
});
|
}
|
|
public void scanAndConnect2(String name) {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
bleManager.scanfuzzyNameAndConnect(name, 5000, false, new BleGattCallback() {
|
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
});
|
}
|
|
public void scanAndConnect3(String[] names) {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
bleManager.scanNamesAndConnect(names, 5000, false, new BleGattCallback() {
|
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
});
|
|
}
|
|
public void scanAndConnect4(String[] names) {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
bleManager.scanfuzzyNamesAndConnect(names, 5000, false, new BleGattCallback() {
|
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
});
|
}
|
|
public void scanAndConnect5(String mac) {
|
resetInfo();
|
|
if (mCallback != null) {
|
mCallback.onStartScan();
|
}
|
|
openBlueTooth();
|
|
bleManager.scanMacAndConnect(mac, 5000, false, new BleGattCallback() {
|
@Override
|
public void onFoundDevice(ScanResult scanResult) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onScanComplete();
|
}
|
}
|
});
|
BluetoothService.this.name = scanResult.getDevice().getName();
|
BluetoothService.this.mac = scanResult.getDevice().getAddress();
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnecting();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnecting(BluetoothGatt gatt, int status) {
|
}
|
|
@Override
|
public void onConnectError(BleException exception) {
|
System.out.println("chenqi chenqi" + exception.getDescription()) ;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onConnectFail();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onConnectSuccess(BluetoothGatt gatt, int status) {
|
}
|
|
@Override
|
public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onDisConnected();
|
}
|
if (mCallback2 != null) {
|
mCallback2.onDisConnected();
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
|
BluetoothService.this.gatt = gatt;
|
runOnMainThread(new Runnable() {
|
@Override
|
public void run() {
|
if (mCallback != null) {
|
mCallback.onServicesDiscovered();
|
}
|
}
|
});
|
}
|
|
});
|
}
|
|
public boolean read(String uuid_service, String uuid_read, BleCharacterCallback callback) {
|
return bleManager.readDevice(uuid_service, uuid_read, callback);
|
}
|
|
public boolean write(String uuid_service, String uuid_write, String hex, BleCharacterCallback callback) {
|
return bleManager.writeDevice(uuid_service, uuid_write, HexUtil.hexStringToBytes(hex), callback);
|
}
|
|
public boolean notify(String uuid_service, String uuid_notify, BleCharacterCallback callback) {
|
return bleManager.notify(uuid_service, uuid_notify, callback);
|
}
|
|
public boolean indicate(String uuid_service, String uuid_indicate, BleCharacterCallback callback) {
|
return bleManager.indicate(uuid_service, uuid_indicate, callback);
|
}
|
|
public boolean stopNotify(String uuid_service, String uuid_notify) {
|
return bleManager.stopNotify(uuid_service, uuid_notify);
|
}
|
|
public boolean stopIndicate(String uuid_service, String uuid_indicate) {
|
return bleManager.stopIndicate(uuid_service, uuid_indicate);
|
}
|
|
public boolean readRssi(BleRssiCallback callback) {
|
return bleManager.readRssi(callback);
|
}
|
|
public void closeConnect() {
|
bleManager.closeBluetoothGatt();
|
}
|
|
|
private void resetInfo() {
|
name = null;
|
mac = null;
|
gatt = null;
|
service = null;
|
characteristic = null;
|
wirteCharacteristic = null;
|
charaProp = 0;
|
}
|
|
public String getName() {
|
return name;
|
}
|
|
public String getMac() {
|
return mac;
|
}
|
|
public BluetoothGatt getGatt() {
|
return gatt;
|
}
|
|
public void setService(BluetoothGattService service) {
|
this.service = service;
|
}
|
|
public BluetoothGattService getService() {
|
return service;
|
}
|
|
public void setCharacteristic(BluetoothGattCharacteristic characteristic) {
|
this.characteristic = characteristic;
|
}
|
|
public BluetoothGattCharacteristic getCharacteristic() {
|
return characteristic;
|
}
|
|
public BluetoothGattCharacteristic getWirteCharacteristic() {
|
return wirteCharacteristic;
|
}
|
|
public void setWirteCharacteristic(BluetoothGattCharacteristic wirteCharacteristic) {
|
this.wirteCharacteristic = wirteCharacteristic;
|
}
|
|
public void setCharaProp(int charaProp) {
|
this.charaProp = charaProp;
|
}
|
|
public int getCharaProp() {
|
return charaProp;
|
}
|
|
|
private void runOnMainThread(Runnable runnable) {
|
if (Looper.myLooper() == Looper.getMainLooper()) {
|
runnable.run();
|
} else {
|
threadHandler.post(runnable);
|
}
|
}
|
|
public void openBlueTooth() {
|
if (bleManager != null) {
|
bleManager.enableBluetooth();
|
}
|
}
|
}
|