美文网首页
iOS 蓝牙开发

iOS 蓝牙开发

作者: 獨荹儛臨 | 来源:发表于2018-01-29 15:37 被阅读9次
    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()<CBPeripheralDelegate,CBCentralManagerDelegate>{
    
       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<NSString *,id> *)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 蓝牙开发

          本文链接:https://www.haomeiwen.com/subject/xygxzxtx.html