前段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结。
蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0+HS标准的基础上增加了对低功耗蓝牙(BLE)的支持。相比原有的普通蓝牙和高速蓝牙,BLE最大的特点就是低功耗,低延时,快速的搜索和连接速度,但数据传输速度相比传统蓝牙低。接下去将从BLE的概念以及代码两个方面介绍Android下的BLE。
先来说说基本概念:
1.BLE相关概念
1.1 GATT、Service、Characteristic、Descriptor
BLE开发,经常会与四个概念发生关系:GATT、Service、Characteristic、Descriptor
GATT:是蓝牙4.0特有的Profile通用规范,BLE应用的Profile均基于GATT。Gatt定义了一个服务框架规范,该框架包括对蓝牙服务(Service)和服务特性(Characteristic)的定义和规范,和其中读写、通知的特性等。可以将GATT理解成BLE框架,我们在GATT上面实现BLE功能。
Service:是完成一个特定功能的数据和行为集合。在Gatt中,一个Service可能包含Service引用以及强制或者可选的Characteristic。
Characteristic:也叫特征值,一个Characteristic的定义包含了Characteristic本身,数值以及描述(Descriptor)的声明。Characteristic是完成BLE具体功能的基本单位。
Descriptor:Descriptor定义了Characteristic中数据的具体含义。
总的来说,一个蓝牙4.0的终端可以包含多个Service,一个Service可以包含多个Characteristic,一个Characteristic包含一个Value和多个Descriptor,一个Descriptor包含一个Value
1.2 中央(Central)与周边(Periphery)
在BLE协议中,有两个角色,周边(Periphery)和中央(Central):
周边是数据提供者,中央是数据使用/处理者;在iOS SDK里面,可以把一个iOS设备作为一个周边,也可以作为一个中央;但是在Android SDK里面,Android手机只能作为中央来使用和处理数据;那数据从哪儿来?从BLE设备来,现在的很多可穿戴设备都是用BLE来提供数据的。
一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。
那么问题来了,如何定义周边和中央?
关于周边和中央,涉及到四个类:
BluetoothGattServer:作为周边来提供数据
BluetoothGattServerCallback:返回周边的状态
BluetoothGatt:作为中央来使用和处理数据
BluetoothGattCallback:返回中央的状态和周边提供的数据。、
关系如图下:
2. 开发Ble
了解了那些基础概念后,我们就正式开始开发ble。
Ble的Android开发,主要是以下的几个步骤:
1、添加权限
2、扫描Ble设备
3、连接Ble设备
4、数据通讯
那么现在,开始一步步来完成。
2.1 添加权限:
在AndroidManifest.xml中添加Ble需要的权限,其实就两个:
<!-- 应用使用蓝牙的权限 --><uses-permission android:name="android.permission.BLUETOOTH" /><!-- 扫描蓝牙设备或者操作蓝牙设置 --><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
2.2 检查是否设备是否支持蓝牙,并打开蓝牙
检查设备是否支持蓝牙
/** * 检查该设备是否支持蓝牙 */ public void isBle(Context context) { //手机硬件支持蓝牙 if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { ViewUtils.getInstance().showToast("该设备不支持BLE,即将离开改页面"); } }
打开手机蓝牙开关
private BluetoothAdapter mBluetoothAdapter;//蓝牙适配器 //打开蓝牙权限 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, What.Bluetooth.bluetoothEnable); }
2.3 扫描设备
开始扫描和停止扫描,只需要调用对应的startLeScan()和stopLeScan()即可,但是需要将LeScanCallBack作为参数:
// 超时时间 private static final long SCAN_PERIOD = 10000; ... private void scanLeDevice(final boolean enable) { if (enable) { // 达到超时时间,停止扫描 mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD); //开始扫描 mBluetoothAdapter.startLeScan(mLeScanCallback); } else { //停止扫描 mBluetoothAdapter.stopLeScan(mLeScanCallback); } ... }
联系人:黄金
手 机:153 0755 0221
邮 箱:jane@dzc.hk
公 司:深圳市山星盛电子科技有限公司-称重产品官方展示网站
地 址:广东省深圳市宝安凤塘大道25号(山星盛电子秤)