這里只能介紹下外圍模式開發(fā)的一般流程了,沒經(jīng)歷過具體項目的洗禮,具體的坑點沒接觸到,以后如果有機(jī)會再加以補(bǔ)充。
1.打開peripheralManager,設(shè)置peripheralManager的代理
2.創(chuàng)建characteristics,characteristics的PRoperties 創(chuàng)建service,把characteristics添加到service中,再把service添加到peripheralManager中
3.開啟廣播advertising
4.對central的操作進(jìn)行響應(yīng)
4.1 讀characteristics請求4.2 寫characteristics請求4.3 訂閱和取消訂閱characteristics1.準(zhǔn)備工作,引入頭文件和代理
#import <CoreBluetooth/CoreBluetooth.h>@interface ViewController ()<CBPeripheralManagerDelegate>@property (nonatomic,strong) CBPeripheralManager * perManager;@end2.打開peripheralManager,設(shè)置peripheralManager的代理
_perManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];/* 會自動回調(diào)方法 - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral;只有在peripheral.state == CBManagerStatePoweredOn的狀態(tài)下創(chuàng)建characteristics 和 service才有用*/3.創(chuàng)建characteristics,characteristics的description 創(chuàng)建service,把characteristics添加到service中,再把service添加到peripheralManager中
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{ if (peripheral.state == CBManagerStatePoweredOn) { //服務(wù) uuid換成自己的 CBUUID * serviceUUID = [CBUUID UUIDWithString:@"1111"]; CBMutableService * service = [[CBMutableService alloc] initWithType:serviceUUID primary:YES]; /*特征值 uuid換成自己的 properties也換成自己的,這里設(shè)置成可讀、可寫、廣播*/ CBUUID * characteristicUUID = [CBUUID UUIDWithString:@"2222"]; CBCharacteristic * characteristic = [[CBMutableCharacteristic alloc] initWithType:characteristicUUID properties:(CBCharacteristicPropertyRead|CBCharacteristicPropertyWrite|CBCharacteristicPropertyNotify) value:nil permissions:CBAttributePermissionsReadable]; //特征值加入到服務(wù) service.characteristics = @[characteristic]; /*注冊服務(wù) 注冊成功后的服務(wù)才能廣播 注冊后會自動回調(diào)方法 - (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(nullable NSError *)error; */ [_perManager addService:service]; }}4.開啟廣播advertising 。 調(diào)用方法- (void)startAdvertising:(nullable NSDictionary < NSString *, id > *)advertisementData;來開啟廣播, 參數(shù)可選: CBAdvertisementDataLocalNameKey CBAdvertisementDataTxPowerLevelKey CBAdvertisementDataServiceUUIDsKey CBAdvertisementDataServiceDataKey CBAdvertisementDataManufacturerDataKey CBAdvertisementDataOverflowServiceUUIDsKey CBAdvertisementDataIsConnectable CBAdvertisementDataSolicitedServiceUUIDsKey
- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{ //開啟廣播服務(wù) [_perManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey:[CBUUID UUIDWithString:@"1111"]}];}//開啟廣播的回調(diào)- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error {}5.1 讀characteristics請求
// 讀數(shù)據(jù)請求- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request { //請求的響應(yīng) NSData *data = request.characteristic.value; //center想讀取的數(shù)據(jù) [request setValue:data]; [_perManager respondToRequest:request withResult:CBATTErrorSuccess];}5.2 寫characteristics請求
//寫數(shù)據(jù)請求- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *)requests { //請求的響應(yīng) //需要轉(zhuǎn)換成CBMutableCharacteristic對象才能進(jìn)行寫值 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(@"訂閱了 %@的數(shù)據(jù)",characteristic.UUID); //每秒執(zhí)行一次給主設(shè)備發(fā)送一個當(dāng)前時間的秒數(shù) 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(@"取消訂閱 %@的數(shù)據(jù)",characteristic.UUID); //取消回應(yīng) [timer invalidate];}新聞熱點
疑難解答