项目需求:app和蓝牙通讯,并且能接收到硬件按键通过蓝牙发送来的消息,app做对应操作,有点类似于蓝牙耳机接听,挂断。
蓝牙开发以前接触的少,经典蓝牙开发做过android bt,BLE做的少,所以一直不太懂,最近项目又用到BLE蓝牙,所以把项目的一些代码简单整理下,主要是蓝牙连接,读写数据,蓝牙消息监听。蓝牙搜索的代码我这里就不写了,大家可以自己百度下。
为了能监测到app和蓝牙一直连接,并且连接正常,代码中用了一直往蓝牙写数据作为心跳来判断连接是否正常,大概逻辑是:
连接connectGatt–>连接成功onConnectionStateChange–>搜索服务discoverServices–>搜索服务成功回调onServicesDiscovered–>读数据readCharacteristic–>读数据回调onCharacteristicRead–>写入数据writeCharacteristic(开一个线程定时10秒去写一次数据,一直写,写入失败说明蓝牙断开或异常)
官方API:
BLE
//根据蓝牙mac地址获取writeCharacteristic
BluetoothDevice bluetoothDevice =BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress);
蓝牙连接
mBluetoothGatt = mDevice.connectGatt(mContext, false, new BluetoothGattCallback() {
/**
* 蓝牙连接状态回调
* @param gatt
* @param status
* @param newState
*/
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (status == BluetoothGatt.GATT_SUCCESS) {
//获取GATT服务成功
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.e(TAG, "蓝牙连接功...status=STATE_CONNECTED"+gatt.getDevice().getName())
// 连接成功,开始搜索服务,一定要调用此方法,否则获取不到服务
mBluetoothGatt.discoverServices();
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.e(TAG, "蓝牙连接断开...status=STATE_DISCONNECTED");
}
} else { //断开重连
Log.e(TAG, "蓝牙连接断开...status=" + status );
}
}
/**
* 当远程设备的远程服务、特性和描述符列表已被更新时调用,即已发现新服务。
* @param gatt
* @param status
*/