iOS蓝牙4.0 CoreBluetooth框架开发

原创 2016年02月29日 10:48:37

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;

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lizhijun_____/article/details/50763870

iOS开发-全面解析iOS蓝牙BLE4.0开发

只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发
  • 2017年03月24日 13:36

iOS开发- 蓝牙后台接收数据(BLE4.0)

最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据。本来以后会很麻烦, 但是学习了下..发现就2步而已。简单的不能再简单了。好了...
  • hitwhylz
  • hitwhylz
  • 2014-06-05 19:35:15
  • 24706

基于蓝牙4.0(btle)的简单通讯流程

初始化一个CentralManager 在iOS10以后,需要在 Info.plist 文件里面设置 NSBluetoothPeripheralUsageDescription 字段,添加访问蓝牙权...
  • hejiasu
  • hejiasu
  • 2017-06-19 21:23:25
  • 2725

iOS coreBluetooth编程中需要注意的问题

iOS 设备作为中心设备(central device)时需要注意:(1)一定要对central Manager保持强引用,也就是说central Manager需要是一个全局变量不能是局部变量,否则...
  • ohyeahhhh
  • ohyeahhhh
  • 2016-08-10 19:01:13
  • 2364

iOS开发——CoreBluetooth蓝牙开发(三)

在这一讲中,我们将学习如何开发Central蓝牙应用,包括: 建立Central管理模块CBCentralManager 发现和连接正在广播对Peripheral 在和Peripheral建立连接后获...
  • wangchi718
  • wangchi718
  • 2015-06-28 00:32:26
  • 982

iOS开发之玩转蓝牙CoreBluetooth

之前详细谈过不少关于HTTP协议的知识点,TCP/IP也通过tcpdump做过简单的介绍,但网络协议的本质其实是连接,设备或者端之间连接的方式有多种,常见的http或者基于tcp的socket只是森林...
  • xiaobo0134
  • xiaobo0134
  • 2016-11-01 11:22:02
  • 562

CoreBluetooth后台运行的实现

上一篇中实现了和蓝牙设备的通讯功能,在前台zhong
  • ox2A19
  • ox2A19
  • 2014-08-28 16:55:19
  • 1238

iOS之蓝牙开发—CoreBluetooth详解一

最近开始进行蓝牙模块的开发,下载一个名叫lightBlue的app,通过它可以扫描到周围开启的外部设别,并且可以进行连接,连接外部设备成功之后,就可以看到外部设别的相关信息,包含服务和特征的所有相关的...
  • wuzesong
  • wuzesong
  • 2016-03-18 16:25:21
  • 3105

iOS-蓝牙简介及CoreBluetooth.framework的使用

1.最新的4.0以其低功耗著称,所以一般也叫BLE(Bluetooth Low Energy)。iOS 有两个框架支持蓝牙与外设连接。一个是 ExternalAccessory。从ios3.0就开始支...
  • wuming22222
  • wuming22222
  • 2015-02-27 11:35:28
  • 1257

iOS coreBlueTooth发送16进制

这样可以:         NSMutableData *data=[[NSMutableData alloc] initWithCapacity:0];         int8_t byte0...
  • harder321
  • harder321
  • 2014-03-06 10:39:46
  • 1411
收藏助手
不良信息举报
您举报文章:iOS蓝牙4.0 CoreBluetooth框架开发
举报原因:
原因补充:

(最多只允许输入30个字)