BLE蓝牙在Android开发中的应用(二)

本节主要总结了一下。我个人在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的基本操作!后续再有其他心得再写,经验不足,欢迎广大朋友交流、批评指正!^_^

你可能感兴趣的:(Android开发,蓝牙)