转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410

使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发详解


  • 示例源码: https://github.com/junkchen/BleLib/tree/master/sample
  • Android ble4.0开发基础篇:http://blog.csdn.net/kjunchen/article/details/50339549

BleLib是Android低功耗蓝牙4.0及以上开发的辅助库,一行代码解决Ble初始化、扫描、连接、特性读写、设置通知等操作。

BleLib支持单个Ble连接或多个Ble设备同时连接。

BleLib中的关键类:

  • BleService是单个Ble连接操作的服务类
  • GattAttributes类中包含了蓝牙联盟规定的服务和特征的UUID值
  • MultipleBleService类是可多个蓝牙设备同时连接的服务类

使用方法

第一步:添加BleLib库依赖

因此,在你项目Module中的build.gradle文件中添加库依赖即可,如下:

dependencies {compile 'com.junkchen.blelib:blelib:1.0.4'
}

只此一句即可使用BleLib库,方便吧,要的就是这效果。
使用Android Studio时按照如下方式添加依赖比较好,获取的是最新的版本,结果和上面是一样的,进入模块的库依赖设置,搜索blelib即可获取:


第二步:绑定BleLib服务

BleLib库中的Ble服务类继承了Service,因此建议绑定服务进行使用。(如果项目中需要同时连接多了Ble设备进行控制请绑定MultipleBleService)

private BleService mBleService;
private boolean mIsBind;
private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mBleService = ((BleService.LocalBinder) service).getService();if (mBleService.initialize()) {if (mBleService.enableBluetooth(true)) {mBleService.scanLeDevice(true);Toast.makeText(BleScanActivity.this, "Bluetooth was opened", Toast.LENGTH_SHORT).show();}} else {Toast.makeText(BleScanActivity.this, "not support Bluetooth", Toast.LENGTH_SHORT).show();}}@Overridepublic void onServiceDisconnected(ComponentName name) {mBleService = null;mIsBind = false;}
};private void doBindService() {Intent serviceIntent = new Intent(this, BleService.class);bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}private void doUnBindService() {if (mIsBind) {unbindService(serviceConnection);mBleService = null;mIsBind = false;}
}

第三步:初始化操作

当服务绑定后可进行初始化操作,判断该机是否支持蓝牙,调用如下方法:

mBleService.initialize();//Ble初始化操作  

该方法会返回一个boolean值,返回true表示初始化成功,支持蓝牙;返回false表示初始化操作失败,则后续的所有操作都不能进行。


第四步:打开蓝牙

当初始化操作成功后就可以打开蓝牙了,调用如下方法:

mBleService.enableBluetooth(boolean enable);//打开或关闭蓝牙 

该方法需要传入一个boolean类型的参数,true表示打开蓝牙,false表示关闭蓝牙;并返回boolean参数,返回true表示蓝牙打开,否则关闭。


第五步:扫描Ble设备

当蓝牙打开后可以进行Ble设备的扫描了,调用如下方法:

mBleService.scanLeDevice(boolean enable, long scanPeriod);//启动或停止扫描Ble设备  

调用该方法需要传入一个boolean参数,true表示开始进行扫描Ble设备,false表示停止扫描,默认扫描10秒钟后停止,如果想要自己设定扫描的时间,可以输入一个long型参数,表示时间单位为毫秒,如3000表示3秒后停止扫描,扫描结束是会发出广播。

扫描的结果可以从扫描监听或者广播接收器两种方式获取,设置方法如下:

监听方式接收扫描到的Ble设备

//Ble扫描回调
mBleService.setOnLeScanListener(new BleService.OnLeScanListener() {@Overridepublic void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {//每当扫描到一个Ble设备时就会返回,(扫描结果重复的库中已处理)}
}); 

注意:设置监听一定要等到BleService服务绑定之后才进行,否则会造成空指针异常)

广播接收扫描到的Ble设备

