1、本文基于junkchen的blelib框架进行讲解。
说实话。讲ble4.0这一块的文章目前数量是比较多的,这一块的框架也是非常多。本来也想着自己总结封装一个框架出来,但是在用了博主的blelib以后觉得也写不出来比他更方便的框架了。就根据他这个来讲解吧。
2、低功耗蓝牙基础理论
其实理论这一块的东西我这里也不好去照搬一些文字然后过来介绍,这里给大家介绍两篇博文自己理解一下,至于重点理论我会单独在后面逐步总结。
https://blog.csdn.net/chenliqiang12345678/article/details/50504406
总归的来说ble开发有深有浅。有的就做到搜索这一块获取信号值、设备名、mac地址等等。但是我做的比较深入。包括三次握手认证以及后一段的数据写入。总的来说几个步骤有:搜索、连接、发现服务、数据订阅读取以及写入。我这样说对刚开始接触的朋友来说可能不太理解,我就直接把我项目的步骤说一下。首先是搜索设备、一切是基于回调实现的,搜索到一个设备回调返回一次值。也可以自己通过广播去接收。搜索到自己想要连接的设备然后进行连接、连接以后发现服务。如果不知道服务的童鞋记得搜索一下服务、特征值这两个东西。每个服务有对应的UUID,每个服务下对应多个特征值、基本硬件那边给的都是uuid来识别需要的特征值以及服务、根据自己的需求去进行下一步,比如我的需求是订阅某一个特征值,然后就对对应的特征值进行订阅然后从订阅回调接收设备返回的值。然后再进行写入。我不知道写到这里了大家有没有不理解的地方,有问题在评论区留言吧。
3、框架以及步骤具体讲解
框架这一块可以实现一对多的多连接,但是我用的只是单连接那一块。这一块的讲解我会附加上我自己的代码进行更加实用性的讲解
框架这块我是建议直接导入model来进行使用,单纯的依赖过来有些地方根据自己业务修改的地方不能修改,博主自己也记得有个boolean值需要修改。但是忘了是哪一块的了。具体的导入方法我就不说了,文章有讲。
3.1绑定Bleservice
绑定这一块,那个博主写的只是绑定在activity,如果我们实际要求用的话肯定有很多activity需要绑定。怎么办呢。这就是我要强调的第一个点了。封装,写一个自定义的Application(记得清单文件中配置自己写的)。
public class BlueToothApplicationextends Application{
private BleServicemBleService;
private boolean mIsBind;
public static User.DataBean.UserBeanuserBean;
public void onCreate() {
super.onCreate();
doBindService();
SharedPreferencesUtil.init(this, Constans.SHARE_NAME,0);
}
@Override
public void onLowMemory() {
super.onLowMemory();
}
@Override
public void onTerminate() {
super.onTerminate();
doUnBindService();
}
//绑定蓝牙的操作
private ServiceConnectionserviceConnection =new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIsBind=true;
mBleService = ((BleService.LocalBinder) service).getService();
if (mBleService.initialize()) {
if (mBleService.enableBluetooth(true)) {
Toast.makeText(BlueToothApplication.this, "蓝牙已经开启", Toast.LENGTH_SHORT).show();
BlueToothUtils.getInstance().init(mBleService);
}
}else {
Toast.makeText(BlueToothApplication.this, "蓝牙不支持", Toast.LENGTH_SHORT).show();
}
}
@Override
public 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;
}
}
}
这里我是通过自定义的application与bleservice进行绑定,然后通过写一个单例的BlueToothUtils工具类传入一个绑定好的bleservice对象进行蓝牙所有操作的处理。把所有蓝牙操作的细节封装在一个工具类进行处理。当外部想要进行蓝牙操作时只需要写接口进行操作即可。封装蓝牙工具类的好处有两个方面,一个是把内部处理封装起来,提高安全性,第二个是简约开发。
3.2自定义BluToothUtils讲解
前面我们已经说过BluetoothUtils是一个单例类了,直接通过实例化的BleService对象进行蓝牙相关操作。
这里我不太方便放代码上来,因为我们公司的协议都是自己定的,细节不好暴露。尽量讲的详细一些吧。传入BleService的对象以后进行监听回调的注册。监听一共有6种,我们一般要用到的有扫描监听、连接监听、服务监听、数据监听。
3.2.1扫描回调
调用了扫描方法以后。扫描到附近的Ble设备以后,回调会接收到一个设备的信息。这些信息有设备名、设备的MAC地址以及设备的信号强度等等,Ble设备会不断的发送广播。回调也会不断的接收结果,设备重复发送的广播库里面已经处理。如果你要做一些信号强度测试之类的软件就可以修改库里面的重复处理机制。正常情况下,回调接收到的值都是不同设备的信息。要注意一点的是这里的MAC是要经过格式处理的,回调接收到的MAC格式是XX:XX:XX:XX:XX:XX的。
3.2.2连接回调
连接这一块没什么好说的,调用连接方法以后四个状态之中我自己调试只会触发两种回调,一个是断开,然后一个是已连接的。基本上后期你有一些类似于监听或者超时这样的操作都在这两种回调方式里面去用。
3.2.3服务发现回调
服务发现回调在我的实践中并不用调用方法,连接上以后会自动触发服务发现回调。UUID了解一下。他的格式也了解一下,上图的bfd3 bfd2等等是截取了uuid中的某些特定字段来做判断,当服务发现以后就可以根据自己的需求进行订阅、读数据以及写数据。步骤具体就是先找到自己要的服务,然后通过服务再找到自己要去操作的character(特征值),然后调用库中的三个对数据进行操作的方法。
3.2.4数据回调
数据回调这一块接收数据的代码你们可以直接用,但是判断包头的条件要改成自己的,蓝牙通信数据包有大有小,小于20个字节的数据包只需要接收一次,大于20个字节的数据要接收多次,同时我们假定这多次在20个字节以内的包是无序接收的,这里我的需求是调用订阅方法接收设备返回的值,以后的操作设备给你返回的值都是这个回调。同时如果你调用写入方法在写入回调中接收的值是你写入成功并且返回每次你写入的字段。读取回调这一块我并没有尝试过,但是调用对应的读取方法应该是可以读取到设备的值,在回调里面接收。
总结
写到这的话,基本上对蓝牙操作这一块的东西差不多了,碰到问题欢迎在评论区留言。下篇我将结合项目代码对蓝牙和手机交互这一块做更加详细的讲解