Ble4.0开发详解(上篇)

1、本文基于junkchen的blelib框架进行讲解。

原文地址https://blog.csdn.net/kjunchen/article/details/50909410

说实话。讲ble4.0这一块的文章目前数量是比较多的,这一块的框架也是非常多。本来也想着自己总结封装一个框架出来,但是在用了博主的blelib以后觉得也写不出来比他更方便的框架了。就根据他这个来讲解吧。

2、低功耗蓝牙基础理论

其实理论这一块的东西我这里也不好去照搬一些文字然后过来介绍,这里给大家介绍两篇博文自己理解一下,至于重点理论我会单独在后面逐步总结。

https://blog.csdn.net/chenliqiang12345678/article/details/50504406

https://blog.csdn.net/chaoyue0071/article/details/43450183/

总归的来说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对象进行蓝牙相关操作。


图3.1单例类截图

这里我不太方便放代码上来,因为我们公司的协议都是自己定的,细节不好暴露。尽量讲的详细一些吧。传入BleService的对象以后进行监听回调的注册。监听一共有6种,我们一般要用到的有扫描监听、连接监听、服务监听、数据监听。

3.2.1扫描回调

图3.2扫描回调

调用了扫描方法以后。扫描到附近的Ble设备以后,回调会接收到一个设备的信息。这些信息有设备名、设备的MAC地址以及设备的信号强度等等,Ble设备会不断的发送广播。回调也会不断的接收结果,设备重复发送的广播库里面已经处理。如果你要做一些信号强度测试之类的软件就可以修改库里面的重复处理机制。正常情况下,回调接收到的值都是不同设备的信息。要注意一点的是这里的MAC是要经过格式处理的,回调接收到的MAC格式是XX:XX:XX:XX:XX:XX的。

3.2.2连接回调


图3.3连接回调

连接这一块没什么好说的,调用连接方法以后四个状态之中我自己调试只会触发两种回调,一个是断开,然后一个是已连接的。基本上后期你有一些类似于监听或者超时这样的操作都在这两种回调方式里面去用。

3.2.3服务发现回调


图3.4服务发现回调

服务发现回调在我的实践中并不用调用方法,连接上以后会自动触发服务发现回调。UUID了解一下。他的格式也了解一下,上图的bfd3 bfd2等等是截取了uuid中的某些特定字段来做判断,当服务发现以后就可以根据自己的需求进行订阅、读数据以及写数据。步骤具体就是先找到自己要的服务,然后通过服务再找到自己要去操作的character(特征值),然后调用库中的三个对数据进行操作的方法。

3.2.4数据回调


数据回调这一块接收数据的代码你们可以直接用,但是判断包头的条件要改成自己的,蓝牙通信数据包有大有小,小于20个字节的数据包只需要接收一次,大于20个字节的数据要接收多次,同时我们假定这多次在20个字节以内的包是无序接收的,这里我的需求是调用订阅方法接收设备返回的值,以后的操作设备给你返回的值都是这个回调。同时如果你调用写入方法在写入回调中接收的值是你写入成功并且返回每次你写入的字段。读取回调这一块我并没有尝试过,但是调用对应的读取方法应该是可以读取到设备的值,在回调里面接收。

总结

写到这的话,基本上对蓝牙操作这一块的东西差不多了,碰到问题欢迎在评论区留言。下篇我将结合项目代码对蓝牙和手机交互这一块做更加详细的讲解

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 因为自己的项目中有用到了蓝牙相关的功能,所以之前也断断续续地针对蓝牙通信尤其是BLE通信进行了一番探索,整理出了一...
    陈利健阅读 114,683评论 172 294
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,984评论 0 6
  • 蓝牙 注:本文翻译自https://developer.android.com/guide/topics/conn...
    RxCode阅读 8,673评论 11 99
  • 天上没有月亮,只点缀着几颗星星,送离人出行后,边出来进去的收拾边听李碧华的《青蛇》。因好奇心被诱发利用,500岁的...
    青竹笑阅读 214评论 0 0