本节主要总结了一下。我个人在BLE蓝牙开发过程中的使用心得。
一、BLE蓝牙的若干关键对象及其使用。
1.蓝牙相关的对象:BluetoothManager、BluetoothAdapter、BluetoothGatt、BluetoothGattCallback;
首先有几个小概念,然后一个一个来说~~~
1.1 几个小概念啦~
1>Generic Attribute Profile(通用特性配置文件):是在BLE蓝牙连接过程中,属性类型的原子数据通用的形式。我的理解是,BLE蓝牙收发的是
这种配置文件(就像网络传输时用的是超文本文件,蓝牙用的时特性配置文件)。要拿到其中的数据,解析这个文件就好了。当然我们无需手动解析。
2>Attribute Protocol(特性协议):通用特性配置文件传输过程所遵循的一种协议。这种协议具有传输的数据简单、数据量小、每个属性都
具有唯一的UUID与之对应。其中这些属性是以Service或者Characteristic的形式传输。
3>Service(服务):Characteristic的集合,一个Service中包含多个Characteristic
4>Characteristic(特征):承载蓝牙数据的最小载体。或者理解为盛放原子数据的容器。
1.2BluetoothManager、BluetoothAdapter、BluetoothGatt、BluetoothGattCallback的说明。
1>BluetoothManager :
Google官方解释是:这是一个高级的管理器,内置了一个BluetoothAdapter实例,能够进行所有有关蓝牙的管理。(High level manager
used to obtain an instance of an BluetoothAdapter and to conduct overall Bluetooth Management.)
创建方法:getSystemService(...):
BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2>BluetoothAdapter :
Google官方解释是:它表示本地的蓝牙设备适配器。这个BluetoothAdapter可以执行一些基本的蓝牙任务。例如,首次蓝牙设备发现;
查询已经绑定的(或者说配对的)蓝牙设备;通过已知的MAC地址实例化一个蓝牙设备(BluetoothDevice);创建一个
BluetoothServerSocket来监听来自其他蓝牙设备的请求;开始扫描低能耗蓝牙设备。
静态方法getDefaultAdapter()
mBluetoothAdapter = mBluetoothManager.getAdapter();
3>BluetoothGatt :
Google官方解释是:本类的功能是提供Bluetooth GATT泛函来激活智能蓝牙设备之间的数据交流
使用BluetoothDevice的实例方法connectGatt(context, boolean, BluetoothGattCallback)获得对象的实例
case MSG_DEVICE_CONNECT:
//TODO 建立连接
BluetoothDevice mDeviceHaveChoose = (BluetoothDevice) msg.obj;
mBluetoothGatt = mDeviceHaveChoose.connectGatt(BluetoothLeService.this, false, callback);
mConnected = mBluetoothGatt.connect();
String MAC = mDeviceHaveChoose.getAddress();
String name = mDeviceHaveChoose.getName();
if(mConnected){
Toast.makeText(this, "已经与BLE设备:"+MAC+"建立连接!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.putExtra("ble_address", MAC);
intent.putExtra("ble_name", name);
intent.setAction(Constants.ACTION_STOREINFO_BLUETOOTH);
sendBroadcast(intent);
} else {
Toast.makeText(this, "连接失败-_-|||,请重试~", Toast.LENGTH_SHORT).show();
}
break;
4>BluetoothGattCallback :
Google官方解释是:此类是一个抽象类。创建此类的实例必须继承此抽象类,重写其中的若干方法。智能蓝牙设备之间建立连接之后,
会回调此类中被重写的方法。包括的常用的重要方法有:onCharacteristicChanged、onCharacteristicRead、onCharacteristicWrite、
onConnectionStateChange 、onDescriptorRead 、onDescriptorWrite、onReadRemoteRssi 、onReliableWriteCompleted、onServicesDiscovered。
二、蓝牙关键类中的常用方法的使用
1.BluetoothManager中的常用方法:
1>getAdapter() 返回BluetoothAdapter;用来获得本机默认的蓝牙适配器
2>getConnectedDevices(int profile) 返回一个已经配对的蓝牙设备列表List<BluetoothDevice>
3>getConnectionState(BluetoothDevice device, int profile) 获得与指定远程蓝牙设备的连接状态
4>getDevicesMatchingConnectionStates(int profile, int[] states) 获得一个蓝牙设备列表,不论蓝牙的连接状态
5>openGattServer(Context context, BluetoothGattServerCallback callback)
开启一个蓝牙GATT服务。此处BluetoothGattServerCallback的回调是用来传递结果给调用者的, 例如连接状态和GATT服务的其他任何操作的结果。
2.BluetoothAdapter中的常用方法:
1>getDefaultAdapter() 获得本机默认的蓝牙适配器,这个方法是一个静态同步方法。
2>getName() 获得本机蓝牙适配器的名称
3>getAddress() 获得本机蓝牙设备的MAC地址
4>enable() 启动蓝牙适配器,注意:不要使用未经用户手动许可的开启蓝牙方式 (It's important!)
5>disable() 关闭蓝牙适配器,注意:同上。
6>startLeScan(BluetoothAdapter.LeScanCallback callback)开始扫描Bluetooth LE设备 (很有用哦!*^_^*)
7>stopLeScan(BluetoothAdapter.LeScanCallback callback)停止扫描Bluetooth LE设备
8>getRemoteDevice(String address)根据已有的蓝牙MAC地址获得远程蓝牙设备 (卧槽,这个好$_$)
9>还有isEnabled()、isDiscovering()、getState()、getScanMode()、startDiscovery()、cancelDiscovery()等方法。
3.BluetoothGatt中的常用方法:
1>connect() 通过BluetoothDevice的实例方法connectGatt获得了BluetoothGatt实例后,使用获得的实例此方法执行蓝牙连接。
2>disconnect() 顾名思义,这个方法是用来断开连接的咯~
3>discoverServices() 发现已连接的蓝牙设备中的服务
4>getService(UUID uuid) 根据UUID获得Service,由于每一个Service、Characteristic都有唯一的UUID,此方法可以精确的找到需要的Service。
5>getServices() 获得已连接设备中所有的Service
6>readCharacteristic/writeCharacteristic(BluetoothGattCharacteristic characteristic) 读写特征
7>readDescriptor/writeDescriptor(BluetoothGattDescriptor descriptor) 读写描述器
8>readRemoteRssi() 获得与远程蓝牙设备的连接信号强度
9>executeReliableWrite() 对指定的远程设备进行可靠的写操作 --->有门道!!!
10>getConnectedDevices()、getDevice()、getConnectedDevices() 等方法
4.BluetoothGattCallback中的常用方法:
1>onServicesDiscovered(BluetoothGatt gatt, int status) 发现服务
2>onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 连接状态改变
3>onCharacteristicRead/onCharacteristicWrite/onCharacteristicChanged 特征的读写以及改变
4>onDescriptorRead/onDescriptorWrite 描述器的读写
5>onReadRemoteRssi 此方法是为了读取远程设备的连接强度
6>onReliableWriteCompleted 此方法与第3点 9>小点有关 是在执行了可靠写操作后的动作。可靠些操作通常是改变了Characteristic中的值。
三、使用案例:
1、扫描周边的蓝牙设备、超时停止扫描
@SuppressWarnings("deprecation")
private void scanLeDevice(final boolean enable){
if(enable){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mBluetoothAdapter
.stopLeScan(BluetoothLeService.this);
Log.d("TEST", "超过两分钟自动停止扫描");
}
}, Constants.SCAN_PERIOD);
mBluetoothAdapter.startLeScan(this);
}else{
mBluetoothAdapter.stopLeScan(this);
}
}
/*需要是BluetoothLeService实现android.bluetooth.BluetoothAdapter.LeScanCallback接口,重写onLeScan方法。*/
2、与指定的蓝牙设备建立连接。
//TODO 建立连接
BluetoothDevice mDeviceHaveChoose = (BluetoothDevice) msg.obj;
BluetoothGatt mBluetoothGatt = mDeviceHaveChoose.connectGatt(BluetoothLeService.this, false, callback);
boolean mConnected = mBluetoothGatt.connect();
3、与已连接的蓝夜设备进行数据传输。
private BluetoothGattCallback callback = new BluetoothGattCallback() {
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
Log.d("TEST", "onServicesDiscovered");
//连接远程GATT服务器成功时
if (status == BluetoothGatt.GATT_SUCCESS) {
mListOfBTService = gatt.getServices();
//遍历这些服务
for (int i = 0; i < mListOfBTService.size(); i++) {
BluetoothGattService theService = mListOfBTService.get(i);
mListOfBTCharac = theService.getCharacteristics();
for (int j = 0; j < mListOfBTCharac.size(); j++) {
//TODO 遍历这些特征
}
//实现业务逻辑
}
}
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
//何时执行连接状态改变的方法
Log.i("TEST", "onConnectionStateChange");
switch (newState) {
//建立连接
case BluetoothProfile.STATE_CONNECTED:
//TODO
break;
//case ...
default:
break;
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.i("TEST", "onCharacteristicRead");
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.d("TEST", "onCharacteristicWrite");
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic){
Log.d("TEST", "onCharacteristicChanged");
}
@Override
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
Log.d("TEST", "onDescriptorRead");
}
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
Log.d("TEST", "onDescriptorWrite");
}
};
好啦,这些就是BluetoothLe的基本操作!后续再有其他心得再写,经验不足,欢迎广大朋友交流、批评指正!^_^