一、基本介绍
BLE全称Bluetooth Low Energy即低功耗蓝牙。
Android 4.3(API Level 18)开始引入核心功能并提供了相应的 API, 应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。
Android BLE 使用的蓝牙协议是 GATT 协议,有关该协议的详细内容可以参见官方文档。
Service
一个低功耗蓝牙设备可以定义许多 Service, Service 可以理解为一个功能的集合。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。所有的蓝牙技术联盟定义UUID共用了一个基本的UUID: 0x0000xxxx-0000-1000-8000-00805F9B34FB 为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为: 0x00002A37-0000-1000-8000-00805F9B34FB
Characteristic
在 Service 下面,又包括了许多的独立数据项,我们把这些独立的数据项称作 Characteristic。同样的,每一个 Characteristic 也有一个唯一的 UUID 作为标识符。在 Android 开发中,建立蓝牙连接后,我们说的通过蓝牙发送数据给外围设备就是往这些 Characteristic 中的 Value 字段写入数据;外围设备发送数据给手机就是监听这些 Charateristic 中的 Value 字段有没有变化,如果发生了变化,手机的 BLE API 就会收到一个监听的回调。
Android BLE API 简介
BluetoothAdapter BluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。
BluetoothDevice 代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。
BluetoothGatt 这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。
BluetoothGattService 这一个类通过 BluetoothGatt#getService 获得,如果当前服务不可见那么将返回一个 null。这一个类对应上面说过的 Service。我们可以通过这个类的 getCharacteristic(UUID uuid) 进一步获取 Characteristic 实现蓝牙数据的双向传输。
BluetoothGattCharacteristic 这个类对应上面提到的 Characteristic。通过这个类定义需要往外围设备写入的数据和读取外围设备发送过来的数据。
二、开始使用
1.声明权限,在AndroidManifest.xml里面声明:
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>在API21(Android5.0)之后还需要加:
<uses-feature android:name="android.hardware.location.gps" />在Android6.0以后还需要加:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>好了,权限声明完成就到了我们的代码环节
2.初始化BluetoothAdapter
private BluetoothAdapter mAdapter; BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mAdapter = bluetoothManager.getAdapter();
3.如果蓝牙没有打开先打开蓝牙
if (mAdapter == null || !mAdapter.isEnabled()) { // 弹对话框的形式提示用户开启蓝牙 startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1); }
4.扫描设备
扫描设备有两种,一种是过滤特别的服务扫描,一种是全部扫描
下面代码演示全部扫描
mAdapter.startLeScan(mLeScanCallback); // 开始扫描
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {停止扫描Log.i("扫描到",device.getName()+"rssi"+rssi);}};
mAdapter.stopLeScan(mLeScanCallback); // 停止扫描
5.连接GATT服务端
连接蓝牙设备可以通过 BluetoothDevice#ConnectGatt 方法连接,也可以通过 BluetoothGatt#connect 方法进行重新连接。以下分别是两个方法的官方说明:
BluetoothDevice#connectGatt
BluetoothGatt connectGatt(Context context, boolean autoConnec