通信流程
1.主设备APP扫描,搜索外围智能设备
2.建立BLE蓝牙连接
3.基于BLE蓝牙连接 进行数据通信
第一步 加权限,如果是6.0以上就自己手动去申请权限
主设备Android4.3+(API Level>=18)
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
第二步 获得蓝牙adapter
BluetoothManager bluetoothManager = (BluetoothManager)this.getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBtAdapter = bluetoothManager.getAdapter();
第三步 开始扫描
// 10秒后停止查找搜索.
private static final long SCAN_PERIOD = 10000;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBtAdapter .stopLeScan(DeviceScanActivity.this.mLeScanCallback);
invalidateOptionsMenu();
}
}, SCAN_PERIOD);
mBtAdapter .startLeScan(DeviceScanActivity.this.mLeScanCallback);
扫描的结果通过这个mLeScanCallback接口回调返回
// 搜索到设备信息更新到主线程来更新UI界面
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
第三步 连接(在实际项目中开发,蓝牙各种操作都是放在service中由于篇幅有限就简写了)
BluetoothGatt mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
连接状态通过接口回调
// GATT返回值,例如连接状态和service的改变 etc
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
//连接状态改变
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
//已连接
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
//未连接
}
}
//发现服务
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
//得到该智能设备所有service循环遍历可以得到所有charactertictis
gatt.getServices();
}
//被读
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
// number += 1;
}
}
//特性改变
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
//特性书写
@Override
public void onCharacteristicWrite (BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status){
}
};