通信流程
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){
}
};