大家好,好久没来发博客了。本篇将跟大家分享我在github上的一个开源项目,是关于安卓蓝牙开发的封装,包含蓝牙设备的搜寻、连接、通信,支持经典蓝牙和低功耗蓝牙,语言版本有Java和Kotlin两个版本。

其实说起来,这个项目早在2018年的时候就已经编写过一版了,只不过由于当时工作比较繁忙,搁置了很长一段时间,后面又没有去理会。直到今年换工作,有事没事看看github账户,偶然看到有一个开发者给我提了第一个issue,惊喜万分,提醒我应该重新拾起这个项目了,然后就重新优化了一下,更新至Github,并准备在csdn这里介绍一下使用方法。不过在介绍之前,我想先跟大家聊聊一个题外的问题,那就是:

为什么会想着去封装这个框架并分享出来,这个框架的定位是?

大家都知道,Github上关于安卓蓝牙开发的开源框架已经很多了,也很成熟稳定了,像FastBle框架,很多人可能觉得其实没必要再去封装这么一个框架。但是其实我想说的是,很抱歉,我当时写这个项目的初衷,并不是为了给广大开发者运用到工作项目中去的,而是给更多的学习者或Android初学者提供一个学习入口,帮助他们更好更快速的理解掌握安卓蓝牙开发方面知识,并且到现在这个初衷一直没变。所以当时设计的时候,框架模块都是按照蓝牙开发通信流程来划分的,全部用安卓原生代码,并且没有过度封装,目的是为了让大家阅读源码的时候一目了然。
像Github上的很多开源框架封装得比较深或比较复杂,直接使用还可以,但不太适合初学者去学习蓝牙基础Api。另一方面,也是我觉得个人能力有限,所以我的定位就是将其作为一个学习开源作品,虽然定位没那么高,我还是会一直维护下去的。我的工作经历其实有大半是跟蓝牙开发相关的,在封装这个框架的过程中,我自己其实也加深了这一块知识,得到了益处。

好的,题外话说完了,下面开始跟大家讲一下这个开源项目的使用方法。

这个项目有两个语言版本,一个是Java,一个是Kotlin,Kotlin语言版本是近期才修改出来的,框架流程模块设计和API其实都是一样的。

Java语言版本地址:https://github.com/g-HJY/HBluetooth
Kotlin语言版本地址:https://github.com/g-HJY/Kotlin-HBluetooth (暂停维护)

以Java语言版本为例,讲讲这个项目的使用方法:
一、集成方式
首先是集成方式,当然你可以直接在github上将整个项目下载下来,也可以将其以依赖的形式集成到你的项目中,具体步骤如下:
1.在项目根目录的build.gradle文件中,添加如下配置:

allprojects {repositories {...maven { url 'https://jitpack.io' }}
}

2.在app module的build.gradle中,添加依赖:

dependencies {implementation 'com.github.g-HJY:HBluetooth:V1.3.6'
}

看到依赖库成功依赖进来后,就可以开始调用啦。

二、使用介绍

1.第一步,使用前先在你应用的Application中调init方法初始化HBluetooth:

         public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();//初始化 HBluetoothHBluetooth.init(this);}}

2.然后必须调用enableBluetooth()方法开启蓝牙功能,你可以在activity中调用:

             //开启蓝牙功能HBluetooth.getInstance().enableBluetooth()

3.如果是低功耗蓝牙,需要设置配置项,经典蓝牙忽略跳过这一步即可:

分别是主服务UUID(withServiceUUID)、读写特征值UUID(withWriteCharacteristicUUID)、通知UUID(withNotifyCharacteristicUUID)以及是否设置最大传输单元(setMtu不设置不用调)等; 您还可以设置分包发送的时间间隔和包长度

     //请填写你自己设备的UUID//低功耗蓝牙才需要如下配置BleConfig,经典蓝牙不需要new HBluetooth.BleConfig()HBluetooth.BleConfig bleConfig = new HBluetooth.BleConfig();bleConfig.withServiceUUID("0000fe61-0000-1000-8000-00805f9b34fb").withWriteCharacteristicUUID("0000fe61-0000-1000-8000-00805f9b34fb").withNotifyCharacteristicUUID("0000fe61-0000-1000-8000-00805f9b34fb")//命令长度大于20个字节时是否分包发送,默认false,分包时可以调两参方法设置包之间发送间隔//.splitPacketToSendWhenCmdLenBeyond(false)//useCharacteristicDescriptor 默认false//.useCharacteristicDescriptor(false).setMtu(200, new BleMtuChangedCallback() {@Overridepublic void onSetMTUFailure(int realMtuSize, BluetoothException bleException) {Log.i(TAG, "bleException:" + bleException.getMessage() + "  realMtuSize:" + realMtuSize);}@Overridepublic void onMtuChanged(int mtuSize) {Log.i(TAG, "Mtu set success,mtuSize:" + mtuSize);}});//低功耗蓝牙才需要调setBleConfigHBluetooth.getInstance().setBleConfig(bleConfig);

