最新iOS蓝牙连接
废话不多说直接上代码,不懂可以问我。。。哈哈。
#import "MBBlueToothManager.h" @interface MBBlueToothManager()<CBPeripheralDelegate,CBCentralManagerDelegate>{ CBCentralManager *manager; CBUUID *identifiers; NSData *_dataValue; L2_command_id_t _keyId; UInt8 _moudleId; } @end static MBBlueToothManager *manager; @implementation MBBlueToothManager - (instancetype)init { self = [super init]; if (self) { pairDeviceMutArr = [[NSMutableArray alloc]init]; } return self; } + (instancetype)shareManager { if (manager == nil) { manager = [[MBBlueToothManager alloc]init]; } return manager; } - (void)startScan { manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()]; if (manager.state != CBCentralManagerStatePoweredOn) { // [self alertWithTitle:@"蓝牙未打开" Message:nil certainActionString:@"确定" cancelActionString:@"取消"]; // return; NSLog(@"=====please open your BlueTooth"); } NSLog(@"============= startScan"); [self RetryConnectSaveDevice]; } - (void)tryToConnect:(CBPeripheral *)pairDevice { [manager stopScan]; // NSDictionary *options = @{CBConnectPeripheralOptionNotifyOnDisconnectionKey: @TRUE}; [manager connectPeripheral:pairDevice options:nil]; } - (void)disConnectDevice { if (self.device.state != CBPeripheralStateConnected) { return; } [manager cancelPeripheralConnection:self.device]; } #pragma mark -CBPeripheralDelegate - (void)centralManagerDidUpdateState:(CBCentralManager *)central { CBCentralManagerState state = central.state; switch (state) { case CBCentralManagerStateUnknown: break; case CBCentralManagerStatePoweredOn: [manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}]; break; case CBCentralManagerStatePoweredOff: [self disConnectDevice]; break; case CBCentralManagerStateUnsupported: break; case CBCentralManagerStateUnauthorized: break; default: break; } } - (void)RetryConnectSaveDevice { NSString *uuidStr = [[NSUserDefaults standardUserDefaults] stringForKey:DidConnectDeviceUUID]; NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidStr]; if (uuidStr != nil) { // NSLog(@" ------------------------------------retrievePeripheralsWithIdentifiers"); NSArray *arr = [manager retrievePeripheralsWithIdentifiers:@[uuid]]; for (CBPeripheral *aperipheral in arr) { // if ([aperipheral.identifier.UUIDString isEqualToString: peripheral.identifier.UUIDString]) { NSLog(@"connectPeripheral ======= %@",[aperipheral debugDescription]); [manager connectPeripheral:aperipheral options:nil]; // [manager stopScan]; // } } }else{ } } -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI { if ([peripheral.identifier.UUIDString isEqualToString:[[NSUserDefaults standardUserDefaults] stringForKey:DidConnectDeviceUUID]]) { [manager connectPeripheral:peripheral options:nil]; } // if ([peripheral.name containsString:@"MB12"]) { [[NSNotificationCenter defaultCenter] postNotificationName:kJRDUpdatePeripheralList object:peripheral]; // [manager connectPeripheral:peripheral options:nil]; // }else{ // // } } - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { [manager stopScan]; NSLog(@"didConnectPeripheral = %@",peripheral); self.device = peripheral; [[NSUserDefaults standardUserDefaults] setObject:peripheral.identifier.UUIDString forKey:DidConnectDeviceUUID]; peripheral.delegate = self; [peripheral discoverServices:nil]; } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"didFailToConnectPeripheral = %@",peripheral); [[NSNotificationCenter defaultCenter] postNotificationName:kBHBLEUartDeviceConnectFailNotification object:nil]; } - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { } #pragma mark - CBPeripheralDelegate -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { NSLog(@"didDiscoverServices = %@",peripheral.services); for(CBService *svc in peripheral.services ) { [peripheral discoverCharacteristics:nil forService:svc]; } } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { NSLog(@"didDiscoverCharacteristicsForService = %@",service.characteristics); for (CBCharacteristic *character in service.characteristics) { if ([[character.UUID UUIDString] isEqual:kBAIDU_HEALTH_BRACELET_UART_RX_CHARACTER_UUID_STRING]) { [peripheral setNotifyValue:YES forCharacteristic:character]; [[NSNotificationCenter defaultCenter] postNotificationName:kBHBLEUartDeviceConnectOKNotification object:nil]; NSLog(@"character = %@",character); } } } - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error { if (!error) { NSLog(@"数据写入成功"); }else{ NSLog(@"数据写入失败"); } } - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { NSLog(@"didUpdateNotificationStateForCharacteristic"); CBUUID *characteristicUUID = [CBUUID UUIDWithString:kBAIDU_HEALTH_BRACELET_UART_RX_CHARACTER_UUID_STRING]; if ([characteristic.UUID isEqual:characteristicUUID]) { if (characteristic.isNotifying) { if (characteristic.properties == CBCharacteristicPropertyNotify) { NSLog(@"value ==== %@",characteristic.value); return; }else if(characteristic.properties == CBCharacteristicPropertyRead){ NSLog(@"value ==== %@",characteristic.value); [peripheral readValueForCharacteristic:characteristic]; } }else{ } } } - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { return; }else{ } NSLog(@"value = ========== %@",characteristic.value); if (characteristic.value){ NSString *value = [[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding]; }else{ NSLog(@""); } } //- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error //{ // NSLog(@"didUpdateValueForDescriptor"); // if (descriptor.characteristic) { // // [peripheral readValueForCharacteristic:descriptor.characteristic]; // NSLog(@"readValue == %@",descriptor.value); // // } // //} - (void)writeDataToUratWithKeyId:(UInt8)keyId moudleId:(UInt8)moudleId datavalue:(NSData *)dataValue { _dataValue = dataValue; _keyId = keyId; _moudleId = moudleId; NSLog(@"开始写入数据 =========keyid=%u ,moduleId = %hhu",keyId,moudleId); for (CBService *service in self.device.services) { for (CBCharacteristic *character in service.characteristics) { if ([[character.UUID UUIDString] isEqualToString:kBAIDU_HEALTH_BRACELET_UART_TX_CHARACTER_UUID_STRING]) { NSLog(@"forCharacteristic ====== %@",character); NSLog(@"=======senddata == %@",[self package]); [self.device writeValue:[self package] forCharacteristic:character type:CBCharacteristicWriteWithoutResponse]; }else{ } } } } - (NSData *)package { NSMutableData *header = [[NSMutableData alloc]initWithCapacity:16]; UInt16 magic = L_Magic; NSData *magicData = [NSData dataWithBytes:&magic length:sizeof(UInt16)]; [header appendData:magicData]; UInt16 length = L_Head_length; if (_dataValue) { length = [_dataValue length] + L_Head_length; NSData *lengthData = [NSData dataWithBytes:&length length:sizeof(UInt16)]; [header appendData:lengthData]; }else{ NSData *lengthData = [NSData dataWithBytes:&length length:sizeof(UInt16)]; [header appendData:lengthData]; } UInt8 packageType = L_PackageTypeSend; NSData *packageTypeData = [NSData dataWithBytes:&packageType length:sizeof(UInt8)]; [header appendData:packageTypeData]; UInt8 tversion = L_Version; NSData *vr = [NSData dataWithBytes:&tversion length:sizeof(UInt8)]; [header appendData:vr]; NSData *keyIdData = [NSData dataWithBytes:&_keyId length:sizeof(UInt8)]; [header appendData:keyIdData]; NSData *moudleData = [NSData dataWithBytes:&_moudleId length:sizeof(UInt8)]; [header appendData:moudleData]; if (_dataValue) { [header appendData:_dataValue]; } return header; } - (void)alertWithTitle:(NSString *)alertTitle Message:(NSString *)message certainActionString:(NSString *)certainActionString cancelActionString:(NSString *)cancelActionString { UIAlertController *alertCtr = [UIAlertController alertControllerWithTitle:alertTitle message:message preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *certainAction = [UIAlertAction actionWithTitle:certainActionString style:UIAlertActionStyleDefault handler:nil]; [alertCtr addAction:certainAction]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelActionString style:UIAlertActionStyleCancel handler:nil]; [alertCtr addAction:cancelAction]; UIViewController *ctr = [UIApplication sharedApplication].keyWindow.rootViewController; [ctr presentViewController:ctr animated:YES completion:nil]; } @end