admin管理员组

文章数量:1641961

 前段时间做了一个有关于安卓蓝牙BLE设备的开发项目,主要的功能包括了搜索蓝牙ble设备和ble设备的数据读写等等,本篇博客用于记录安卓蓝牙ble设备的通信的细节。
 其实关于BLE设备的通信在API中已经讲地比较清楚了,这里只是做一个总结,如果要进行BLE设备的开发,首先可以阅读API.
BLE有关API


BLE设备的定义和特点

 BLE-维基百科
 对于BLE设备的定义,我们只需要看维基百科的说明就好了,简单的说明一下BLE的原理。
 首先对于BLE硬件来说,它能够决定什么时候去发出请求和外接的设备进行连接,安卓官方称之为advertisement,市面上见到的BLE设备,比如蓝牙音响,一打开就能够被手机检测到,原因是其硬件上设定了会一直发出advertisement,直到连接上设备为止。但是实际上BLE设备本身是可以控制自己要不要发出advertisement的,如果BLE设备没有发出这个advertisement,那么我们是搜索不到它的。
 对于BLE设备还有一个坑,那就是BLE设备只能连接一个设备,也就是说,一旦当BLE设备连接了一台手机后,其他的手机上就无法搜索到这台BLE设备了。我猜测应该是BLE设备连接之后就不会发出advertisement了,导致其他设备搜索不到。


安卓上进行BLE开发的步骤

1、AndroidManifest中声明权限

对于BLE开发我们需要声明两个权限

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

 其中第一个权限是只要我们进行与蓝牙相关的操作都需要声明的,比如你的APP只是希望能够被别人检测到,然后通过蓝牙交换数据,就需要声明这一个。
 第二个权限是如果你的设备需要主动搜索蓝牙设备,或者是对蓝牙的某些设置进行更改就需要这个权限,一般来说我们在进行BLE开发的时候会同时声明这两个权限。
 因为不是所有的手机上都有蓝牙BLE功能,需要API18(Android4.3)以上才能进行BLE的开发,所以我们可以声明features过滤掉不满足要求的设备

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
2、获取BluetoothAdapter

 BluetoothAdapter是用来获取可以连接的BLE设备列表的一个类,想要和BLE设备通信当然需要先能够搜索到可用的BLE设备。安卓获取BluetoothAdapter的实例的方式很简单。首先通过调用系统服务获得BluetoothManager的实例,然后调用BluetoothManager的getAdapter()方法就可以了,代码如下:

final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

 当然,这里的mBluetoothAdapter我们最好保存为类的数据成员,因为之后我们还会用到它去获取当前可连接的BLE设备的列表。

3、开启蓝牙

 得到了BluetoothAdapter的实例之后我们就可以用其中的方法去搜索设备了,但是在此之前,我们首先要打开手机上的蓝牙功能,这个可以通过用户自己找到蓝牙去打开,但是这样很明显会影响用户体验。没有人想在使用APP的时候还需要去找到系统的蓝牙并打开。安卓API为我们提供了在APP中开启系统蓝牙的方法:即调用BluetoothAdapter中的enable()方法。
 为了严谨,我们需要判断上一步获得的mBluetoothAdapter是否为空(只有当设备不支持BLE的时候这个实例才会为null)

public void enable() {
    if(mBluetoothAdapter == null || ! mBluetoothAdapter.isEnabled()) {
            mBluetoothAdapter.enable();
    }
}

这里我们调用了mBluetoothAdapter.isEnabled(),避免重复打开蓝牙。

4、搜索BLE设备

 打开蓝牙之后,我们终于可以搜索BLE设备了。这个部分需要注意的问题主要是搜索时间的问题,因为搜索BLE设备是一个很费电的过程,所以搜索的时间不应该设置太长。在开始搜索的同时,我们应该设置一个Handler,然后调用Handler的postDelayed(Runnable r)方法去设定在搜索一定时间后停止搜索。
 将搜索BLE设备的过程独立写成一个方法,这样如果需要多次搜索的话只需要再次调用此方法即可。另外应该设立一个标志位mScanning,在调用搜索方法的时候应该判断标志位,如果现在正在搜索就不应该再次进行搜索。

public void scanLeDevice(boolean enable) {
    if(enable) {
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
                mBLEListActivity.setTextInfo();
            }
        }, SCAN_PERIOD);
        mScanning = true;
      

本文标签: 蓝牙设备BLE