mBLEService = new BluetoothLeService(this); //区别于android的四大组件服务,相当于工具类
BLECommunicateUtils.setBLEService(mBLEService);
mBLEService.setOnServiceDiscoverListener(mOnServiceDiscover);
mBLEService.setOnDataAvailableListener(mOnDataAvailable);
mBLEService.setOnDisconnectListener(mOnDisconnectListener);
mBLEService.setOnConnectListener(mOnConnectListener);
/**
* @param enable (扫描使能,true:扫描开始,false:扫描停止)
* @return void
* @throws
* @Title: scanLeDevice
* @Description: TODO(扫描蓝牙设备)
*/
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
if (mBLEService != null) {
mBLEService.close();
}
Log.e(TAG, "扫描时间结束,停止扫描");
}
}, SCAN_PERIOD);
/* 开始扫描蓝牙设备,带mLeScanCallback 回调函数 */
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
Log.e(TAG, "开始扫描");
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
Log.e(TAG, "停止扫描");
}
}
/**
* 蓝牙扫描回调函数 实现扫描蓝牙设备,回调蓝牙BluetoothDevice,可以获取name MAC等信息
**/
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi,
byte[] scanRecord) {
if (device.getName() != null && device.getName().equals(BLUETOOTH_NAME)) {
Log.e(TAG, "扫描得到我的设备");
if (mScanning) {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
mScanning = false;
}
mBLEService.connect(device);
}
}
};
/**
* connect a remoteDevice callback
*/
private BluetoothGattCallback mGattCallBack = new BluetoothGattCallback() {
//建立连接
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
if (newState == BluetoothProfile.STATE_CONNECTED) {
mBluetoothGatt.discoverServices();
if (mOnConnectListener != null) {
mOnConnectListener.onConnect(mBluetoothGatt);
}
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
// 2016/4/25 if disconnect ,trigger mOnDisconnectListener
if (mOnDisconnectListener != null) {
mOnDisconnectListener.onDisconnect(mBluetoothGatt);
}
}
}
//发现服务
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
if (status == BluetoothGatt.GATT_SUCCESS && mOnServiceDiscoverListener != null) {
mOnServiceDiscoverListener.onServiceDiscover(gatt);
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
if (status==BluetoothGatt.GATT_SUCCESS && mOnDataAvailableListener != null) {
mOnDataAvailableListener.onCharacteristicRead(gatt, characteristic);
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
if (mOnDataAvailableListener != null) {
mOnDataAvailableListener.onCharacteristicWrite(gatt,
characteristic);
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
if (mOnDataAvailableListener != null) {
mOnDataAvailableListener.onCharacteristicWrite(gatt,
characteristic);
mOnDataAvailableListener.onCharacteristicRead(gatt,characteristic);
}
}
/*
* 读描述值
* */
@Override
public void onDescriptorRead(BluetoothGatt gatt,
BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorRead(gatt, descriptor, status);
}
/*
* 写描述值
* */
@Override
public void onDescriptorWrite(BluetoothGatt gatt,
BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);
}
@Override
public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
super.onReliableWriteCompleted(gatt, status);
}
@Override
public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
super.onReadRemoteRssi(gatt, rssi, status);
}
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
}
};
/**
* get the supported characteristics , maybe need to change
*
* @param gattServices gattServices
*/
private void displayGattServices(List gattServices) {
if (gattServices == null) {
return;
}
for (BluetoothGattService gattService : gattServices) {
List gattCharacteristics = gattService.getCharacteristics();
for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
if (gattCharacteristic.getUuid().toString().equals(HEART_RATE_MEASUREMENT)) {
// 接受Characteristic被写的通知,收到蓝牙模块的数据后会触发mOnDataAvailable.onCharacteristicWrite()
mBLEService.setCharacteristicNotification(
gattCharacteristic, true);
}
gattCharacteristic_charA = gattCharacteristic;
}
}
BLECommunicateUtils.sendData(gattCharacteristic_charA, StringUtils.
hexStringToBytes("***************指令代码*****************"));
}
需要设置
// 接受Characteristic被写的通知,收到蓝牙模块的数据后会触发mOnDataAvailable.onCharacteristicWrite()
mBLEService.setCharacteristicNotification(
gattCharacteristic, true);
在连接蓝牙 的onCharacteristicChanged回调中处理接收的数据
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
Log.e(TAG, "收到了数据" + characteristic.toString());
//断开连接
if (mBLEService != null) {
mBLEService.close();
}
Log.e(TAG, "断开连接");
}
6.注意事项:
/**
* close the BluetoothGatt
*/
public void close() {
if (mBluetoothGatt == null) {
return;
}
mBluetoothGatt.close();
// mBluetoothGatt = null; 要设置不要置为null因为安卓mBluetoothGatt有一个限制,连接几次后发现连不上的情况.
}
7.Demo参考:
http://download.csdn.net/detail/github_34224676/9793523
Github传送门:
https://github.com/IOXusu/Android-BLE-Demo