使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发详解
转载请注明来源: 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的开发步骤:
- 添加BleLib库依赖
- 绑定BleLib服务
- 初始化操作
- 打开蓝牙
- 扫描Ble设备
- 连接Ble服务
- 读写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开发详解相关推荐
- 轻松搞定ThinkPad T530蓝牙驱动
轻松搞定ThinkPad T530蓝牙驱动 我的ThinkPad T530本本的蓝牙芯片是BCM20702的,硬件id是0x21E6,换成十进制就是8678.在10.9下,修改个id就能驱动. 方法如 ...
- Android低功耗蓝牙(BLE)开发(二)
在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能.本文代码基于Android5.0以上(API 21) 1. ...
- C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解
这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- Android 系统(252)---Android:BLE智能硬件开发详解
Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念 GATT(Generic Attribute Profile ) Characteris ...
- Android低功耗蓝牙BLE
低功耗蓝牙BLE与传统的蓝牙相比最大的优势是功耗降低90%,同时传输距离增大(超过100米).安全和稳定性提高(支持AES加密和CRC验证),允许Android应用程序与具有更严格电源要求的BLE设备 ...
- Android 低功耗蓝牙BLE连接通信
目录 简介 蓝牙 4.0 BLE与蓝牙4.0的区别 BLE的特点 主要特性 技术细节 BLE的应用 BLE的体系结构 BLE设备链路层状态 就绪态 广播态 扫描态 发起态 连接状态 通信基本过程 两种 ...
- Android BLE蓝牙4.0开发详解
这篇博客主要讲解 蓝牙 BLE 的用法.在讲解之前先讲一些概念性的东西,对于之前没接触过蓝牙开发,现在手上又有个蓝牙BLE项目需要做的人,先看下这些概念还是很重要的.因为我之前就是这样,之前没有接触过 ...
- android封装网络请求界面,轻松搞定 android MVP 架构、okHttp 网络模块封装 的 项目...
CommonMvp commonMvp 能做什么? 1.mvp 实现 model view presenter 业务和界面解耦 2.整合 网络 请求 3.简化网络调用流程 4.整合状态栏和标题栏 实现 ...
最新文章
- 开源点云实时压缩方案测试
- Microbiome:城市海滩和污水中抗生素抗性组研究
- kafka修改分区数_大数据技术:解析SparkStreaming和Kafka集成的两种方式
- 重装oracle12c_记一次win server 2012上oracle12c的安装过程
- CodeForces - 1350E Orac and Game of Life(bfs)
- Building a RESTful Web Service
- 那些相似的CRM之间究竟有无区别
- C语言怎么给程序加上版本号,给自己的程序加上行号
- [BZOJ2879] [Noi2012] 美食节 (费用流 动态加边)
- Hive 内嵌模式安装指导
- split函数python 未定义_实现python 的split函数
- Hive总结(十二)Hive查询进阶
- mysql initialsize,单机数据库优化
- linux openerp,Linux+OpenERP/ODOO 安装笔记求推荐。
- Word文档插入图片的问题
- Python实现数字图像处理之5种彩色空间转换(单图+多图+视频)
- Linux系列6:bash学习
- 诚迈科技智能汽车软件产业峰会落幕,智达诚远峰昇操作系统FusionOS发布!
- 网优到底是干什么的?
- 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)题解