关闭

IOS蓝牙4.0简单使用

标签: 蓝牙ios管理器
1521人阅读 评论(0) 收藏 举报
分类:

蓝牙使用流程图

Created with Raphaël 2.1.0CBCentralManagerCBCentralManagerCBPeripheralCBPeripheralServiceServiceCharacteristicsCharacteristics搜索设备设备被管理器发现链接该设备设备连接成功一个外设中有一个或者多个服务检索该设备的服务返回所有的服务一个服务中存在一个或者多个特征检索服务下面对应的特征返回服务下面的特征根据返回的特征,就可以进行对应的读写操作对对应的特征设置监听事件,当监听的特征的内容发生改变的时候会接受到对应的改变值。

详细说明

1、初始化CBCentralManager。

在初始化的时候需要传入两个参数:
第一个参数设置Delegate一般我们设置成self;
第二个需要传入一个队列,出入的不是主队列的话,那我们接收的时候也要在传入的队列里面才能接收到对应的值,所以一般第二个参数可以直接出入nil或者dispatch_get_main_queue()

2、实现代理方法

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

在该代理方法里面主要监听设备当前的蓝牙状态,根据蓝牙的状态来判断是否进行下一步的操作,状态主要返回如下内容:

    CBCentralManagerStateUnknown = 0,//当前状态不明确
    CBCentralManagerStateResetting,//
    CBCentralManagerStateUnsupported,//该设备不支持
    CBCentralManagerStateUnauthorized,//未被授权
    CBCentralManagerStatePoweredOff,//蓝牙关闭状态
    CBCentralManagerStatePoweredOn,//蓝牙开启状态

3、搜索周围的蓝牙设备调用

- (void)scanForPeripheralsWithServices:(nullable NSArray<CBUUID *> *)serviceUUIDs options:(nullable NSDictionary<NSString *, id> *)options

调用该方法的中心就不断的搜索周围的蓝牙设备,需要传入两个参数:
第一个参数是对应设备的UUID,如果出入nil就搜索周围的所有设备,如果出入了指定的UUID就只搜索出入的设备;
第二个参数是一个搜索的配置参数,该参数的具体配置,自己了解还不是很清楚,平时一般出入nil就可以了

4、在调用搜索周围设备的方法之后需要同时实现以下的代理方法

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

该代理方法里面四个参数主要的意思是:
第一个参数是当前的中心
第二个参数是对应的设备
第三个参数是对应设备蓝牙广播出来的信息
第四个参数是设备的蓝牙信号强度
其中我们主要使用到的是第二个参数,也就是发现的设备

5、得到了对应设备之后就要开始连接设备,连接设备我们调用

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;

在该方法中我们很明显的看出第一个参数是需要出入一个设备,那么我们就将刚刚发现的设备出入一个进去,第二个参数是需要出入一个字典属性,我这里一般出入的是@{ CBCentralManagerScanOptionAllowDuplicatesKey:@YES }其他属性我没有具体使用,有时间大家一起研究研究。

6、连接设备的时候同时也要实现以下两个代理方法

-(void)centralManager:(nonnull CBCentralManager *)central didDisconnectPeripheral:(nonnull CBPeripheral *)peripheral error:(nullable NSError *)error

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

在这两个代理方法里面,第一个方法是连接发生错误的时候调用的;第二个方法是两节成功之后会调用的,当调用成功之后会返回连接成功对应的中心和设备,这个时候我们要设置设备的代理因为检索设备的服务和服务下面对应的特征的时候都是通过代理的方式实现的

self.ConnectionDevice = peripheral;
self.ConnectionDevice.delegate = self;//设置对应的代理

7、通过连接成功的设备调用以下方法发现该设备下面的服务

- (void)discoverServices:(nullable NSArray<CBUUID *> *)serviceUUIDs;

该方法可以传入一个服务的UUID如果出入了对应的UUID之后就之后搜索对应UUID的服务。

8、调用发现服务方法的同时还需要实现对应的代理方法

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;

第一个参数是对应的设备,该设备下面有一个peripheral.services属性,通过该属性能够得到该设备下面的所有服务,
第二个参数就是对应的错误信息,当发生错误的时候我们需要做对应的处理

9、得到对应服务之后通过设备调用以下方法发现服务下面对应的特征

- (void)discoverCharacteristics:(nullable NSArray<CBUUID *> *)characteristicUUIDs forService:(CBService *)service;

第一个参数指定对应特征的UUID,如果传入则只搜索对应UUID的特征
第二个参数传入需要搜索特征的服务

10、调用发现特征方法的时候还需要实现

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;

这个代理方法会得到一个CBService在这个下面有一个service.characteristics这个属性里面有该服务下面所有的特征,我们就可以获取到特征了。

到此我们就已经连接了对应的设备,并拿到了对应设备下面的服务和特征了,为我们后面的蓝牙读写操作做好了基础了。


读写操作

1、写入操作调用以下方法实现

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

第一个参数是需要写入的数据
第二个参数是对应写入的特征
第三个参数是对应写入的类型一般是CBCharacteristicWriteWithResponseCBCharacteristicWriteWithoutResponse这两个类型

2、设置通知监听,调用以下方法实现

- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;

第一个参数一般情况设置成YES
第二个参数是需要监听的对应特征

3、读取对应特征下面的值,调用

- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;

该方法只需要传入需要读取的特征就OK了

4、在设置通知和读取值的时候记得一定要实现以下代理方法

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;

该代理方法在收到通知或者读取到值的时候都会调用,通过characteristic.value我们就得到了想要的值了。

蓝牙的手机端基本操作就差不多完成了,还有很多的地方补助,以后还要像大家学习学习.
最后给出一个自己写的demo

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4453次
    • 积分:84
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档