iOS 蓝牙开发

iOS 蓝牙开发_第1张图片
042ec9e15de70b28500fa5b9e06883be.jpg

不想写太多字、所以就直接粘贴代码了
1、实现蓝牙单连接
2、实现蓝牙重连
3、实现蓝牙简单发送指令

这个Demo是16年写的了、最近才开始写的,所以就把这个分享给大家

//
//  MBBlueToothManager.m
//  MBDemo
//  Created by kcl on 16/12/28.
//  Copyright © 2016年 kcl. All rights reserved.
//

#import "MBBlueToothManager.h"


@interface MBBlueToothManager(){

   CBCentralManager *manager;
   CBUUID *identifiers;
   NSData *_dataValue;
   L2_command_id_t _keyId;
   UInt8 _moudleId;
   NSMutableArray *connectDevice;
}
@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)stopScan
{
   [manager stopScan];
}
- (void)tryToConnect:(CBPeripheral *)pairDevice
{
//   [manager stopScan];
   NSLog(@"开始连接设备:%@",pairDevice.name);
//   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
{
   CBManagerState 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) {

      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 *)advertisementData RSSI:(NSNumber *)RSSI
{
   MBDeviceModel *model = [[MBDeviceModel alloc] init];
   model.device = peripheral;

   NSString *macStr = [[NSString alloc] init];
   NSString *peripheralName = advertisementData[@"kCBAdvDataLocalName"];
   if (advertisementData[@"kCBAdvDataServiceUUIDs"]) {
      NSArray *array = advertisementData[@"kCBAdvDataServiceUUIDs"];
      if (array.count>=6) {
         NSMutableData *tData = [[NSMutableData alloc]initWithCapacity:6];
         CBUUID *uuid3 = array[5];
         NSData *data3 = uuid3.data;
         [tData appendData:data3];
         CBUUID *uuid2 = array[4];
         NSData *data2 = uuid2.data;
         [tData appendData:data2];
         CBUUID *uuid1 = array[3];
         NSData *data1 = uuid1.data;
         [tData appendData:data1];
         macStr = [tData macAddrString];
      }
   }
   model.deviceName = peripheralName;
   model.macString = macStr;

//   if ([peripheral.identifier.UUIDString isEqualToString:[[NSUserDefaults standardUserDefaults] stringForKey:DidConnectDeviceUUID]]) {
//      [manager connectPeripheral:peripheral options:nil];
//   }

   if ([peripheral.name containsString:@"MB12"]) {
      [[NSNotificationCenter defaultCenter] postNotificationName:kJRDUpdatePeripheralList object:model];

   }else{
      
   }

}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
   [manager stopScan];
   NSLog(@"didConnectPeripheral = %@",peripheral.name);
   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.name);
   [[NSNotificationCenter defaultCenter] postNotificationName:kBHBLEUartDeviceConnectFailNotification object:nil];
}
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
   NSLog(@"didDisconnectPeripheral = %@",peripheral.name);
}


#pragma mark - CBPeripheralDelegate
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
   NSLog(@"deviceName = %@ ,didDiscoverServices = %@",peripheral.name,peripheral.services);
   for(CBService *svc in peripheral.services )
   {
      [peripheral discoverCharacteristics:nil forService:svc];
   }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
   NSLog(@"deviceName = %@ ,didDiscoverCharacteristicsForService = %@",peripheral.name,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

  • 代码里面我一般不会写注释、因为这是我自己写的我能看得懂。

使用这一套可以完成蓝牙简单的需求、有不懂的可以问我、大家一起交流

你可能感兴趣的:(iOS 蓝牙开发)