参考资料:http://www.cnblogs.com/savagemorgan/p/3722657.html Android4.3 蓝牙BLE初步
http://www.cnblogs.com/zdz8207/category/434664.html 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受
http://blog.csdn.net/jimoduwu/article/details/21604215 Android BLE 蓝牙低功耗教程,中央BluetoothGatt和周边BluetoothGattServer的实现
http://blog.csdn.net/woshasanguo/article/details/41082395 android ble蓝牙开发略解 (写的不错)
- 首先需要明白一些概念
蓝牙2.0 vs 蓝牙4.0,主要的区别在于协议变了,4.0主打省电策略,与其他相比,这个更省电。而且,最坑的不是这个,最坑的是蓝牙2.0 只能与蓝牙2.0 通讯,蓝牙4.0与蓝牙4.0通讯。
协议不一样,无法直接通讯。
在开发手机与单片机通过蓝牙通讯的过程中,我们要知道,其实手机和单片机也是一样,2.0的蓝牙无法同4.0的蓝牙通讯。
还有一点就是,手机间,蓝牙通讯一般用系统自带的app进行开发,而不是用我们自己开发的app,这是因为手机没有root,无法用手机的 app进行相互的通讯。
所以,现在市面上都是,手机蓝牙4.0 与模块蓝牙4.0 之间的通讯。
- 蓝牙相关概念:
GATT、ATT: 这两者都是BLE间小数据传输的协议规范,都是通用的。
Characteristic: 数据类型,它包括一个value和0至多个value的描述。
Descriptor: 对上面的描述,例如范围、计量单位等。
Service:Characteristic的集合,例如一个service可能包含多个ch,一个ch也可能包含多个des.
3、数据的传递问题:
一定要搞清,数据的流向问题:
程序结构:
在DeviceScanActivity当中,数据怎么回传回来?数据在这个里面通过Intent传到这个这里。
在DeviceControlActivity当中,数据是这样的:
各种回调之后,数据在device里面,我们现在的目的是要发送数据,要发送数据就是需要
mNotifyCharacteristic
它怎么得到:
从上到下,我们可以看到,我们想要得到的其实就是mDeviceAddress,而此已经得到了。只需要从下往上找即可找到。
mBluetoothLeService
- 概念还是概念
BLE分为三部分Service、Characteristic、Descriptor,这三部分都由UUID作为唯一标示符。一个蓝牙4.0的终端可以包含多个Service,一个Service可以包含多个Characteristic,一个Characteristic包含一个Value和多个Descriptor,一个Descriptor包含一个Value。
第二大块,分析的有点复杂。
上面的每一个部分都有唯一的UUID,而且对于某个固定的设备其UUID是固定的,但是设备那么多,我们如何确定是那个设备呢?
如下面所示:
上面是对于某个固定的设备是有用的,但是对于不是固定的设备就很难说了。
也就是说,对于某些相同的设备,gatt都不一样,而gatt下面的 services,character,descriptor都有相同的UUID。
gatt是通过 设备mac获取到的,其函数 connectgatt。
一个设备一个gatt,换设备就要换gatt。
其实我们也可以做成下面这样,一个设备对应多个services,一个service 可能对应着多个characteristic,相同设备的相同服务(service)
和属性(characteristic)的UUID相同。
20150818 日补充内容:
上面讲的内容是发送数据的部分,一直没有讲接收数据的模块。对于数据的接收,我们是放在广播里面的。
代码很短,这个目前没测试过。后期可以先拿蓝牙模块做做实验,确定下。
突然忘了,我这里选用的蓝牙模块是 CC41-A。