Android - BlueTooth BLE 开篇

来源:互联网 发布:淘宝购物车营销过期 编辑:程序博客网 时间:2024/05/01 08:14

一. BLE

  1. 认识BLE

    BLE 是Bluetooth Low Energy 的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。

  2. 认识单双模

    BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。

  3. 单双模用途

    双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。这可以解释手机上的BLE与手环等设备上的BLE的区别。

  4. 支持

    不是所有手机都支持BLE,因为BLE不仅仅依靠软件实现,同时需要硬件支持,于是有很多手机不能联接智能手环等设备。Android4.3手机上安装的是双模BR,因此兼容蓝牙3.0之前的技术,既能与BLE设备通信,也能与传统蓝牙通信,比较耗电,能够像传统设备一样高速传输。大部分智能手环使用的单工BLE,不支持传统蓝牙,不能与之联结和通信,低功耗低速率设备。

https://www.bluetooth.com/
https://developer.android.google.cn/guide/topics/connectivity/bluetooth-le.html


二. BLE 特征与传输概念

  1. 特征
    BLE(Bluetooth Low Energy),蓝牙4.0核心profile,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输,缺点:数据传输速率低,由于其具有低功耗特点,所以经常用在可穿戴设备之中。

  2. 数据传输
    (1)Generic Attribute Profile (GATT)
    通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。

    (2)Attribute Protocol (ATT)
    GATT是基于ATT Protocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。

    (3)Characteristic
    Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。

    (4)Descriptor
    对Characteristic的描述,例如范围、计量单位等。

    (5)Service
    Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart rate measurement”的Characteristic。

  3. 图说关系

    如下图所示,一个Service包含一个或多个Characteristic ; 一个Characteristic包含一个或多个Descriptor ;

    这里写图片描述

  4. 中心设备和外围设备(Central vs. peripheral)

    中心设备和外围设备的概念针对的是BLE连接本身。相关内容移步:

    Android - BlueTooth BLE 之 Central 与 Peripheral 理解

  5. GATT server vs. GATT client:

    这两种角色取决于BLE连接成功后,两个设备间通信的方式。例如:当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况;哪一方发送数据,那么它就是server端。


三. Android BLE

在BLE支持上,Android 从 4.3 (API 18 )才可以使用(android.bluetooth ),在Android 5.0 (API 21)版本中,新添加了android.bluetooth.le 包,方便开发BLE,新增 使用Scaner进行扫描蓝牙设备Advertiser 相关 外围设备(Peripheral)开发包

这里写图片描述

后面我将实现API实现 BLE设备扫描((4.3~5.0与5.0以上)两种方式),连接,数据传输,最后将实现兼容性处理,封装为BleTooth 库,以便使用,后将使用手机作为外围,来体验使用android.bluetooth.le包下 Advertiser相关内容。

  • AndroidManifest 权限配置
    <uses-permission android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Android 5.0 及其之后,需要定位权限;
Android 6.0定位权限需要申请,在这里不实现;简单方法:将build.gradle 中 targetSdkVersion 修改为 22

  • Android 5.0 之后权限配置
   <uses-permission android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  • 配置 Feature

Android 5.0及其以上配置 :

 <uses-feature android:name="android.bluetooth.le" android:required="true"/> 

5.0以下 配置:

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

required 为true 时,应用将只能安装在支持BLE的设备上; 一般设置为false,这样都可以安装,就显得友好,不过这样做的话,需要进行代码判断:

// Use this check to determine whether BLE is supportedon the device. Then// you can selectively disable BLE-related features.if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){    // 不支持BLE设备    finish();}
  • 判断蓝牙是否打开

通过BluetoothAdapter实现判断

    private void checkBlueToothDevice() {        BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();        if (defaultAdapter == null) {            //不支持蓝牙        } else {            if (!defaultAdapter.isEnabled()) {                //蓝牙没有打开            }        }    }
  • 广播监听实现系统蓝牙状态(打开,关闭)
    //onCreate()中注册广播    private void registerBlueToothReceiver() {        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);        registerReceiver(blueToothReceiver, filter);    }    //onDestory() 中解注册广播    private void unRegisterBlueToothReceiver() {        unregisterReceiver(blueToothReceiver);    }    //状态监听广播    private BroadcastReceiver blueToothReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            switch (intent.getAction()) {                case BluetoothAdapter.ACTION_STATE_CHANGED:                    int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);                    switch (blueState) {                        case BluetoothAdapter.STATE_TURNING_ON:                            break;                        case BluetoothAdapter.STATE_ON:                            break;                        case BluetoothAdapter.STATE_TURNING_OFF:                            break;                        case BluetoothAdapter.STATE_OFF:                            showDialog("请先打开蓝牙,才可以使用!", 2);                            break;                    }                    break;            }        }    };

四. 最后

新(这)的(是)一年(句),加(费)油(话)!

0 0
原创粉丝点击