首页 > 代码库 > 蓝牙4.0 BLE

蓝牙4.0 BLE

蓝牙4.0 BLE 入门

1. 手机需要android 4.3 及以上版本

2. 权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

只允许支持BLE 的手机安装还需要添加uses-feature

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

3. BLE 设备扫描

3.1 获取蓝牙适配器:  mBluetoothAdapter = bluetoothManager.getAdapter();  

3.2 开始扫描: mBluetoothAdapter.startLeScan(mLeScanCallback);

在调用扫描时, 需要实现LeScanCallback 回调接口, 用于扫描结果的返回: 

protected LeScanCallback mLeScanCallback = new  BluetoothAdapter.LeScanCallback() {

		@Override
		public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
			Log.d(TAG, "find device -> "+ device.getName()+"mac:"+device.getAddress());
			runOnUiThread(new Runnable() {
				public void run() {
					String mac = device.getAddress();
					String name = device.getName();
//					deviceAdapter.addDevice(new BluetoothItem(name, mac));
					deviceAdapter.addDevice(new BluetoothItem(name, mac, rssi));
					deviceAdapter.notifyDataSetChanged();
				}
			});
		}
	};
3.3 获取扫描结果后,可以通过得到的设备地址, 来对设备进行连接, 连接上将得到一个BluetoothGatt 用于操作, 其中需要实现BluetoothGattCallback 回调, 其用于结果的返回, 如连接的状态,以及后面的读写等操作

	final BluetoothDevice device = mBluetoothAdapter
				.getRemoteDevice(address);
		if (device == null) {
			Log.w(TAG, "Device not found.  Unable to connect.");
			return false;
		}
		// We want to directly connect to the device, so we are setting the
		// autoConnect
		// parameter to false.
		mBluetoothGatt = device.connectGatt(this, true, mGattCallback);
		
mGattCallback 回调函数:

	private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

		@Override
		public void onConnectionStateChange(BluetoothGatt gatt, int status,
				int newState) {
			if (newState == BluetoothProfile.STATE_CONNECTED) {
				broadcastUpdate(ACTION_GATT_CONNECTED);
				Log.i(TAG, "Connected to GATT server.");
				// Attempts to discover services after successful connection.
				Log.i(TAG, "Attempting to start service discovery:"
						+ mBluetoothGatt.discoverServices());
				isConnectd = true;
			} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
				Log.i(TAG, "Disconnected from GATT server.");
				isConnectd = false;
				broadcastUpdate(ACTION_GATT_DISCONNECTED, gatt.getDevice().getAddress());
			}
		}
		//...略
	}

3.4 在蓝牙设备中, 其包含有多个BluetoothGattService, 而每个BluetoothGattService中又包含有多个BluetoothGattCharacteristic

在连接上蓝牙后, 通过调用 mBluetoothGatt.discoverServices(), 来发现蓝牙设备中的服务, 接下来就可以获取到设备中的服务列表  mBluetoothGatt.getServices(); 或者通过uuid 来获取某一个服务 BluetoothGattService gattService = mBluetoothGatt.getService(uuid); 

服务中, 获得Characteristic 集合则调用 gattService.getCharacteristics(); 

在 Characteristic中, 可以通过 mBluetoothGatt.readCharacteristic(characteristic); 来读取其里面的数据, 其结果在mGattCallback 回调函数中获取.

写如数据: characteristic.setValue(data); 

mBluetoothGatt.wirteCharacteristic(mCurrentcharacteristic);

4. 关闭连接 mBluetoothGatt.close();