4.开启蓝牙能力后,接着你就可以开始进行蓝牙设备扫描,其中,type 为蓝牙设备类型(经典蓝牙或低功耗蓝牙):

           HBluetooth.getInstance().scan(type, new ScanCallBack() {@Overridepublic void onScanStart() {Log.i(TAG, "开始扫描");}@Overridepublic void onScanning() {Log.i(TAG, "扫描中");}@Overridepublic void onError(int errorType, String errorMsg) {}@Overridepublic void onScanFinished(List<BluetoothDevice> bluetoothDevices) {Log.i(TAG, "扫描结束");if (bluetoothDevices != null && bluetoothDevices.size() > 0) {list.clear();list.addAll(bluetoothDevices);adapter.notifyDataSetChanged();}}});或者,如果你想在第一步操作后直接进行扫描,则可以这样调用:HBluetooth.getInstance().enableBluetooth().scan(type, new ScanCallBack() {@Overridepublic void onScanStart() {Log.i(TAG, "开始扫描");}@Overridepublic void onScanning() {Log.i(TAG, "扫描中");}@Overridepublic void onError(int errorType, String errorMsg) {}@Overridepublic void onScanFinished(List<BluetoothDevice> bluetoothDevices) {Log.i(TAG, "扫描结束");if (bluetoothDevices != null && bluetoothDevices.size() > 0) {list.clear();list.addAll(bluetoothDevices);adapter.notifyDataSetChanged();}}});

