CoreBlueTooth的使用要求设备必须支持蓝牙4.0,并且手机型号必须是iPhone4以上。
CoreBlueTooth关键在于两个名词,周边和中央,每个IOS设备都可以是一个周边,也可以是一个中央,但不能既是周边又是中央。
周边可以广播数据,可以告诉周围其他设备来接受数据,中央就是接收数据的那个设备。
如果一个ios手机,它既能当作外围设备,又能当作中央设备,那么在代码中就必须实现外围设备和中央设备这两种代码。
外围设备的实现大体分为以下步骤:
1,创建周边管理类,Peripheral Manager
2,为这个Peripheral Manager添加它自己的信息,比如各种服务,以及服务里面包括的各种特征。
3,广播服务,告知其他设备该外围的存在。
4,中央设备连接之后,与中央设备进行交互。
具体实现:
1,在一个类中引入CoreBluetooth,并实现CBPeripheralManagerDelegate协议,在.h文件中声明CBPeripheralManager ,以及需要添加的服务和特征
#import@property (nonatomic, strong) CBPeripheralManager *manager; @property (nonatomic, strong) CBMutableService*cutomService; @property (nonatomic, strong) CBMutableCharacteristicclass*customCharacteristic;
2,在viewDidLoad中初始化manager。
self.manager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
3,实现peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { switch (peripheral.state) { case CBPeripheralManagerStatePoweredOn: [self setupService]; break; default: NSLog(@"Peripheral Manager did change state"); break; } }
这个代理方法在设备打开蓝牙或关闭蓝牙时运行,如果设备不支持蓝牙,做一些提醒。setupService是自己实现的添加服务的方法。
4,添加服务以及服务的特征。实现上面的setupService方法。
- (void)setupService { CBUUID *characteristicUUID = [CBUUID UUIDWithString:kCharaUUID]; self.customCharacteristic = [[CBMutableCharacteristic alloc] initWithType: characteristicUUID properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable]; CBUUID *serviceUUID = [CBUUID UUIDWithString:kServiceUUID]; self.customService = [[CBMutableService alloc] initWithType:serviceUUID primary:YES]; [self.customService setCharacteristics:@[self.customCharacteristic]]; [self.peripheralManager addService:self.customService]; }
CBCharacteristicPropertyNotify 表示该特征可以被其他设备订阅。
5,实现peripheralManager:didAddService:error:
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error { if (error == nil) { // Starts advertising the service [self.peripheralManager startAdvertising:@{ CBAdvertisementDataLocalNameKey : @"ICServer", CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:kServiceUUID]] }]; } }
如果[self.peripheralManager addService:self.customService]执行了,也就是外围设备添加了服务,就会执行peripheralManager:didAddService:error: 然后执行startAdvertising开始广播。
6,收到中央设备的消息后运行的方法。
//订阅 -(void)peripheralManager:(CBPeripheralManager )peripheral central:(CBCentral )central didSubscribeToCharacteristic:(CBCharacteristic )characteristic; //取消订阅 -(void)peripheralManager:(CBPeripheralManager )peripheral central:(CBCentral )central didUnsubscribeFromCharacteristic:(CBCharacteristic )characteristic; //读消息 -(void)peripheralManager:(CBPeripheralManager )peripheral didReceiveReadRequest:(CBATTRequest )request; //写消息 -(void)peripheralManager:(CBPeripheralManager )peripheral didReceiveWriteRequests:(NSArray*)requests;