這里只能介紹下外圍模式開發的一般流程了,沒經歷過具體項目的洗禮,具體的坑點沒接觸到,以后如果有機會再加以補充。
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];}新聞熱點
疑難解答