首页 > 系统 > Android > 正文

Android - BlueTooth BLE 开篇

2019-11-09 17:53:16
字体:
来源:转载
供稿:网友

一. BLE

认识BLE

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

认识单双模

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

单双模用途

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

支持

不是所有手机都支持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 特征与传输概念

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

数据传输 (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。

图说关系

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

这里写图片描述

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

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

Android - BlueTooth BLE 之 Central 与 Peripheral 理解

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; } } };

四. 最后

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表