1、概述
公司做了两个蓝牙4.0的app项目,对于蓝牙4.0 ble的理解也从阅读官方的代码,各种代码到有自己的见解。
很多手机早前就有蓝牙4.0,但是android官方是在sdk 4.3以上才开始支持蓝牙4.0 一般app开发的现在都建议用户自行升级到android系统到4.3以上
才能使用开发的app。早前三星,摩托罗拉,lg,博通是有提供自己的蓝牙库的,因为大家使用的库不能统一,所以现在
开发ble app 一般是直接要求sdk4.3以上,用官方库开发。
2、demo
官方demo参见 :就不用找来找去了,装了该装的更新包,新建个工程,选择Android Sample Project,
在4.0以上的sdk里选择历程BluetoothLeGatt 这个工程就是官方的蓝牙ble demo了。
3、android ble 概念基础与编码基础
对于ble 的操作api横竖也不多,主要是使用调用api,注册回调函数的方式,在接受到数据时,调用回调函数得到数据。为了代码的独立耗操作,在回调函数中
注册广播的方式,与其它模块或者activity交互。
该帖子对于ble的api介绍很详细:http://www.blogjava.net/zh-weir/archive/2013/12/09/407373.html
关于Profile概念:
Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用,你可以把Profile理解为连接层或者应用层协。
在所有的Profile中,有四种是基本的Profile,这些Profile会被其它的Profile使用,它们包括GAP/SDAP/SPP/GOEP Profile。
参考:http://blog.csdn.net/daydayupfromnowon/article/details/6041988
虽然对于协议的一些概念不是开发app时必须要会的,但是多一份了解总是好的,因为profile概念比较难理解,总是让我想到usb协议里,对应的一个产品没必要实现所有的usb协议,每种不同的产品可以枚举成不同的描述符。
4、流程描述。
ble的操作api不多,流程也很清晰,对于通过监听设备接收数据的简单的流程:
a、扫描(有几款手机扫描时间很短,即使设置为手动连接 扫几秒后自动关闭扫描如oppo,)
b、发现设备,匹配建立链接(用device.name 来匹配设备)
c、扫描服务(官方的demo极度坑爹),匹配服务与特征的uuid
Log.i(TAG,"Attempting to start service discovery:" + mBluetoothGatt.discoverServices());
对,你没看错,官方的demo里,扫描发现服务是在log语句里进行的,如果你的代码进行了log混淆,那么你的app能连上设备,但是设备永远也是没有数据回来的d、监听匹配到的uuid。(如果是读写的话,就读写该uuid,回调函数里会得到值)
注:
mCharacteristic.getProperties() 可以返回这个特征值是可读,可写,可通知的状态
5、实际中遇到的问题:
android的ble实际中的遇到的问题不少,而且很烦恼的是很多是,设备与ios通信不会出问题,与android通信容易出问题。
实际开发中遇到的现象有:app与设备难链接,链接易断开,数据接收不稳定时快时慢,链接成功没有数据回来。设备端使用的是ti的cc2540 2541开发的
所以现象也是针对这个方案的吧。
注:开发ble常见的两个log错误:129133
GATT_NO_RESOURCES = -128 or 128;
GATT_INTERNAL_ERROR = -127 or 129; //搜索服务找不到报129
GATT_ERROR = -123 or 133;//连接异常报133
GATT_ALREADY_OPEN = -115 or 141