CoreBlueTooth的使用要求设备必须支持蓝牙4.0,并且手机型号必须是iPhone4以上。
CoreBlueTooth关键在于两个名词,周边和中央,每个IOS设备都可以是一个周边,也可以是一个中央,但不能既是周边又是中央。
周边可以广播数据,可以告诉周围其他设备来接受数据,中央就是接收数据的那个设备。
如果一个ios手机,它既能当作外围设备,又能当作中央设备,那么在代码中就必须实现外围设备和中央设备这两种代码。
外围设备的实现大体分为以下步骤:
1,创建周边管理类,Peripheral Manager
2,为这个Peripheral Manager添加它自己的信息,比如各种服务,以及服务里面包括的各种特征。
3,广播服务,告知其他设备该外围的存在。
4,中央设备连接之后,与中央设备进行交互。
具体实现:
1,在一个类中引入CoreBluetooth,并实现CBPeripheralManagerDelegate协议,在.h文件中声明CBPeripheralManager ,以及需要添加的服务和特征
#import <CoreBluetooth/CoreBluetooth.h>
@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<CBATTRequest > *)requests;