前言
由于自己工作中需要开发ble的项目,于是在折腾了一段时间后也有所了解,便想写下来分享给大家,同时对自己的知识也是一种巩固
1.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和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。
2.连接流程
BluetoothManager
用BluetoothManager来获取BluetoothAdapter。
BluetoothManager bluetoothManager =(BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter
代表了移动设备(如:手机)的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作,一个Android系统只有一个BluetoothAdapter,通过BluetoothManager获取。
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
startLeScan()
既然获得了BluetoothAdapter对象,那么接下来就可以搜索ble设备了,这时就需要用到BluetoothAdapter的startLeScan()这个方法了
mBluetoothAdapter.startLeScan(mLeScanCallback); //此mLeScanCallback为回调函数
-
onLeScan(BluetoothDevice, rssi, byte[])
- BluetoothDevice devic 为蓝牙对象可以获得mac地址,名字等信息
- rssi为信号强度,为负数如:-100
- scanRecord 为广播包和响应包组成的字节数组
- 1、当找到对应的设备后,立即停止扫描;
- 2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围 的时候持续不停扫描,消耗电量。
private LeScanCallback mLeScanCallback = new LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
Log.i(TAG, "onLeScan() DeviceName------>"+device.getName());
if(device.getName() == null){
return;
}
if (device.getName().contains("xxxxx")) { //做设备过滤
mBluetoothDevice = device; //获取到周边设备
stopLeScan(); //停止
}
}
};
- BluetoothGatt(连接蓝牙,建立GATT连接)
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback); //mGattCallback为回调接
上文已经成功连接ble设备,接下的数据交互操作,需要了解GATT(最后我会贴出全部代码)
3.什么是GATT?
GATT全称Generic Attribute Profile,中文名叫通用属性协议,它定义了services和characteristic两种东西来完成低功耗蓝牙设备之间的数据传输。它是建立在通用数据协议Attribute Protocol (ATT),之上的,ATT把services和characteristic以及相关的数据保存在一张简单的查找表中,该表使用16-bit的id作为索引。
一旦两个设备建立了连接,GATT就开始发挥作用,同时意味着GAP协议管理的广播过程结束了。但是必须要知道的是,建立GATT连接必要经过GAP协议。
最重要的事情,GATT连接是独占的,也就意味着一个BLE周边设备同时只能与一个中心设备连接。一旦周边设备与中心设备连接成功,直至连接断开,它不再对外广播自己的存在,其他的设备就无法发现该周边设备的存在了。
周边设备和中心设备要完成双方的通信只能通过建立GATT连接的方式。
一个ble蓝牙设备有多个包括多个Profile
一个Profile中有多个服务Service(通过服务的uuid找到对应的Service)
一个Service中有多个特征Characteristic(通过特征的uuid找到对应的Characteristic)
一个Characteristic中包括一个value和多个Descriptor(通过Descriptor的uuid找到对应的Descriptor)
UUID一般硬件工程师会告诉你的!!!
4.如何开发?
- 在AndroidManifest.xml添加权限
<!-- 位置权限-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true" />
获得开位置权限
android6.0以后搜索ble蓝牙需要获得位置权限,获得位置权限可查看MainActivity.java-
由于代码太多我就不贴出来了,具体实现点击下面demo地址查看,先放下效果图
DEMO地址点击这里
- 主要参考了,非常感谢
ble蓝牙那些事
Android BLE 蓝牙开发入门
END
如果你就得帮助到你了,请点个赞吧!