BLE4.0蓝牙开发的必经之路

最近,翔飞人退役了。

始终振翅的飞人最后还是落了地。伤病无情,英雄迟暮。祝福他换片天空再次起航ing。

前一阵子,被老板叫去搞项目。

说是要用到蓝牙,一琢磨,网上不多的是,下了一个蓝牙聊天的demo,翻来覆去就这点东西嘛,还不是小意思,搞了半个月,信心满满地跟硬件工程师交流,我擦嘞,这什么玩意,完全不一个系统嘛。

这算是跟蓝牙的第一次正面交锋吧。

借着物联网啦,工业4.0啦的势头,蓝牙发展到今天,算是风生水起日臻完善了。可以说BLE4.0是四代蓝牙中的核心协议。关于它的介绍嘛,网上铺天盖地,此处略去1000字。。。一些底层的协议介绍,前辈们已经整理过了。
http://blog.csdn.net/ooakk/article/details/7302425

上层开发需要的一些基础知识,也由高手们早就总结好了,相当全面。给个链接,慢慢研究吧
http://www.blogjava.net/zh-weir/archive/2013/12/09/407373.html

当然,最重要的API文档绝对不能忽略。给个中文过的,翻译质量还不错,可中英对照着看
http://www.cnblogs.com/heiyue/p/4095816.html

概念不多强调,理解就好,搞硬件搞底层就另说了。

有了前面的准备基础,配一个安卓4.3及以上系统的手机,再搞个蓝牙4.0模块,基本上就可以开始倒腾了。

这里说的是两个蓝牙模块(手机)的通信。IOS上有个iBeacon基站的概念,一对多通信,有待进一步研究研究。

再推荐一篇博客呃,百度上搜蓝牙4.0总能搜到它,谷歌上竟然也有…,
http://blog.csdn.net/hellogv/article/details/24267685,做项目的时候也提供了诸多参考,向大牛学习。

要开发,官方demo不可不看,就喜欢又免费又可用的那种。据说优秀的程序员,只要有demo,就能写出来世界上的所有程序。他奶奶的,太可怕了。
http://download.csdn.net/detail/lqw770737185/8116019

demo像我这种水平,看起来还是比较费劲的,里面好像有5个class文件,每个文件的作用就像它的名字一样(废话。。),里面实现了HeartRate Profile,关于这个Profile,实在是太有话说了。我真是纠结了好长时间,太多的专业术语让人无比绝望,(术语党滚粗吧,你就不能好好说吗)后来查了一些资料,加上前面链接中提到的概念,我个人觉得所谓的的profile,其实就是一些数据处理协议,由这个东西,告诉你该如何处理数据(不知道理解有没有偏差,希望大牛看到了能站出来敲打敲打),所以
https://developer.bluetooth.org/TechnologyOverview/Pages/Profiles.aspx这里给出的那些profile,都是别人制定出来的一些成型的数据处理规范,用的话,可以添加进去就行了。提醒那些和我水平差不多的(高手绕行),数据传输那块,通过注册广播,在Activity之间发送和接收数据。另外,读、写操作都是基于回调机制的。比如执行完writeCharacteristic()这个方法,系统就会自动触发onCharacteristicWrite()这个函数,这个函数又会发送广播(当然根据自己需要,可以另做处理)。

public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic,byte[]test){
        boolean flag = false;       
        characteristic.setValue(test);
        flag=mBluetoothGatt.writeCharacteristic(characteristic);
        Log.e(TAG,"数组长度"+test.length+""+flag);
        return flag;        
}
//write的回调,发送广播,方法三
@Override
public void **onCharacteristicWrite**(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            Log.e("WRITE", "onCharacteristicWrite() - status: " + status + "  - UUID: " + characteristic.getUuid());            
          **// write回调失败 status=128,    read回调失败status=128.     status=0,回调成功;status=9,数组超长**

if (status == BluetoothGatt.GATT_SUCCESS) 
{
    broadcastUpdate(ACTION_DATA_AVAILABLE,characteristic);
     Log.e("WRITE SUCCESS", "回调成功 " + status + "  - UUID: " + characteristic.getUuid());
}
else{
      Log.e("FAIL", "回调失败 " + status + "  - UUID: " + characteristic.getUuid());
    }
}

项目里用到蓝牙的作用无外乎读、写,或者加一个通知的功能。至于搜索,发现,连接以及连接状态的改变等,官方demo里已经写的无比详细,而且已经实现读特征值value的功能,开发时完全可以借过来用一下嘛。

我的工程也是在官方demo的基础上修改的,除去了一些冗余的代码,稍后给出连接,需要的可以去下,只需要将SampleGattAttributes里面的YJ_BLE_READ_WRITE的值(粗体部分),改成自己模块上拥有读写属性特征值的uuid即可实现同一个特征值的读写操作。

public static String YJ_BLE_READ_WRITE = "**0000fff1-0000-1000-8000-00805f9b34fb**";

老板在旁边看着,工程源码不方便给了。这里只写了一个简单的示例,UI上能看到写(或者读)的数据,特征值的Properties,特征值的Permissions。

我用的几个蓝牙模块好像都没有Permissions字段(为0),所以用Properties就够了,它可以通过位运算来赋值。比如,可读字段:PROPERTY_READ,对应的值是0x00000002,可写字段:PROPERTY_WRITE ,对应的值是0x00000008,可读可写PROPERTY_WRITE|PROPERTY_READ,按位或之后,对应的值就是0x0000000A,也就是十进制的10

至于每个代码块实现的什么功能,代码里面已经写得不能不能再详细,不明白的再问啦。

总结:
BLE4.0的MTU(最大传输单元)是20字节,即一次最多能发送20个字节,若超过20个字节,必须分段发送,否则回调状态status回出错,一般为9。(status的值可在log中查看,代码中已加注释)

一般蓝牙4.0模块,默认的可读写的字节数是1byte(分厂家而论),所以开发时必须有硬件工程师配合将收发的LENGTH字段设成20.否则回调状态status会出错,一般为128

数据传输时关键要实现许多回调函数,弄明白这个回调机制,基本也就没什么内容。

先这么多吧,想到了再补充,希望能帮到你,欢迎拍砖。

demo下载地址:
http://download.csdn.net/detail/luochoudan/8575019

你可能感兴趣的:(安卓)