iOS蓝牙4.0 CoreBluetooth框架开发

来源:互联网 发布:大数据知识框架 编辑:程序博客网 时间:2024/06/04 18:52

CoreBluetooth框架的核心其实是两个东西,peripheral和central,可以理解成外设和中心。对应他们分别有一组相关的API和类。

1

周边(Peripheral)是生成或者保存了数据的设备,中央(Central)是使用这些数据的设备。所有可用的iOS设备可以作为周边(Peripheral)也可以作为中央(Central),但不可以同时即是周边也是中央。

周边和中央这两个角色在CoreBluetooth框架中是用两个类表示的,CBPeripheralManager这个类代表周边,CBCentralManager这个类代表中央。你可以认为周边是一个广播式数据的设备,他广播到外部世界说他这有数据,并且也说明了提供的服务。另一边,中央开始扫描附近有没有服务,如果中央发现了想要的服务,然后中央就会请求周边,一旦连接建立成功,一旦连接建立成功,两个设备之间就开始交换传输数据了。在中央这边,CBService类代表服务,CBCharacteristic类代表特征。在周边这边,CBMutableService类代表服务,CBMutableCharacteristic类代表特征。
每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。比如说,一台蓝牙4.0设备,用特征A来表述自己的出场信息,用特征B来与手法数据等。每一个服务和特征都需要用一个UUID去标识,UUID是一个16bit或者128bit的值。如果你要创建你得中央-周边App,你需要创建自己的128bit的UUID。你必须要确定你自己的UUID不能和其他已经存在的服务冲突。如果你正要创建一个自己的设备,需要实现标准委员会需求的UUID;如果你只是创建一个中央-周边App,我建议你打开MacOS X的terminal.app,用uuidgen命令生成一个128bit的UUID。你应该用该命令两次,生成两个UUID,一个是服务用的,一个是特征用的。然后你需要添加他们到中央和周边App中。

蓝牙设备硬件厂商通常都会提供他们的设备里面各个服务(service)和特征(characteristics)的功能,比如哪些是用来交互(读写),哪些可获取模块信息(只读)等。App和硬件之间通讯,App的角色是central,硬件角色就是peripheral,如果是App和App之间通讯,那么iOS这便是central,另一个iOS设备就是peripheral了。这里要介绍App和硬件之间的通讯,也就是介绍central。

作为一个中心要实现的完整通讯,一般要经过这样几个步骤:
建立中心角色—>扫描外设—>连接外设—>扫描外设中的服务和特征—>与外设做数据交互—>断开连接。
首先在我自己类的头文件中包含CoreBluetooth的头文件,并集成两个协议CBCentralManagerDelegate,CBPeripheralDelegate。

1.创建中心角色
将CBCentralManagerDelegate协议委托给当前类实力,这里有个@required协议方法
-(void)centralManagerDidUpdateState:(CBCentralManager*)central;
当中心角色的状态发生变化的时候会触发这个方法。这个方法中通过获取中心角色的状态对它发布命令,你只能在central的state时CBCentralManagerStatePoweredOn的时候对它发布命令,当status的值低于CBCentralManagerStatePoweredOn的时候以为着扫描停止,并且任何已连接的外设都已经断开,当status的值低于CBCentralManagerStatePoweredOff时,所有的外设对象将中心角色中作为,而且必须重新发现。
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

2.扫描外设
创建中心以后,我们在CentralMnagerDidUpdateState:方法中获取central的status时CBCentralManagerStatePoweredOn的时候来扫描外设
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]
options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
这里的TRANSFER_SERVICE_UUID就是硬件厂商提供的服务UUID,如果第一个参数指定为空,那么所有的外设服务将被返回。

3.连接外设
当扫描到外设以后,系统会通过以下代理方法
- (void)centralManager:(CBCentralManager )central didDiscoverPeripheral:(CBPeripheral )peripheral advertisementData:(NSDictionary )advertisementData RSSI:(NSNumber )RSSI
告诉我们设备的信息,然后我们就可以连接相应的设备,我们可以通过RSSI.integerValue来获取信号强度,在这个方法中,我们可以连接想要连接的外设,代码如下:
[self.centralManager connectPeripheral:peripheral options:nil];
如果连接失败,会触发代理方法
-(void)centralManager:(CBCentralManager )central didFailToConnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;
如果连接成功,会触发代理方法:
- (void)centralManager:(CBCentralManager )central didConnectPeripheral:(CBPeripheral )peripheral;
我们可以在这里扫描外设中的服务

4.扫描外设中的服务和特征
[peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
如果参数为空,将返回外设中所有可用的服务。通过如下代理方法返回被扫描的服务。
- (void)peripheral:(CBPeripheral )peripheral didDiscoverServices:(NSError )error;
如果error不为空,则扫描失败,反之,扫描成功,我们可以继续扫描服务中的特征。
[peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]] forService:service];
这里的TRANSFER_CHARACTERISTIC_UUID就是硬件厂商提供的特征UUID,如果第一个参数指定为空,那么所有的该服务的特征将被返回。
通过如下代理方法返回被扫描的特征。
- (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService)service error:(NSError *)error;
如果error不为空,则扫描失败,反之,扫描成功,我们可以继续枚举服务中的特征,通过CBCHaracteristic的properties来读取特征的属性,数据的读分为两种,一种是直接读,另一种是通知。当属性CBCharacteristicPropertyRead是可读,CBCharacteristicPropertyNotify是可通知,当特征的属性是通知的时候,我们通过如下设置来支持通知,如果你希望特征的value发生变化的时候我们被告知,就要设置YES,反之为NO。
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
这个设置会通过以下代理方法来告知是否设置成功,如果设置成功,error为nil,反之失败。
-(void)peripheral:(CBPeripheral )peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;
设置成功以后,会通过以下代理方法告知我们characteristic的value发生变化,同样地,这个代理方法也会在你调用readValueForCharacteristic:方法的时候被触发。
-(void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

5.与外设做数据交互
读上面已经讲到
写数据:
[_discoveredPeripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
通过CBCharacteristicWriteWithResponse属性,我们可以通过以下代码方法被告知数据是否发送成功,error为空则成功,否则失败。
-(void)peripheral:(CBPeripheral )peripheral didWriteValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error;

6.断开连接
[self.centralManager cancelPeripheralConnection:peripheral];
我们可以通过以下代码方法被告知是否断开成功,error为空则成功,否则失败。
- (void)centralManager:(CBCentralManager )central didDisconnectPeripheral:(CBPeripheral )peripheral error:(NSError *)error;

0 0
原创粉丝点击