这里只能介绍下外围模式开发的一般流程了,没经历过具体项目的洗礼,具体的坑点没接触到,以后如果有机会再加以补充。
1.打开peripheralManager,设置peripheralManager的代理
2.创建characteristics,characteristics的PRoperties 创建service,把characteristics添加到service中,再把service添加到peripheralManager中
3.开启广播advertising
4.对central的操作进行响应
4.1 读characteristics请求4.2 写characteristics请求4.3 订阅和取消订阅characteristics1.准备工作,引入头文件和代理
#import <CoreBluetooth/CoreBluetooth.h>@interface ViewController ()<CBPeripheralManagerDelegate>@property (nonatomic,strong) CBPeripheralManager * perManager;@end2.打开peripheralManager,设置peripheralManager的代理
_perManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];/* 会自动回调方法 - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral;只有在peripheral.state == CBManagerStatePoweredOn的状态下创建characteristics 和 service才有用*/3.创建characteristics,characteristics的description 创建service,把characteristics添加到service中,再把service添加到peripheralManager中
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{ if (peripheral.state == CBManagerStatePoweredOn) { //服务 uuid换成自己的 CBUUID * serviceUUID = [CBUUID UUIDWithString:@"1111"]; CBMutableService * service = [[CBMutableService alloc] initWithType:serviceUUID primary:YES]; /*特征值 uuid换成自己的 properties也换成自己的,这里设置成可读、可写、广播*/ CBUUID * characteristicUUID = [CBUUID UUIDWithString:@"2222"]; CBCharacteristic * characteristic = [[CBMutableCharacteristic alloc] initWithType:characteristicUUID properties:(CBCharacteristicPropertyRead|CBCharacteristicPropertyWrite|CBCharacteristicPropertyNotify) value:nil permissions:CBAttributePermissionsReadable]; //特征值加入到服务 service.characteristics = @[characteristic]; /*注册服务 注册成功后的服务才能广播 注册后会自动回调方法 - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(nullable NSError *)error; */ [_perManager addService:service]; }}4.开启广播advertising 。 调用方法- (void)startAdvertising:(nullable NSDictionary < NSString *, id > *)advertisementData;来开启广播, 参数可选: CBAdvertisementDataLocalNameKey CBAdvertisementDataTxPowerLevelKey CBAdvertisementDataServiceUUIDsKey CBAdvertisementDataServiceDataKey CBAdvertisementDataManufacturerDataKey CBAdvertisementDataOverflowServiceUUIDsKey CBAdvertisementDataIsConnectable CBAdvertisementDataSolicitedServiceUUIDsKey
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{ //开启广播服务 [_perManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey:[CBUUID UUIDWithString:@"1111"]}];}//开启广播的回调- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error {}5.1 读characteristics请求
// 读数据请求- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request { //请求的响应 NSData *data = request.characteristic.value; //center想读取的数据 [request setValue:data]; [_perManager respondToRequest:request withResult:CBATTErrorSuccess];}5.2 写characteristics请求
//写数据请求- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests { //请求的响应 //需要转换成CBMutableCharacteristic对象才能进行写值 CBMutableCharacteristic *c =(CBMutableCharacteristic *)request.characteristic; c.value = request.value; [_perManager respondToRequest:[requests firstObject] withResult:CBATTErrorSuccess];}5.3 订阅和取消订阅characteristics
//订阅characteristics-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic{ NSLog(@"订阅了 %@的数据",characteristic.UUID); //每秒执行一次给主设备发送一个当前时间的秒数 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(sendData:) userInfo:characteristic repeats:YES];}//取消订阅characteristics-(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic{ NSLog(@"取消订阅 %@的数据",characteristic.UUID); //取消回应 [timer invalidate];}新闻热点
疑难解答