算下来很久没有写ble的博文了,上家的技术都快忘记了,所以赶紧读了一遍google的api顺便写下这篇博客心得
其实大家要学习android的技术,google的api就是最详细的指导书了,而且通俗易懂,就算看不懂英语,翻译翻译再结合代码也能看个大概的,真的很赞哟,我们直接解读吧! google的api中前面就是一大片的概念,这其实在我之前的篇幅中都有说过的
我们直接翻译
generic attribute profile(gatt)—gatt配置文件是一个通用规范,用于在ble链路上发送和接收被称为“属性”的数据块。目前所有的ble应用都基于gatt。 蓝牙sig规定了许多低功耗设备的配置文件。配置文件是设备如何在特定的应用程序中工作的规格说明。注意一个设备可以实现多个配置文件。例如,一个设备可能包括心率监测仪和电量检测。
attribute protocol(att)—gatt在att协议基础上建立,也被称为gatt/att。att对在ble设备上运行进行了优化,为此,它使用了尽可能少的字节。每个属性通过一个唯一的的统一标识符(uuid)来标识,每个string类型uuid使用128 bit标准格式。属性通过att被格式化为characteristics和services。
characteristic 一个characteristic包括一个单一变量和0-n个用来描述characteristic变量的descriptor,characteristic可以被认为是一个类型,类似于类。
descriptor descriptor用来描述characteristic变量的属性。例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位。
service service是characteristic的集合。例如,你可能有一个叫“heart rate monitor(心率监测仪)”的service,它包括了很多characteristics,如“heart rate measurement(心率测量)”等。你可以在bluetooth.org 找到一个目前支持的基于gatt的配置文件和服务列表。
这里有两个概念
中央 vs 外围设备。 适用于ble连接本身。中央设备扫描,寻找广播;外围设备发出广播。
gatt 服务端 vs gatt 客户端。决定了两个设备在建立连接后如何互相交流。
为了方便理解,想象你有一个android手机和一个用于活动跟踪ble设备,手机支持中央角色,活动跟踪器支持外围(为了建立ble连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通信)。 当手机和运动追踪器建立连接后,他们开始向另一方传输gatt数据。哪一方作为服务器取决于他们传输数据的种类。例如,如果运动追踪器想向手机报告传感器数据,运动追踪器是服务端。如果运动追踪器更新来自手机的数据,手机会作为服务端。 在这份文档的例子中,android app(运行在android设备上)作为gatt客户端。app从gatt服务端获得数据,gatt服务端即支持heart rate profile(心率配置)的ble心率监测仪。但是你可以自己设计android app去扮演gatt服务端角色。也就是自定义
好的,google文档中,也举了一个例子说明,我们要使用ble的时候,必须有要加上两个权限
这其实你要使用蓝牙这个硬件都是要加上这个权限的,但是这里google又声明了一点 如果n你想声明你的软件只为具有ble的设备提供服务的话,你应该要在清单文件中加入
如果改为false的话,那其他蓝牙也是可以使用的,我们创建一个工程——bletest
和传统蓝牙一样,我们添加完权限之后就要去判断这个设备是否支持ble
这步操作也只是你设置为false的时候才是必须的,因为你如果你设置为true,那你只给ble服务,那这个判断也就是多余的了,紧接着,我们还需要去判断蓝牙是否开启,如果没有开启,我们就去开启他,这次虽然也是用bluetoothadapter 去获取,但是这里用了一个新的类bluetoothmanager ,先初始化
然后再去开启
这里的request_enable_bt也就是一个回调的标志,无须理会
写了这个之后,当我们蓝牙没有开启的时候就会去友好的提示用户开启了
我们现在准备工作都有了之后我们就可以直接去搜索设备了,ble的api和普通蓝牙的api还是有一定的区别的,就是有回调了,使用起来挺方便的,但是搜索是很费电的,所以切记要小心使用,最好是找到设备之后就停止扫描或者设置扫描时间,不然你就苦逼了
这样,当我们接收到搜索设备的回调时便可以直接添加在adapter上,要注意,所演示的也是google提供的demo
这仅仅是第一步,我们要让ble拥有强大的能力,就需要连接他的gatt服务端
连接到gatt服务端时,由ble设备做主机,并返回一个bluetoothgatt实例,然后你可以使用这个实例来进行gatt客户端操作。请求方(软件)是gatt客户端。bluetoothgattcallback用于传递结果给用户,例如连接状态,以及任何进一步gatt客户端操作。 在这个例子中,这个ble app提供了一个activity(devicecontrolactivity)来连接,显示数据,显示该设备支持的gatt services和characteristics。根据用户的输入,这个activity与bluetoothleservice通信,通过android ble api实现与ble设备交互。
当触发特定的回调时,它调用适当的broadcastupdate()辅助方法,通过这一个动作。注意,本节中的数据解析执行按照蓝牙心率测量概要文件规范:
返回devicecontrolactivity, 这些事件由一个broadcastreceiver来处理:
你的android app完成与gatt服务端连接和发现services后,就可以读写支持的属性。例如,这段代码通过服务端的services和 characteristics迭代,并且将它们显示 在ui上。
当设备上的特性改变时会通知ble应用程序。这段代码显示了如何使用setcharacteristicnotification( )给一个特性设置通知。
如果对一个特性启用通知,当远程蓝牙设备特性发送变化,回调函数oncharacteristicchanged( ))被触发。
当你的app完成ble设备的使用后,应该调用close( ),系统可以合理释放占用资源。
代码可能有点乱,这里提供一个google的demo功大家测试