蓝牙封装 iOS

2018-05-04  本文已影响0人  萌萌萌萌萌萌吗

按照目前的发展来看,智能家居已经成为当今发展的一种主流趋势。本来半年前都想写一篇简书来介绍蓝牙处理的流程,但是嘛。。。懒癌无可救药了。本文仅写给那些刚接触蓝牙的朋友,写的不好的地方,多多包涵,有错误的,麻烦提出,大家一起进步!!好了,废话不多说了,开始进入正文。本文所讲的都是基于coreblue 4.0,其他比较基础的概念请参照网上一些讲的比较好的简书,推荐BabyBlueTooth,一个写的超级牛逼的框架,膜拜~ 大神关于蓝牙介绍的链接:http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html

一.蓝牙五个最基本也最重要的概念

(1)中央设备

    中央设备,即CBPeripheralManager对象,可以扫描和监听任何在广告(advertising)的外围设备

(2)外设

    外设,即CBPeripheral对象,你可以简单的理解成你要与之进行通讯的智能设备。

(3)特征

    蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口;

(4)服务

    存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位;

(5)UUID

    可以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。

二.蓝牙通信的基本步骤

(1)开启蓝牙,切记!!只有蓝牙在开启的状态下,才能进行设备的扫描!!

(2)搜索你要进行交互的智能设备,如果不做筛选处理的话,是会搜出附近所有的蓝牙,怎么筛选,下面也会具体讲到,客官,不用着急。

(3)找到你要进行交互的蓝牙之后,连接,然后启动服务的扫描

(4)寻找对应服务下特定的你要与之交互的特征

(5)数据的收发

三.具体分析(迟些会将蓝牙部分的代码抽离出来上传至github,具体结合代码一起看,代码的注释写的比较多,应该能看懂的)

我在自己的项目中是将蓝牙封装成了几个类

(1)用来存放存放头文件的类

        这一个类应该就不用怎么介绍了,就是存放封装的类的头文件

(2)中央管理类

        这个类是用来扫描,连接,解绑,重连等操作

(3)外设管理类

    这个类是扫描外设服务以及特征,并且接收外设传送过来的数据

(4)用来发指令的类

    这个类是专门用来发指令的,如果项目中要发的指令比较多的话,可以统一在这个类里面处理

(5)数据处理类

    这个类也是看项目需求,如果你不想要这么多的类的话,这个也是可以去掉的。

(6)通知宏定义类

    这个类也不用怎么讲了,就是将项目中蓝牙部分的通知的名字抽离出来,定义成宏的显示,比较好看!

四.具体代码理解


具体代码目录


XxiBluetoothManager

这个类相当于中心设备,用来处理扫描、连接、解绑、重连

(1)首先创建一个单例,保证在程序的每一个地方都可以调用到。然后初始化蓝牙中心设备

初始化中心设备并添加监听

(2)开始扫描,创建一个定时器,调用蓝牙的扫描设备的方法

开始扫描和结束扫描

(3)遵循coreBlue的代理方法,- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber*)RSSI,当扫描到外设的时候就会跑到这个方法里面来。我们可以

在这里添加对应的过滤条件

过滤设备

(4)连接设备

连接设备

(5)设备连接成功时调用- (void)centralManager:(CBCentralManager*)central didConnectPeripheral:(CBPeripheral*)peripheral记录当前连接的外设,并将当前连接的外设传给封装好的外设类XxiPeripheral.下面即将在这个类里面进行数据的获取。

设备连接成功保存外设

(6)蓝牙重连的方法

蓝牙重连

XxiPeripheral

这个类是当前连接的外设,在这里进行数据的获取和解析

(1)当连接设备成功后,就调用方法启动服务的扫描。然后再扫描服务里面你需要的特征,保存对应的读写特征

扫描服务以及特征

(2)- (void)peripheral:(CBPeripheral*)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError*)error在这个里面进行数据的获取以及解析。

上一篇下一篇

猜你喜欢

热点阅读