private BroadcastReceiver bleReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(BleService.ACTION_BLUETOOTH_DEVICE)) {String tmpDevName = intent.getStringExtra("name");String tmpDevAddress = intent.getStringExtra("address");Log.i(TAG, "name: " + tmpDevName + ", address: " + tmpDevAddress);} else if (intent.getAction().equals(BleService.ACTION_SCAN_FINISHED)) {//扫描Ble设备停止}}};

两种方式获取都可以,但是监听方式获取的信息会多一些,可根据自己的需求进行选择使用那种方式。


第六步:连接Ble服务

当扫描到Ble设备后就可以进行连接操作了,调用如下方法:

mBleService.connect(String address);//连接Ble
mBleService.disconnect();//取消连接  

连接需要传入要连接的Ble设备的地址。

连接状态可以从连接监听或者广播接收器两种方式获取,设置方法如下:

监听获取Ble连接状态

//Ble连接回调
mBleService.setOnConnectListener(new BleService.OnConnectListener() {@Overridepublic void onConnect(BluetoothGatt gatt, int status, int newState) {if (newState == BluetoothProfile.STATE_DISCONNECTED) {//Ble连接已断开} else if (newState == BluetoothProfile.STATE_CONNECTING) {//Ble正在连接} else if (newState == BluetoothProfile.STATE_CONNECTED) {//Ble已连接} else if (newState == BluetoothProfile.STATE_DISCONNECTING) {//Ble正在断开连接}}
}); 

广播接收Ble连接状态

private BroadcastReceiver bleReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(BleService.ACTION_GATT_CONNECTED)) {//Ble已连接} else if (intent.getAction().equals(BleService.ACTION_GATT_DISCONNECTED)) {//Ble连接已断开} }};

当连接上Ble后会进行服务的获取,如果服务和特性不能发现,那么就不能进行特性的读写和设置GATT通知。服务发现监听设置如下:

//Ble服务发现回调
mBleService.setOnServicesDiscoveredListener(new BleService.OnServicesDiscoveredListener() {@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {}
});

第七步:读写Ble特性和接收GATT通知

连接上Ble并获取服务之后就可以对特性进行读写,设置GATT通知,操作如下:

mBleService.setCharacteristicNotification();//设置通知
mBleService.readCharacteristic();//读取数据
mBleService.writeCharacteristic();//写入数据 

特性读取的数据和GATT通知接收数据设置OnDataAvailableListener监听获取,设置如下:

//Ble数据回调
mBleService.setOnDataAvailableListener(new BleService.OnDataAvailableListener() {@Overridepublic void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {//处理特性读取返回的数据}@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {//处理通知返回的数据}
});

总结

最后小小总结下使用BleLib库进行Android低功耗蓝牙Ble的开发步骤:

  1. 添加BleLib库依赖
  2. 绑定BleLib服务
  3. 初始化操作
  4. 打开蓝牙
  5. 扫描Ble设备
  6. 连接Ble服务
  7. 读写Ble特性和接收GATT通知

Author

  • Name: Junk Chen
  • Github: https://github.com/junkchen
  • Blog: http://blog.csdn.net/kjunchen
  • Email: junkchen@vip.qq.com
  • QQ群: 365532949

2016/3/16 21:49:15

使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发详解相关推荐

  1. 轻松搞定ThinkPad T530蓝牙驱动

    轻松搞定ThinkPad T530蓝牙驱动 我的ThinkPad T530本本的蓝牙芯片是BCM20702的,硬件id是0x21E6,换成十进制就是8678.在10.9下,修改个id就能驱动. 方法如 ...

  2. Android低功耗蓝牙(BLE)开发(二)

    在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能.本文代码基于Android5.0以上(API 21) 1. ...

  3. C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解

    这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...

  4. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  5. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

  6. Android低功耗蓝牙BLE

    低功耗蓝牙BLE与传统的蓝牙相比最大的优势是功耗降低90%,同时传输距离增大(超过100米).安全和稳定性提高(支持AES加密和CRC验证),允许Android应用程序与具有更严格电源要求的BLE设备 ...

  7. Android 低功耗蓝牙BLE连接通信

    目录 简介 蓝牙 4.0 BLE与蓝牙4.0的区别 BLE的特点 主要特性 技术细节 BLE的应用 BLE的体系结构 BLE设备链路层状态 就绪态 广播态 扫描态 发起态 连接状态 通信基本过程 两种 ...

  8. Android BLE蓝牙4.0开发详解

    这篇博客主要讲解 蓝牙 BLE 的用法.在讲解之前先讲一些概念性的东西,对于之前没接触过蓝牙开发,现在手上又有个蓝牙BLE项目需要做的人,先看下这些概念还是很重要的.因为我之前就是这样,之前没有接触过 ...

  9. android封装网络请求界面,轻松搞定 android MVP 架构、okHttp 网络模块封装 的 项目...

    CommonMvp commonMvp 能做什么? 1.mvp 实现 model view presenter 业务和界面解耦 2.整合 网络 请求 3.简化网络调用流程 4.整合状态栏和标题栏 实现 ...

最新文章

  1. 开源点云实时压缩方案测试
  2. Microbiome:城市海滩和污水中抗生素抗性组研究
  3. kafka修改分区数_大数据技术:解析SparkStreaming和Kafka集成的两种方式
  4. 重装oracle12c_记一次win server 2012上oracle12c的安装过程
  5. CodeForces - 1350E Orac and Game of Life(bfs)
  6. Building a RESTful Web Service
  7. 那些相似的CRM之间究竟有无区别
  8. C语言怎么给程序加上版本号,给自己的程序加上行号
  9. [BZOJ2879] [Noi2012] 美食节 (费用流 动态加边)
  10. Hive 内嵌模式安装指导
  11. split函数python 未定义_实现python 的split函数
  12. Hive总结(十二)Hive查询进阶
  13. mysql initialsize,单机数据库优化
  14. linux openerp,Linux+OpenERP/ODOO 安装笔记求推荐。
  15. Word文档插入图片的问题
  16. Python实现数字图像处理之5种彩色空间转换(单图+多图+视频)
  17. Linux系列6:bash学习
  18. 诚迈科技智能汽车软件产业峰会落幕,智达诚远峰昇操作系统FusionOS发布!
  19. 网优到底是干什么的?
  20. 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解

热门文章

  1. 美股课堂:美国银行开户亲历记
  2. 基于CentOS平台的Snort+Barnyard安装步骤
  3. ZigBee简介\应用协议\解决方案商介绍
  4. Android集成常见问题,android软件开发教程
  5. 计算机组成原理(第三版)唐朔飞-第七章指令系统-课后习题
  6. iterator java库_关于Iterator的next()方法
  7. 在Refit上模拟ApiException
  8. word2vec生成后缀名model文件处理
  9. ArcGIS之基于GIS的旅游辐射区人口统计
  10. 从零搭建个人博客(2)-博客UI搭建