最新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

 

 

posted @ 2017-05-04 17:34  独步武林  阅读(410)  评论(0编辑  收藏  举报