5.一旦扫描到设备,你就可以找到目标设备并连接:

         HBluetooth.getInstance().connect(device, new ConnectCallBack() {@Overridepublic void onConnecting() {Log.i(TAG, "连接中...");}@Overridepublic void onConnected(Sender sender) {Log.i(TAG, "连接成功,isConnected:" + mHBluetooth.isConnected());//调用发送器发送命令byte[] demoCommand = new byte[]{0x01, 0x02};sender.send(demoCommand, new SendCallBack() {@Overridepublic void onSending(byte[] command) {Log.i(TAG, "命令发送中...");}@Overridepublic void onSendFailure(BluetoothException bleException) {Log.e("mylog", "发送命令失败->" + bleException.getMessage());}});}@Overridepublic void onDisConnecting() {Log.i(TAG, "断开连接中...");}@Overridepublic void onDisConnected() {Log.i(TAG, "已断开连接,isConnected:" + mHBluetooth.isConnected());}@Overridepublic void onError(int errorType, String errorMsg) {Log.i(TAG, "错误类型:" + errorType + " 错误原因:" + errorMsg);}//低功耗蓝牙才需要BleNotifyCallBack//经典蓝牙可以只调两参方法connect(BluetoothDevice device, ConnectCallBack connectCallBack)}, new BleNotifyCallBack() {@Overridepublic void onNotifySuccess() {Log.i(TAG, "打开通知成功");}@Overridepublic void onNotifyFailure(BluetoothException bleException) {Log.i(TAG, "打开通知失败:" + bleException.getMessage());}});

6.设备连接成功后,你可以开始跟设备进行通信:

           HBluetooth.getInstance().send(demoCommand, new SendCallBack() {@Overridepublic void onSending(byte[] command) {Log.i(TAG, "命令发送中...");}@Overridepublic void onSendFailure(BluetoothException bleException) {Log.e("mylog", "发送命令失败->" + bleException.getMessage());}});

7.那么如何接收蓝牙设备返回给你的数据呢,很简单,在Receiver中接收:

          public void initListener() {HBluetooth.getInstance().setReceiver(new ReceiveCallBack() {@Overridepublic void onReceived(DataInputStream dataInputStream, byte[] result) {// 打开通知后,设备发过来的数据将在这里出现Log.e("mylog", "收到蓝牙设备返回数据->" + Tools.bytesToHexString(result));}});}

8.最后,调用以下方法去主动断开连接并释放资源 :

            HBluetooth.getInstance().release();

更多方法Api介绍:

1.带设备名称过滤条件的扫描:

public void scan(@BluetoothType int scanType, int timeUse, ScanFilter filter, ScanCallBack scanCallBack);

public void scan(@BluetoothType int scanType, ScanFilter filter, ScanCallBack scanCallBack);

2.设置连接超时:

HBluetooth.getInstance().setConnectTimeOut(5000);

3.BleConfig(BLE)设置分包发送时间间隔(默认20ms)及包长度(默认20个字节):

public BleConfig splitPacketToSendWhenCmdLenBeyond(boolean splitPacketToSendWhenCmdLenBeyond, int sendTimeInterval);

public BleConfig splitPacketToSendWhenCmdLenBeyond(boolean splitPacketToSendWhenCmdLenBeyond, int sendTimeInterval, int eachSplitPacketLen);

4.开启断开后自动重连机制,默认关闭重连:

HBluetooth.getInstance().openReconnect(3, 4000);

使用方法到此就讲完了,关于框架内的源码也很简单,因为篇初已经讲过,此开源项目目的是为了方便大家理解学习这一块知识的,如果你之前有初略看过安卓蓝牙开发一些理论知识介绍或零散API,相信你很快可以理解并将全部知识内容贯穿起来,豁然开朗。
好了本篇就介绍到这里,谢谢大家!

分享我的Android蓝牙开源作品—HBluetooth相关推荐

  1. android蓝牙开源,开源蓝牙框架 Android-BLE

    对蓝牙感兴趣可以加群讨论学习(QQ:494309361) 一.先来看张BleLib库的api之间的关系图: 1.BleDevice 该类的主要是来描述并记录蓝牙的属性和状态,如记录蓝牙名称.蓝牙MAC ...

  2. 实战-Android 蓝牙文件分享

    需求 在文件管理中,增加一个通过蓝牙分享图片的功能 实现 Android蓝牙分享已经有现成的功能实现,直接上代码: private void blueToothSendFile() {try {Int ...

  3. Android开发开源源代码

    Android经典的开源项目其实非常多,把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助 项目篇: 1.Apollo音乐播放器 就一个很好的播放器,但是实现的特别好!!! 地 ...

  4. Android优秀开源项目

    Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习.今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助.另外, ...

  5. Android常用开源项目

    Android开源项目第一篇--个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Progre ...

  6. 安卓巴士总结了近百个Android优秀开源项目

    安卓巴士总结了近百个Android优秀开源项目 转自:http://sfshine.iteye.com/blog/1724962 Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了 ...

  7. 2019最新Android常用开源库总结(附带github链接)

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 1.TextView HTextView ...

  8. 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域_拔剑-浆糊的传说_新浪博客...

    http://www.apkbus.com/android-17627-1-1.html 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域 bayou 发表于 2011 ...

  9. 【Android】开源项目汇总-备用

    Android开源项目第一篇--个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Progre ...

最新文章

  1. Servlet(一)
  2. 正则严格验证身份证信息
  3. 关于EXCEL超级链接被禁止的解决方法
  4. C# ICSharpCode.SharpZipLib.Zip 的使用
  5. log file sync
  6. java 定时器代码_Java定时器代码的编写
  7. mysql 的独占锁和排它锁_MySQL的排它锁与共享锁
  8. 11个好用到起飞的「Python字典」知识点!
  9. 牛客 - 字典序(思维)
  10. SAP Spartacus internationalization(i18n) 的实现 - 关于多语言,翻译支持的实现
  11. Paypal 在线支付接口应用从零开始,第2节,[支付API原理及流程]
  12. Mockito教程--思维导图笔记
  13. 荣耀50系列将增全新配色:尽显时尚艺术张力
  14. 结对编程1--模块化
  15. js href的用法
  16. python 车牌识别简单_如何用 Python 识别车牌
  17. 智协云店通+BitCOO的4WiN.io全球互贸链 | 翼次元空间+Fund++
  18. 【2018/10/11测试T3】葫芦
  19. Atcoder Grand Contest 005 题解
  20. htc hd如何刷新官方升级包--转symen

热门文章

  1. 个人草根站长如何靠广告联盟赚钱
  2. 基于 Docker 搭建 MySQL 一主两从复制
  3. chrome 怎么控制网速
  4. 如何在java中绘图_如何在Java绘图程序中绘制线条,矩形和圆圈?
  5. Python练习题(1)
  6. Android APP开发设计
  7. Tabby 安装步骤
  8. 淘宝运营是什么意思?运营要学习的内容有哪些?
  9. 数学 HDU 1290 献给杭电五十周年校庆的礼物
  10. 浅谈静电场的边值问题(包括数学物理方法和数值计算)