zoukankan      html  css  js  c++  java
  • CoreBluetooth蓝牙4.0的封装

    随着智能家居的发展,蓝牙技术越发重要,尤其是蓝牙4.0.以下是我对蓝牙4.0的封装。

    使用时只需导入这个蓝牙类即可。

    DSBluetoothTool.h

    #import <Foundation/Foundation.h>
    #import <CoreBluetooth/CoreBluetooth.h>
    @protocol DSBluetoothToolDelegate <NSObject>
    @optional
    /*************扫描到蓝牙设备时调用**********************/
    - (void) peripheralFound:(CBPeripheral *)peripheral;
    /*************连接上设备时调用***********************/
    - (void) setConnect;
    /*************断开连接时调用***********************/
    - (void) setDisconnect;
    /*************出现低电量时调用************************/
    - (void) lowBattery;
    /*************读取设备版本号**************************/
    - (void) ballVersions:(NSString *)versions;
    /*************读取设备ID**************************/
    - (void) ID:(NSString *)str;
    @end
    @interface DSBluetoothTool : NSObject<CBCentralManagerDelegate,CBPeripheralDelegate>
    @property (nonatomic, strong)id<DSBluetoothToolDelegate>delegate;
    +(DSBluetoothTool *)shareBluetooth;
    /**
     *  扫描蓝牙
     */
    -(void)scanfBlueToothWith:(int)timeout;
    /**
     *  连接蓝牙设备
     *
     *  @param peripheral 扫描到的蓝牙设备
     */
    -(void)connect:(CBPeripheral *)peripheral;
    /**
     *  断开蓝牙
     *
     *  @param peripheral 需要断开的蓝牙设备
     */
    -(void)disconnect:(CBPeripheral *)peripheral;
    /**
     *  给设备发送指令
    */
    -(void) write:(CBPeripheral *)peripheral data:(NSString *)data;
    /**
     *  读取蓝牙设备广播信息
    */
    -(void) read:(CBPeripheral *)peripheral;
    /**
     *  设备通知
     */
    -(void) notify:(CBPeripheral *)peripheral on:(BOOL)on;
    
    
    @end

    DSBluetoothTool.m

    #import "DSBluetoothTool.h"
    #import "Commonds.h"
    
    @interface DSBluetoothTool()
    @property (nonatomic, strong)CBCentralManager *centeralManager;
    @property (nonatomic, strong)CBPeripheral *peripheral;
    @property (nonatomic, strong)CBCharacteristic *writeCharacter;
    
    @end
    @implementation DSBluetoothTool
    /**
     *  懒加载中心设备
     */
    -(CBCentralManager *)centeralManager{
        if (!_centeralManager) {
            _centeralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
        };
        return _centeralManager;
    }
    +(DSBluetoothTool *)shareBluetooth{
        static DSBluetoothTool *inst;
        if(inst == nil){
            inst  = [[DSBluetoothTool alloc] init];
            
        }
        return inst;
    }
    #pragma mark -- 扫描蓝牙设备
    -(void)scanfBlueToothWith:(int)timeout{
        if (self.centeralManager.state == CBCentralManagerStatePoweredOn) {
            [self.centeralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"0xFFF0"],[CBUUID UUIDWithString:@"0xFFE0"],[CBUUID UUIDWithString:@"0x18F0"]] options:0];
        }
        [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(stopScanfBluetooth:) userInfo:nil repeats:NO];
        
    }
    #pragma mark -- 停止扫描蓝牙
    -(void)stopScanfBluetooth:(NSTimer *)timer{
        [self.centeralManager stopScan];
        timer = nil;
    }
    #pragma mark -- 连接蓝牙
    -(void)connect:(CBPeripheral *)peripheral{
        
        if (peripheral.state == CBPeripheralStateDisconnected) {
            [self.centeralManager connectPeripheral:peripheral options:nil];
        }
        NSLog(@"%@",peripheral);
    }
    #pragma mark -- 断开蓝牙
    -(void)disconnect:(CBPeripheral *)peripheral{
        [self.centeralManager cancelPeripheralConnection:peripheral];
    }
    #pragma mark ---CBCentralManagerDelegate(扫描到蓝牙时调用)
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
        
        self.peripheral = peripheral;
        [self.delegate peripheralFound:self.peripheral];
        
    }
    #pragma mark --- 连接上设备时调用
    -(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
        self.peripheral = peripheral;
        self.peripheral.delegate = self;
        [self.peripheral discoverServices:nil];
        [self.delegate setConnect];
    }
    #pragma mark --- 发送命令
    -(void)write:(CBPeripheral *)peripheral data:(NSString *)data{
    
        [peripheral writeValue: [self convertHexStrToData:data]forCharacteristic:self.writeCharacter type:CBCharacteristicWriteWithoutResponse];
    }
    #pragma mark --- 发现服务时调用
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error{
        for (CBService *service in peripheral.services)
        {
            
            if ([service.UUID isEqual:[CBUUID UUIDWithString:SW20P_SERVICE_UUID]])
            {
                NSLog(@"发现20P的服务: %@", service.UUID);
                [peripheral discoverCharacteristics:nil forService:service];
                
                break;
            }
        }
    }
    #pragma mark -- 发现特征时调用
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error{
        for (CBCharacteristic *characteristic in service.characteristics)
        {
            if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:SW20P_CHAR_UUID]])
            {
                NSLog(@"发现20P的特征:%@ for service: %@", characteristic.UUID, service.UUID);
                
                self.writeCharacter = characteristic;//保存读的特征
                break;
            }
        }
    }
    //中新设备更新状态时调用
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
        
    }
    -(void) read:(CBPeripheral *)peripheral{
        
    }
    /**
     *  设备通知
     */
    -(void) notify:(CBPeripheral *)peripheral on:(BOOL)on{
        
    }
    #pragma mark -- 十六进制转换为NSData数据流
    - (NSData *)convertHexStrToData:(NSString *)str {
        if (!str || [str length] == 0) {
            return nil;
        }
        
        NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
        NSRange range;
        if ([str length] % 2 == 0) {
            range = NSMakeRange(0, 2);
        } else {
            range = NSMakeRange(0, 1);
        }
        for (NSInteger i = range.location; i < [str length]; i += 2) {
            unsigned int anInt;
            NSString *hexCharStr = [str substringWithRange:range];
            NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
            
            [scanner scanHexInt:&anInt];
            NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
            [hexData appendData:entity];
            
            range.location += range.length;
            range.length = 2;
        }
        
        
        return hexData;
    }
    
    @end

      

    源码连接地址:http://pan.baidu.com/s/1i4pHKDv

  • 相关阅读:
    Maven 环境的配置
    zTree的简单例子
    plsql免安装客户端的配置
    HDU 1232 畅通工程
    HDU 5698 瞬间移动
    Codeforces 1015E1 Stars Drawing (Easy Edition)
    Codeforces 784B Santa Claus and Keyboard Check
    Codeforces 500C New Year Book Reading
    NSarray 赋值 拷贝 等问题记录
    UINavigationController 操作记录
  • 原文地址:https://www.cnblogs.com/DLS520/p/5106670.html
Copyright © 2011-2022 走看看